導航:首頁 > 源碼編譯 > 動態規劃matlab演算法

動態規劃matlab演算法

發布時間:2022-05-27 09:17:50

『壹』 在matlab中怎樣求矩陣中任意兩點間的距離呢

我們老師給的標准程序,我原封不動送給你吧,系統地講最短路問題的,要用在你的矩陣的情況的話記得把你裡面0全改成inf,耐心看吧,闡述得很完整了,絕對是個高效的演算法

Dijkstra演算法
Edser Dijkstra 是荷蘭計算機科學家,於1959年發表了Dijkstra演算法,時年29歲. 這演算法計算具有非負權的N階矩陣W的圖上從源點S(Source), S(1..N), 出發到達所有各點K, K=1..N, 的最短路。(Edward F. Moore 在1957年也得到類似的演算法).
演算法
1. 對每個點I指定一個離點S的距離初始值L(I). 在始點S的值為零, 即L(S)=0,其它點的值為Inf.
2. 所有的點標記為未走訪的. 置始點S為當前點C.
3. 對於當前點C, 考慮它的所有未走訪的相鄰點J, 並更新J的距離值為
L(J)=min(L(J), L(C)+W(C,J))
4. 把當前點C標記為走訪過的點. 走訪過的點C的距離L(C)就是點S到C的最短距離, 而且以後不再檢查走訪過得點了.
5. 如果所有的點都是走訪過的點, 完成. 不然, 把未走訪的點中具有最小距離值的點作為下一個當前點C, 轉步驟3.
編製程序的要求: 給定N階非負權矩陣W, W(I,J)是從點I到點J的距離, W(I,I)的值可以賦以任意值(比較方便的是賦以Inf). 如果只需求源點S(Source)到達指定的終點T(Target),給出最短路徑Z及其長度L(T); 如果不指定終點T時,Z是一個N維行向量,Z(K)表示S點到K點的最短路上K點的前一點, Z(S)=0, L是一個N維行向量, L(K)是S點到K點的最短距離. 如果不給出源點S及終點T, 則默認源點S=1, 按不指定終點的情況辦.
MATLAB函數子程序dijkstra.m為:
function [L,Z]=dijkstra(W,S,T)
%用 Dijkstra 演算法求最短路,W(I,J)是從點 I 到點 J 的距離, W(I,I)=0,I,J=1..n; 點 I 和點 J 無邊直接相連時,W(I,J)=inf.
% L表示從始點 S 到終點 T 的最短距離, Z 表示點 S 到 T 的一條最短路徑. 當不給出終點 T 時,L(J)表示從點 S 到點 J 的最短距離, J=1..n; Z(I)表示最短路徑上點 I 的前一點(父親點),
% 可由 Z 追溯最短路徑,當不給出起點 S 及終點 T 時默認 S = 1 及按不指定終點的情況辦.
if nargin<2 S=1;T=0; elseif nargin<3 T=0; end;%如只給出W, 默認始點 S=1;算出S到所有點的距離; 如沒給出終點, 算出S到所有點的距離;
N=length(W(:,1));%頂點數
L=Inf*ones(1,N);,L(S)=0;%L賦初值,在S點為0,其它點為Inf
C=S; %當前點為始點S
Q=1:N;% 未走訪的頂點集
Z=S*ones(1,N); Z(S)=0;% Z賦初值,因始點 S 無父親點,故把 S 點的Z值改為0
for K=1:N % 更新 L 和 Z 的循環
Q=setdiff(Q,C); %當前點 C 未走訪的點集
[L(Q),ind]=min([L(Q);L(C)+W(C,Q)]);%當前點C已走訪了所有的相鄰的未走訪的點,更新 L
Z(Q(find(ind==2)))=C; %更新Z, 至此C已是走訪過的點了
if T&C==T %若 C 點是終點 T, 不用再計算到其它未走訪的點的最短路
L=L(T); %最短路長;
road=T;%最短路徑終點;
while T~=S%追溯最短路徑上的點
T=Z(T); road=[road,T];
end
Z=road(length(road):-1:1); %顛倒次序;
return;
end;
[null, mC]=min(L(Q));
if null==Inf
disp('到值是Inf的點的路不通!'); Z(find(L==Inf))=nan; return;
else
C=Q(mC);% 把未走訪的點集Q中與始點距離最近的點作為新的當前點C;
end;end;
Dijkstra演算法的證明:
以下實質上是用動態規劃思想的證明.
記第 K 階段開始時考慮的當前點為C(K),則第 K 階段完成時確定的當前點為C(K+1),記集合P(K)={C(1),C(2),…,C(K)}, 記 Q(K)為 P(K) 的余集. 我們來證明對於每個點V∈P(K), L(V)是從源點S到點V點的最短路的長度, K=1..N.
證明:對 K 施行數學歸納法,當 K=1 時, P(1)={S}, V=S, L(V)=0, 命題真; 設對於K=M, M≥1, N≥M時命題真, 即當V∈P(M)時, L(V)是S到V的最短路的長度. 由於P(M+1)=P(M)∪{C(M+1)}, 所以只要證明 L(C(M+1))是點S到C(M+1)點的最短路的長度. 記 R:=C(1)..C(M+1) 是從 S=C(1) 到 C(M+1)的任意一條路, 記L(C(J);I)為在K=I階段, J>I時更新的L(C(J))的值. 則從 S 出發沿路 R 往 C(M+1)走時, 必存在第一條邊(C(I),C(J))使得C(I)∈P(M),C(J)∈Q(M). 由歸納假設, 這條路 R 的長度W(R)≥L(C(I))+W(C(I),C(J))+W(C(J)..C(M+1))
≥L(C(I))+W(C(I),C(J)).
按演算法,在第K=I階段完成時,L(C(I))+W(C(I),C(J))≥L(C(J);I). 因I≤M, 故L(C(J);I)≥L(C(J);M), 從而W(R)≥L(C(J);M). 由演算法, L(C(M+1))≤L(C(J);M); 故W(R)≥L(C(M+1)); 另外按演算法, 確有長度等於L(C(M+1))的一條路徑, 證畢.

『貳』 如何用Matlab編寫這個動態規劃的程序

一種比較好的辦法是在matlab的安裝目錄下新建一個文件夾,可命令為「我的函數」,把你的源文件放在這個文件夾中,然後把這個文件夾在添加為默認搜索路徑。
添加的方法是:
File->set
path..,然後選擇文件夾保存即可

『叄』 matlab的演算法有哪些急用!謝謝啊!

MATLAB 產品族可以用來進行以下各種工作:
● 數值分析
● 數值和符號計算
● 工程與科學繪圖
● 控制系統的設計與模擬
● 數字圖像處理 技術
● 數字信號處理 技術
● 通訊系統設計與模擬
● 財務與金融工程
MATLAB 的應用范圍非常廣,包括信號和圖像處理、通訊、控制系統設計、測試和測量、財務建模和分析以及計算生物學等眾多應用領域。附加的工具箱(單獨提供的專用 MATLAB 函數集)擴展了 MATLAB 環境,以解決這些應用領域內特定類型的問題。
matlab特點
●此高級語言可用於技術計算
●此開發環境可對代碼、文件和數據進行管理
●互動式工具可以按迭代的方式探查、設計及求解問題
●數學函數可用於線性代數、統計、傅立葉分析、篩選、優化以及數值積分等
●二維和三維圖形函數可用於可視化數據
●各種工具可用於構建自定義的圖形用戶界面
●各種函數可將基於MATLAB的演算法與外部應用程序和語言(如 C、C++、Fortran、Java、COM 以及 Microsoft Excel)集成
MATLAB的優勢
(1)友好的工作平台和編程環境
MATLAB由一系列工具組成。這些工具方便用戶使用MATLAB的函數和文件,其中許多工具採用的是圖形用戶界面。包括MATLAB桌面和命令窗口、歷史命令窗口、編輯器和調試器、路徑搜索和用於用戶瀏覽幫助、工作空間、文件的瀏覽器。隨著MATLAB的商業化以及軟體本身的不斷升級,MATLAB的用戶界面也越來越精緻,更加接近Windows的標准界面,人機交互性更強,操作更簡單。而且新版本的MATLAB提供了完整的聯機查詢、幫助系統,極大的方便了用戶的使用。簡單的編程環境提供了比較完備的調試系統,程序不必經過編譯就可以直接運行,而且能夠及時地報告出現的錯誤及進行出錯原因分析。
(2)簡單易用的程序語言
Matlab一個高級的矩陣/陣列語言,它包含控制語句、函數、數據結構、輸入和輸出和面向對象編程特點。用戶可以在命令窗口中將輸入語句與執行命令同步,也可以先編寫好一個較大的復雜的應用程序(M文件)後再一起運行。新版本的MATLAB語言是基於最為流行的C++語言基礎上的,因此語法特徵與C++語言極為相似,而且更加簡單,更加符合科技人員對數學表達式的書寫格式。使之更利於非計算機專業的科技人員使用。而且這種語言可移植性好、可拓展性極強,這也是MATLAB能夠深入到科學研究及工程計算各個領域的重要原因。
(3)強大的科學計算機數據處理能力
MATLAB是一個包含大量計算演算法的集合。其擁有600多個工程中要用到的數學運算函數,可以方便的實現用戶所需的各種計算功能。函數中所使用的演算法都是科研和工程計算中的最新研究成果,而前經過了各種優化和容錯處理。在通常情況下,可以用它來代替底層編程語言,如C和C++ 。在計算要求相同的情況下,使用MATLAB的編程工作量會大大減少。MATLAB的這些函數集包括從最簡單最基本的函數到諸如矩陣,特徵向量、快速傅立葉變換的復雜函數。函數所能解決的問題其大致包括矩陣運算和線性方程組的求解、微分方程及偏微分方程的組的求解、符號運算、傅立葉變換和數據的統計分析、工程中的優化問題、稀疏矩陣運算、復數的各種運算、三角函數和其他初等數學運算、多維數組操作以及建模動態模擬等。
(4)出色的圖形處理功能

圖形處理功能 MATLAB自產生之日起就具有方便的數據可視化功能,以將向量和矩陣用圖形表現出來,並且可以對圖形進行標注和列印。高層次的作圖包括二維和三維的可視化、圖象處理、動畫和表達式作圖。可用於科學計算和工程繪圖。新版本的MATLAB對整個圖形處理功能作了很大的改進和完善,使它不僅在一般數據可視化軟體都具有的功能(例如二維曲線和三維曲面的繪制和處理等)方面更加完善,而且對於一些其他軟體所沒有的功能(例如圖形的光照處理、色度處理以及四維數據的表現等),MATLAB同樣表現了出色的處理能力。同時對一些特殊的可視化要求,例如圖形對話等,MATLAB也有相應的功能函數,保證了用戶不同層次的要求。另外新版本的MATLAB還著重在圖形用戶界面(GUI)的製作上作了很大的改善,對這方面有特殊要求的用戶也可以得到滿足。
(5)應用廣泛的模塊集合工具箱
MATLAB對許多專門的領域都開發了功能強大的模塊集和工具箱。一般來說,它們都是由特定領域的專家開發的,用戶可以直接使用工具箱學習、應用和評估不同的方法而不需要自己編寫代碼。目前,MATLAB已經把工具箱延伸到了科學研究和工程應用的諸多領域,諸如數據採集、資料庫介面、概率統計、樣條擬合、優化演算法、偏微分方程求解、神經網路、小波分析、信號處理、圖像處理、系統辨識、控制系統設計、LMI控制、魯棒控制、模型預測、模糊邏輯、金融分析、地圖工具、非線性控制設計、實時快速原型及半物理模擬、嵌入式系統開發、定點模擬、DSP與通訊、電力系統模擬等,都在工具箱(Toolbox)家族中有了自己的一席之地。
(6)實用的程序介面和發布平台
新版本的MATLAB可以利用MATLAB編譯器和C/C++數學庫和圖形庫,將自己的MATLAB程序自動轉換為獨立於MATLAB運行的C和C++代碼。允許用戶編寫可以和MATLAB進行交互的C或C++語言程序。另外,MATLAB網頁服務程序還容許在Web應用中使用自己的MATLAB數學和圖形程序。MATLAB的一個重要特色就是具有一套程序擴展系統和一組稱之為工具箱的特殊應用子程序。工具箱是MATLAB函數的子程序庫,每一個工具箱都是為某一類學科專業和應用而定製的,主要包括信號處理、控制系統、神經網路、模糊邏輯、小波分析和系統模擬等方面的應用。
(7)應用軟體開發(包括用戶界面)
在開發環境中,使用戶更方便地控制多個文件和圖形窗口;在編程方面支持了函數嵌套,有條件中斷等;在圖形化方面,有了更強大的圖形標注和處理功能,包括對性對起連接注釋等;在輸入輸出方面,可以直接向Excel和HDF5進行連接。

『肆』 動態規劃的推法 謝謝

DP是把一個很大的有階段性有最佳答案問題分割成許多子問題,每個子問題有自己的最優情況(最優子結構),也就是說,每個動態規劃的問題都是有許多最有子結構接和起來的,而推法就是要分割出最有子結構
然後對這個小問題得出最優的答案,並由此推出全局的最優解

1.最優子結構性質;

設Q[i,j]表示第i顆珠子到第j顆珠子合並所產生的能量。顯然Q[1,n]表示的是合並產生的總的能量。給定一種標號方法,maxQ[1,n]就是所要求的。設最後一次合並在k處進行,則有Q[1,n]=Q[1,k]+Q[k+1,n]+top[1]*wei[k]*wei[n]。要Q[1,n]最大,必然要Q[1,k],Q[k+1,n]最大。
證明:假設Q[1,k]不是最大,則必然存在一Q'[1,k]>Q[1,k]。那麼就有Q'[1,n]=Q'[1,k]+Q[k+1,n]+top[1]*wei[k]*wei[n]>Q[1,k]。這與Q[1,n]的最優性矛盾

能量項鏈其實就是石子合並

演算法分析
競賽中多數選手都不約而同地採用了盡可能逼近目標的貪心法來逐次合並:從最上面
的一堆開始,沿順時針方向排成一個序列。 第一次選得分最小(最大)的相鄰兩堆合並,
形成新的一堆;接下來,在N-1堆中選得分最小(最大)的相鄰兩堆合並……,依次類推,
直至所有石子經N-1次合並後形成一堆。

例如有6堆石子,每堆石子數(從最上面一堆數起,順時針數)依次為3 46 5
4 2

(圖6.2-5)
要求選擇一種合並石子的方案,使得做5次合並,得分的總和最小。
按照貪心法,合並的過程如下:
每次合並得分
第一次合並 3 4 6 5 4 2 5
第二次合並 5 4 6 5 4 9
第三次合並 9 6 5 4 9
第四次合並 9 6 9 15
第五次合並 15 9 24
24
總得分=5+9+9+15+24=62

但是當我們仔細琢磨後,可得出另一個合並石子的方案:
每次合並得分
第一次合並 3 4 6 5 4 2 7
第二次合並 7 6 5 4 2 13
第三次合並 13 5 4 2 6
第四次合並 13 5 6 11
第五次合並 13 11 24
24
總得分=7+6+11+13+24=61
顯然,後者比貪心法得出的合並方案更優。 題目中的示例故意造成一個貪心法解題的
假像,誘使讀者進入「陷阱」。為了幫助讀者從這個「陷阱」里走出來, 我們先來明確一
個問題:

1.最佳合並過程符合最佳原理
使用貪心法至所以可能出錯, 是因為每一次選擇得分最小(最大)的相鄰兩堆合並,
不一定保證餘下的合並過程能導致最優解。聰明的讀者馬上會想到一種理想的假設:如果N
-1次合並的全局最優解包含了每一次合並的子問題的最優解,那麼經這樣的N-1次合並後
的得分總和必然是最優的。
例如上例中第五次合並石子數分別為13和11的相鄰兩堆。 這兩堆石頭分別由最初
的第1,2,3堆(石頭數分別為3,4,6)和第4,5,6堆(石頭數分別為5,4,
2)經4次合並後形成的。於是問題又歸結為如何使得這兩個子序列的N-2 次合並的得分
總和最優。為了實現這一目標,我們將第1個序列又一分為二:第1、2堆構成子序列1,
第3堆為子序列2。第一次合並子序列1中的兩堆,得分7; 第二次再將之與子序列2的
一堆合並,得分13。顯然對於第1個子序列來說,這樣的合並方案是最優的。同樣,我
們將第2個子序列也一分為二;第4堆為子序列1,第5,6堆構成子序列2。第三次合
並子序列2中的2堆,得分6;第四次再將之與子序列1中的一堆合並,得分13。顯然
對於第二個子序列來說,這樣的合並方案也是最優的。 由此得出一個結論——6堆石子經
過這樣的5次合並後,得分的總和最小。
我們把每一次合並劃分為階段,當前階段中計算出的得分和作為狀態, 如何在前一次
合並的基礎上定義一個能使目前得分總和最大的合並方案作為一次決策。很顯然,某階段
的狀態給定後,則以後各階段的決策不受這階段以前各段狀態的影響。 這種無後效性的性
質符最佳原理,因此可以用動態規劃的演算法求解。

2.動態規劃的方向和初值的設定
採用動態規劃求解的關鍵是確定所有石子堆子序列的最佳合並方案。 這些石子堆子序
列包括:
{第1堆、第2堆}、{第2堆、第3堆}、……、{第N堆、第1堆};
{第1堆、第2堆、第3堆}、{第2堆、第3堆、第4堆}、……、{第N堆、第1
堆、第2堆};
……
{第1堆、……、第N堆}{第1堆、……、第N堆、第1堆}……{第N堆、第1堆、
……、第N-1堆}

為了便於運算,我們用〔i,j〕表示一個從第i堆數起,順時針數j堆時的子序列
{第i堆、第i+1堆、……、第(i+j-1)mod n堆}
它的最佳合並方案包括兩個信息:
①在該子序列的各堆石子合並成一堆的過程中,各次合並得分的總和;
②形成最佳得分和的子序列1和子序列2。由於兩個子序列是相鄰的, 因此只需記住
子序列1的堆數;

f〔i,j〕——將子序列〔i,j〕中的j堆石子合並成一堆的最佳得分和;
c〔i,j〕——將〔i,j〕一分為二,其中子序列1的堆數;
(1≤i≤N,1≤j≤N)
顯然,對每一堆石子來說,它的
f〔i,1〕=0 c〔i,1〕=0 (1≤i≤N)
對於子序列〔i,j〕來說,若求最小得分總和,f〔i,j〕的初始值為∞; 若求最大得
分總和,f〔i,j〕的初始值為0。(1≤i≤N,2≤j≤N)。
規劃的方向是順推。先考慮含二堆石子的N個子序列(各子序列分別從第1堆、第2堆、
……、第N堆數起,順時針數2堆)的合並方案
f〔1,2〕,f〔2,2〕,……,f〔N,2〕
c〔1,2〕,c〔2,2〕,……,c〔N,2〕

然後考慮含三堆石子的N個子序列(各子序列分別從第1堆、第2堆、……、第N堆
數起,順時針數3堆)的合並方案
f〔1,3〕,f〔2,3〕,……,f〔N,3〕
c〔1,3〕,c〔2,3〕,……,c〔N,3〕
……

依次類推,直至考慮了含N堆石子的N個子序列(各子序列分別從第1堆、第2堆、 …
…、第N堆數起,順時針數N堆)的合並方案
f〔1,N〕,f〔2,N〕,……,f〔N,N〕
c〔1,N〕,c〔2,N〕,……,c〔N,N〕

最後,在子序列〔1,N〕,〔2,N〕,……,〔N,N〕中,選擇得分總和(f值)最
小(或最大)的一個子序列〔i,N〕(1≤i≤N),由此出發倒推合並過程。

3.動態規劃方程和倒推合並過程
對子序列〔i,j〕最後一次合並,其得分為第i堆數起,順時針數j堆的石子總數t。被
合並的兩堆石子是由子序列〔i,k〕和〔(i+k-1)modn+1,j-k〕(1≤k≤j-1)
經有限次合並形成的。為了求出最佳合並方案中的k值,我們定義一個動態規劃方程:
當求最大得分總和時
f〔i,j〕=max{f〔i,k〕+f〔x,j-k〕+t}
1≤k≤j-1
c〔i,j〕=k│ f〔i,j〕=f〔i,k〕+f〔x,j-k〕+t
(2≤j≤n,1≤i≤n)

當求最小得分總和時
f〔i,j〕=min{f〔i,k〕+f〔x,j-k〕+t}
1≤k≤j-1
c〔i,j〕=k│ f〔i,j〕=f〔i,k〕+f〔x,j-k〕+t
(2≤j≤n,1≤i≤n)
其中x=(i+k-1)modn+1,即第i堆數起,順時針數k+1堆的堆序號。

例如對(圖6.2-4)中的6堆石子,按動態規劃方程順推最小得分和。 依次得出含
二堆石子的6個子序列的合並方案
f〔1,2〕=7 f〔2,2〕=10 f〔3 ,2〕=11
c〔1,2〕=1 c〔2,2〕=1 c〔3,2〕=1
f〔4,2〕=9 f〔5,2〕=6 f〔6,2〕=5
c〔4,2〕=1 c〔5, 2〕=1 c〔6,2〕=1

含三堆石子的6個子序列的合並方案
f〔1,3〕=20 f〔2,3〕=25 f〔3,3〕=24
c〔1,3〕=2 c〔2,3〕=2 c〔3,3〕=1
f〔4,3〕=17 f〔5,3〕=14 f〔6,3〕=14
c〔4,3〕=1 c〔5,3〕=1 c〔6,3〕=2

含四堆石子的6個子序列的合並方案
f〔1,4〕=36 f〔2,4〕=38 f〔3,4〕=34
c〔1,4〕=2 c〔2,4〕=2 c〔3,4〕=1
f〔4,4〕=28 f〔5,4〕=26 f〔6,4〕=29
c〔4,4〕=1 c〔5,4〕=2 c〔6,4〕=3

含五堆石子的6個子序列的合並方案
f〔1,5〕=51 f〔2,5〕=48 f〔3,5〕=45
c〔1,5〕=3 c〔2,5〕=2 c〔3,5〕=2
f〔4,5〕=41 f〔5,5〕=43 f〔6,5〕=45
c〔4,5〕=2 c〔5,5〕=3 c〔6,5〕=3

含六堆石子的6個子序列的合並方案
f〔1,6〕=61 f〔2,6〕=62 f〔3,6〕=61
c〔1,6〕=3 c〔2,6〕=2 c〔3,6〕=2
f〔4,6〕=61 f〔5,6〕=61 f〔6,6〕=62
c〔4,6〕=3 c〔5,6〕=4 c〔6,6〕=3

f〔1,6〕是f〔1,6〕,f〔2,6〕,……f〔6,6〕中的最小值,表明最小
得分和是由序列〔1,6〕經5次合並得出的。我們從這個序列出發, 按下述方法倒推合
並過程:
由c〔1,6〕=3可知,第5次合並的兩堆石子分別由子序列〔1,3〕和子序列〔
4,3〕經4次合並後得出。其中
c〔1,3〕=2可知由子序列〔1,3〕合並成的一堆石子是由子序列〔1,2〕和
第三堆合並而來的。而c〔1,2〕=1,以表明了子序列〔1,2〕的合並方案是第1堆
合並第2堆。
由此倒推回去,得出第1,第2次合並的方案
每次合並得分
第一次合並 3 4 6…… 7
第二次合並 7 6…… 13
13……
子序列〔1,3〕經2次合並後合並成1堆, 2次合並的得分和=7+13=20。
c〔4,3〕=1,可知由子序列〔4,3〕合並成的一堆石子是由第4堆和子序列〔5,
2〕合並而來的。而c〔5,2〕=1,又表明了子序列〔5,2〕的合並方案是第5堆合
並第6堆。由此倒推回去,得出第3、第4次合並的方案
每次合並得分
第三次合並 ……54 2 6
第四次合並 ……5 6 11
……11
子序列〔4,3〕經2次合並後合並成1堆,2次合並的得分和=6+11=17。
第五次合並是將最後兩堆合並成1堆,該次合並的得分為24。
顯然,上述5次合並的得分總和為最小
20+17+24=61

上述倒推過程,可由一個print(〔子序列〕)的遞歸演算法描述
procere print (〔i,j〕)
begin
if j〈〉1 then {繼續倒推合並過程
begin
print(〔i,c〔i,j〕);{倒推子序列1的合並過程}
print(〔i+c〔i,j〕-1)mod n+1,j-c〔i,j〕)
{倒推子序列2的合並過程}
for K:=1 to N do{輸出當前被合並的兩堆石子}
if (第K堆石子未從圈內去除)
then begin
if(K=i)or(K=X)then置第K堆石子待合並標志
else第K堆石子未被合並;
end;{then}
第i堆石子數←第i堆石子數+第X堆石子數;
將第X堆石子從圈內去除;
end;{then}
end;{print}
例如,調用print(〔1,6〕)後的結果如下:
print(〔1,6〕)⑤

┌——————┴——————┐
│ │
print(〔1,3〕)② print(〔4,3〕)④
│ │
print(〔1,2〕)① ┌—————┴—————┐
│ │ │

┌—————┴—————┐ print(〔4,1〕) print(〔5,2〕)③
│ │ │
print(〔1,1〕) print(〔2,1〕) │
┌——————┴——————┐
│ │
print(〔5,1〕) print(〔6,1〕)
(圖6.2-5)
其中回溯至
① 顯示 3 46 5 4
② 顯示 7 65 4 2
③ 顯示 13 54 2
④ 顯示 135 6
⑤ 顯示 13 11
注:調用print過程後,應顯示6堆石子的總數作為第5次合並的得分

『伍』 求教:如何用Matlab編寫這個動態規劃的程序

建立數學模型設xi=1表示Ai被選中,xi=0表示Ai沒被選中。則數學模型是:max 1500x1+2000x2+1300x3+2300x4+2800x5s.t. x1+x2=1 x4+x5=1 x1+x4<=1 x2-x5=0 xi=0或1,i=1,2,3,4,5 2.編程求解matlab程序:f=[-1500-2000-1300-2300-2800];A=[10010];b=1;Aeq=[11000;00011;0100-1];beq=[1;1;0];x=bintprog(f,A,b,Aeq,beq)解出來是:x= 0 1 1 0 1也就是說運送A2,A3,A5

『陸』 如何用matlab解新技術的推廣模型

一年一度的全國數學建模大賽在今年的9 月22 日上午8 點拉開戰幕,各隊
將在3 天72 小時內對一個現實中的實際問題進行模型建立,求解和分析,確定
題目後,我們隊三人分頭行動,一人去圖書館查閱資料,一人在網上搜索相關信
息,一人建立模型,通過三人的努力,在前兩天中建立出兩個模型並編程求解,
經過艱苦的奮斗,終於在第三天完成了論文的寫作,在這三天里我感觸很深,現
將心得體會寫出,希望與大家交流。
1. 團隊精神:
團隊精神是數學建模是否取得好成績的最重要的因素,一隊三個人要相互支
持,相互鼓勵。切勿自己只管自己的一部分(數學好的只管建模,計算機好的只
管編程,寫作好的只管論文寫作),很多時候,一個人的思考是不全面的,只有
大家一起討論才有可能把問題搞清楚,因此無論做任何板塊,三個人要一起齊心
才行,只靠一個人的力量,要在三天之內寫出一篇高水平的文章幾乎是不可能的。
2. 有影響力的leader:
在比賽中,leader 是很重要的,他的作用就相當與計算機中的CPU,是全隊
的核心,如果一個隊的leader 不得力,往往影響一個隊的正常發揮,就拿選題來說,有人
想做A 題,有人想做B 題,如果爭論一天都未確定方案的話,可能就
沒有足夠時間完成一篇論文了,又比如,當隊中有人信心動搖時(特別是第三天,人可能
已經心力交瘁了),leader 應發揮其作用,讓整個隊伍重整信心,否則可能導致隊伍的前
功盡棄。
3. 合理的時間安排:
做任何事情,合理的時間安排非常重要,建模也是一樣,事先要做好一個規
劃,建模一共分十個板塊(摘要,問題提出,模型假設,問題分析,模型假設,
模型建立,模型求解,結果分析,模型的評價與推廣,參考文獻,附錄)。你每
天要做完哪幾個板塊事先要確定好,這樣做才會使自己游刃有餘,保證在規定時
間內完成論文,以避免由於時間上的不妥,以致於最後無法完成論文。
4. 正確的論文格式:
論文屬於科學性的文章,它有嚴格的書寫格式規范,因此一篇好的論文一定
要有正確的格式,就拿摘要來說吧,它要包括6 要素(問題,方法,模型,演算法,結論,特色)
,它是一篇論文的概括,摘要的好壞將決定你的論文是否吸引評委的目光,但聽閱卷老師
說,這次有些論文的摘要里出現了大量的圖表和程序,這都是不符合論文格式的,這種論
文也不會取得好成績,因此我們寫論文時要端正態度,注意書寫格式。
5. 論文的寫作:
我個人認為論文的寫作是至關重要的,其實大家最後的模型和結果都差不
多,為什麼有些隊可以送全國,有些隊可以拿省獎,而有些隊卻什麼都拿不到,
這關鍵在於論文的寫作上面。一篇好的論文首先讀上去便使人感到邏輯清晰,有
條例性,能打動評委;其次,論文在語言上的表述也很重要,要注意用詞的准確
性;另外,一篇好的論文應有閃光點,有自己的特色,有自己的想法和思考在里
面,總之,論文寫作的好壞將直接影響到成績的優劣。
6. 演算法的設計:演算法的設計的好壞將直接影響運算速度的快慢,建議大家多用數學軟體(
Mathematice,Matlab,Maple, Mathcad,Lindo,Lingo,SAS 等),這里提供十種數學
建模常用演算法,僅供參考:
1、 蒙特卡羅演算法(該演算法又稱隨機性模擬演算法,是通過計算機模擬來解決
問題的演算法,同時可以通過模擬可以來檢驗自己模型的正確性,是比賽時必
用的方法)
2、數據擬合、參數估計、插值等數據處理演算法(比賽中通常會遇到大量的數
據需要處理,而處理數據的關鍵就在於這些演算法,通常使用Matlab 作為工具)
3、線性規劃、整數規劃、多元規劃、二次規劃等規劃類問題(建模競賽大多
數問題屬於最優化問題,很多時候這些問題可以用數學規劃演算法來描述,通
常使用Lindo、Lingo 軟體實現)
4、圖論演算法(這類演算法可以分為很多種,包括最短路、網路流、二分圖等算
法,涉及到圖論的問題可以用這些方法解決,需要認真准備)
5、動態規劃、回溯搜索、分治演算法、分支定界等計算機演算法(這些演算法是算
法設計中比較常用的方法,很多場合可以用到競賽中)
6、最優化理論的三大非經典演算法:模擬退火法、神經網路、遺傳演算法(這些
問題是用來解決一些較困難的最優化問題的演算法,對於有些問題非常有幫助,
但是演算法的實現比較困難,需慎重使用)
7、網格演算法和窮舉法(網格演算法和窮舉法都是暴力搜索最優點的演算法,在很
多競賽題中有應用,當重點討論模型本身而輕視演算法的時候,可以使用這種
暴力方案,最好使用一些高級語言作為編程工具)
8、一些連續離散化方法(很多問題都是實際來的,數據可以是連續的,而計
算機只認的是離散的數據,因此將其離散化後進行差分代替微分、求和代替
積分等思想是非常重要的)
9、數值分析演算法(如果在比賽中採用高級語言進行編程的話,那一些數值分
析中常用的演算法比如方程組求解、矩陣運算、函數積分等演算法就需要額外編
寫庫函數進行調用)
10、圖象處理演算法(賽題中有一類問題與圖形有關,即使與圖形無關,論文
中也應該要不乏圖片的,這些圖形如何展示以及如何處理就是需要解決的問
題,通常使用Matlab 進行處理)
以上便是我這次參加這次數學建模競賽的一點心得體會,只當貽笑大方,不
過就數學建模本身而言,它是魅力無窮的,它能夠鍛煉和考查一個人的綜合素質,
也希望廣大同學能夠積極參與到這項活動當中來。

『柒』 在matlab里怎麼實現序列比對動態規劃演算法

這個我記不零清了,算算很簡單的,生物信息學課本上有詳細例題的。你到圖書館借個課本,對著做就好了,很好理解的。我學過挺久了,怕給你講錯了

『捌』 求貨郎擔問題的matlab演算法

貨郎擔問題有很多解法,模擬退火,遺傳演算法,動態規劃等。

基於matlab TSP問題遺傳演算法的實現
%TSP問題(又名:旅行商問題,貨郎擔問題)遺傳演算法通用matlab程序
%D是距離矩陣,n為種群個數,建議取為城市個數的1~2倍,
%C為停止代數,遺傳到第 C代時程序停止,C的具體取值視問題的規模和耗費的時間而定
%m為適應值歸一化淘汰加速指數 ,最好取為1,2,3,4 ,不宜太大
%alpha為淘汰保護指數,可取為0~1之間任意小數,取1時關閉保護功能,最好取為0.8~1.0
%R為最短路徑,Rlength為路徑長度
function [R,Rlength]=geneticTSP(D,n,C,m,alpha)

[N,NN]=size(D);
farm=zeros(n,N);%用於存儲種群
for i=1:n
farm(i,:)=randperm(N);%隨機生成初始種群
end
R=farm(1,:);%存儲最優種群
len=zeros(n,1);%存儲路徑長度
fitness=zeros(n,1);%存儲歸一化適應值
counter=0;

while counter<c

for i=1:n
len(i,1)=myLength(D,farm(i,:));%計算路徑長度
end
maxlen=max(len);
minlen=min(len);
fitness=fit(len,m,maxlen,minlen);%計算歸一化適應值
rr=find(len==minlen);
R=farm(rr(1,1),:);%更新最短路徑

FARM=farm;%優勝劣汰,nn記錄了復制的個數
nn=0;
for i=1:n
if fitness(i,1)>=alpha*rand
nn=nn+1;
FARM(nn,:)=farm(i,:);
end
end
FARM=FARM(1:nn,:);

[aa,bb]=size(FARM);%交叉和變異
while aa<n
if nn<=2
nnper=randperm(2);
else
nnper=randperm(nn);
end
A=FARM(nnper(1),:);
B=FARM(nnper(2),:);
[A,B]=intercross(A,B);
FARM=[FARM;A;B];
[aa,bb]=size(FARM);
end
if aa>n
FARM=FARM(1:n,:);%保持種群規模為n
end

farm=FARM;
clear FARM
counter=counter+1

end

Rlength=myLength(D,R);

function [a,b]=intercross(a,b)
L=length(a);
if L<=10%確定交叉寬度
W=1;
elseif ((L/10)-floor(L/10))>=rand&&L>10
W=ceil(L/10);
else
W

http://blog.renren.com/share/231644124/531791903

『玖』 matlab編程動態規劃最短路徑問題

以前搞建模在網上下到的代碼,不是自己編的,但經過試驗可以用,分享了:

function len=dijkstra(Input)
%最短路Dijkstra演算法,同時給出路徑,input為圖矩陣

row=size(Input,1);

%賦初值
% s_path=1;
distance=inf*ones(1,row);
distance(1)=0;
% flag(1)=1;
temp=1;

%求起點到各點的最短路的權
% s_path=ones(1,3);
while length(s_path)<row
pos=find(Input(temp, : )~=inf);
n=length(pos);
flag=ones(1,n);
for i=1:n
if (isempty(find(s_path==pos(i),1)))&&(distance(pos(i))>...
(distance(temp)+Input(temp,pos(i))))
distance(pos(i))=distance(temp)+Input(temp,pos(i));
flag(pos(i))=temp;
end
end
k=inf;
for i=1:row
if (isempty(find(s_path==i,1)))&&(k>distance(i))
k=distance(i);
temp_2=i;
end
end
s_path=[s_path,temp_2];
temp=temp_2;
end

%用追溯法得到起點到各點的最短路的路線
len=zeros(1,row);
for endpoint=1:row
path=0; %初始化
path(1)=endpoint;
i=1;
while path(i)~=1
path(i+1)=flag(path(i));
i=i+1;
end
path(i)=1;
path=path(end:-1:1); %最短路徑
short_distance=distance(endpoint); %最短路徑權
len(endpoint)=short_distance; %起點到各點的最短距離
pathall=path; %總路徑矩陣
end

len=len(25:end);

%{
disp('起點到各點的最短路徑:');
celldisp(pathall);
%設法只畫出最短路徑
em=find(w==inf);
w(em)=0;
h = view(biograph(w,[],'ShowWeights','on'));
%}
郵箱給你發了個資料,多年前搞的,估計是忘了,也許這個函數有點問題,你按資料里的做吧

『拾』 求一個動態規劃資源分配問題的MATLAB程序

最好說清楚是啥問題,看看能不能編程處理,請把要求貼出來看看。

閱讀全文

與動態規劃matlab演算法相關的資料

熱點內容
java解析網頁 瀏覽:836
2020廣西藝術分演算法 瀏覽:101
手機解壓文件大不能解壓 瀏覽:99
android獲取當前系統時間 瀏覽:324
蘋果電腦安卓版怎麼還原 瀏覽:612
javaftpjar 瀏覽:324
phpmysql自增id 瀏覽:920
仿抖音系統源碼建站 瀏覽:746
雲伺服器搭建sqlserver2008 瀏覽:950
如何查看伺服器安全組 瀏覽:429
雲伺服器會保存app記錄嗎 瀏覽:716
程序員身份證年齡 瀏覽:943
appstore如何注冊一個美國帳號 瀏覽:321
春筍公式源碼 瀏覽:497
蔚來app如何反饋 瀏覽:51
基礎生態學pdf 瀏覽:957
cp2012單片機 瀏覽:990
張曉謙程序員 瀏覽:115
取消應用加密忘記密碼 瀏覽:998
心熵pdf 瀏覽:809