动态规划
简介
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20 世纪 50 年代初 R. E. Bellman 等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优性原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法—动态规划。1957 年出版了他的名著《Dynamic Programming》,这是该领域的第一本著作。
![](https://img2020.cnblogs.com/blog/1921103/202101/1921103-20210122231144378-1029943383.png)
实例:
对于最短路线问题(shortest Path Problem),阶段按过程的演变划分,状
态由各段的初始位置确定,决策为从各个状态出发的走向,即有 xk +1 = uk (xk ) ,阶段
指标为相邻两段状态间的距离dk (xk ,uk (xk )) ,指标函数为阶段指标之和,最优值函数
f k (xk ) 是由 xk 出发到终点的最短距离(或最小费用),基本方程为
![](https://img2020.cnblogs.com/blog/1921103/202101/1921103-20210122221436676-735554338.png)
下图为最短路线图:
![](https://img2020.cnblogs.com/blog/1921103/202101/1921103-20210122222629404-471392144.png)
请看图1,可以发现,A只和Bi相邻,Bi只和Ci相邻,...,依此类推。这样,我们可以将原问题的解决过程划分为4个阶段,设S1={A},S2={B1,B2},S3={C1,C2,C3,C4},S4={D1,D2,D3},Disabilityk(u)表示从Sk中的点u到E的最短距离,
显然可以递推地求出Dis1(A),也就是从A到E的最短距离。这种算法的复杂度为O(n),因为所有的状态总数(节点总数)为n,对每个状态都只要遍历一次,而且程序很简洁。
动态规划算法:
伪代码:
---------------------------------------------------------------------------
procedure DynamicProgramming
begin
Dis5 [E]:=0;
for i:=4 downto 1 do
for each Sk
begin
Disk [u]:=inf;
for each Sk+1 do
if Disk [u]>w(u,v)+Disk+1[v] then Disk[u]:=w(u,v)+Disk+1[v];
end
输出Dis1[a]
end
-----------------------------------------------------------------------------
代码:
w=zeros(10,10); w(1,2)=5;w(1,3)=3;w(2,4)=1;w(2,5)=3;w(2,6)=6; w(3,3)=0;w(3,5)=8;w(3,6)=7;w(4,7)=6;w(4,8)=8;w(5,7)=3;w(5,8)=5; w(5,9)=4;w(6,8)=8;w(6,9)=4;w(7,10)=4;w(8,10)=3;w(9,10)=3; w(find(w==0))=inf; s=[1 0 0;2 3 0;4 5 6; 7 8 9;10 0 0]; % 初始化距离矩阵 Dis=zeros(5,10); for k=[4,3,2,1] for u=s(k,:) if u>0 Dis(k,u)=inf; for v=s(k+1,:) if v>0 if Dis(k,u)>w(u,v)+Dis(k+1,v) Dis(k,u)=w(u,v)+Dis(k+1,v); end end end end end end Dis(1,:)
结果:
动态算法为递推过程,在第一行中为最短距离,为15。
递归算法:
函数:
function minn=MinDistance(v,visited,w) %UNTITLED2 此处显示有关此函数的摘要 % 此处显示详细说明 visited2=zeros(1,10); minn=100; if v==10 minn=0; else tb=find(visited==0); for i=tb visited(i)=1; visited2=visited; t=w(v,i)+MinDistance(i,visited2,w); if t<minn minn=t; end end end end
主代码部分:
w=zeros(10,10); w(1,2)=5;w(1,3)=3;w(2,4)=1;w(2,5)=3;w(2,6)=6; w(3,3)=0;w(3,5)=8;w(3,6)=7;w(4,7)=6;w(4,8)=8;w(5,7)=3;w(5,8)=5; w(5,9)=4;w(6,8)=8;w(6,9)=4;w(7,10)=4;w(8,10)=3;w(9,10)=3;w=w+w';w(find(w==0))=inf; visited=zeros(1,10); visited(1)=1; MinDistance(1,visited,w)