动态规划

 

简介

  动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20 世纪 50 年代初 R. E. Bellman 等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优性原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法—动态规划。1957 年出版了他的名著《Dynamic Programming》,这是该领域的第一本著作。
 

 

实例:

  对于最短路线问题(shortest Path Problem),阶段按过程的演变划分,状
态由各段的初始位置确定,决策为从各个状态出发的走向,即有 xk +1 = uk (xk ) ,阶段
指标为相邻两段状态间的距离dk (xk ,uk (xk )) ,指标函数为阶段指标之和,最优值函数
f k (xk ) 是由 xk 出发到终点的最短距离(或最小费用),基本方程为
 
下图为最短路线图:
 

 

 

请看图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 do

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)

 

 

posted @ 2021-01-22 23:14  为红颜  阅读(147)  评论(0编辑  收藏  举报