当前位置:文档之家› 动态规划求最短旅行路线

动态规划求最短旅行路线

动态规划求最短旅行路线摘要:在我们日常生活和旅行中经常遇到求最短路径的问题,将动态规划思想运用到求解旅行问题最短路径中,将过程划分为几个阶段,在每阶段中选取最优策略,最后将找到整个过程的总体优化目标即最短路径。

给出了动态规划方法的基本原理,尽力了动态规划数学模型,通过一个实际应用例子具体说明动态规划求解旅行问题最短路径过程,并总结出动态规划在此类问题中的优越性。

关键词:动态规划,最短路径,多阶段决策,Matlab一、预备知识1.基本理论1.1动态规划基本思想动态规划]1[是一种强有力的算法设计技术,它被广泛用于求解组合最优化问题。

这种方法是采用自底向上的方式递推求值,将待求解的问题分解成若干个子问题,先求解子问题,并把子问题的解存储起来以便以后用来计算所需要求的解。

总言之,动态规划的基本思想就是把全局的问题化为局部的问题,为了全局最优必须局部最优。

动态规划基本步骤:(1)找出最优解的性质,并刻划其结构特征;(2)递归的定义最优值;(3)以自底向上的方式计算出最优值;(4)根据计算最优值时的信息,构造最优解。

1.2多阶段决策过程分析多阶段决策]3[问题是根据问题本身的特点,将其求解的过程划分为若干个相互独立又相互联系的阶段,在每一个阶段都需要做出决策,并且在一个阶段的决策确定以后再转移到下一个近阶段,在每一阶段选取其最优决策,从而实现整个过程总体决策最优的目的。

适合用动态规划方法求解的问题是一类特殊的多阶段决策问题,具有“无后效性”的多阶段决策问题,一般具有以下特点:(1)可以划分成若干个阶段,问题的求解过程是对若干个阶段的一系列决策过程。

(2)每个阶段有若干个可能状态。

(3)一个决策将你从一个阶段的一种状态带到下一阶段的某钟状态。

(4)在任一阶段,最佳的决策序列和该阶段以前的决策无关。

(5)各阶段状态之间的转换有明确定义的费用,而且在选择最佳决策时有递推关系(即状态转移方程)。

二、动态规划求最短旅行路线2.1问题重述设某旅行者要从A点出发到终点B,他事先得到一张路线图如图1所示,各阶段距离如图上所标数值,旅行者沿着箭头方向行走总能到达B点。

试求出A 到B点两点间的最短旅行路线及距离。

图1:旅游路线图2.2问题模型建立(两种方法)2.2.1逆序递推法模型首先根据网络图建立数学模型,我们可以将旅行过程划分成六个阶段。

阶段便两用k 表示;状态变量s 。

表示k 阶段初可能的位置;决策k X 表示k 阶段初可能选择的路线;状态转移方程k k k x s s -=+1; 阶段指标k v 表示k 阶段与所选择的路段相应的路长; k f 表示第k 阶段点k s 到终点层的旅行费用;递推公式}min{1++=k k k f v f ,k=6,5,4,3,2,1; *k x 表示最优决策;边界条件k=7时,07=f 。

2.2.2 Dijkstra 算法模型求A 到B 点最短路,对于每个顶点,定义两个标记))(),((v z v l ,其中: )(v l :表从起点A 到v 的一条路的权。

)(v z :v 的父亲点,用以确定最短路的路线算法的过程就是在每一步改进这两个标记,使最终)(v l 为从顶点A 到B 的最短的权。

S :具有永久标号的顶点集输入:带权邻接矩阵),(v u w 。

2.3模型求解(两种解法)2.3.1逆序递推法逆序递推方程为:)}(),({min )(11+++=k k k k u k k s f u s d s f k k=6,5,4,3,2,1;0)(77=s f .整个计算过程分六个阶段,从最后一个阶段开始直到第一阶段结束,利用Matlab ]4[最后求得最短路径]2[。

最后求得:{}16},16m in{)(),(),(),(m in )(221==++=D f D A d C f C A d A f 于是从A 到B 的最短路线为:A->C->F->J->M->O->B ,其长度为16。

matlab 代码如下:a=[0 4 3 inf inf inf inf inf inf inf inf inf inf inf inf inf;... Inf 0 inf 5 4 inf inf inf inf inf inf inf inf inf inf inf;... Inf inf 0 inf 7 3 inf inf inf inf inf inf inf inf inf inf;... Inf inf inf 0 inf inf 2 1 inf inf inf inf inf inf inf inf;... Inf inf inf inf 0 inf inf 1 2 inf inf inf inf inf inf inf;... Inf inf inf inf inf 0 inf inf 7 4 inf inf inf inf inf inf;... Inf inf inf inf inf inf 0 inf inf inf 3 inf inf inf inf inf;... Inf inf inf inf inf inf inf 0 inf inf 3 4 inf inf inf inf;... Inf inf inf inf inf inf inf inf 0 inf inf 2 5 inf inf inf;... Inf inf inf inf inf inf inf inf inf 0 inf inf 2 inf inf inf;... Inf inf inf inf inf inf inf inf inf inf 0 inf inf 5 inf inf;... Inf inf inf inf inf inf inf inf inf inf inf 0 inf 2 8 inf;... Inf inf inf inf inf inf inf inf inf inf inf inf 0 inf 4 inf;... Inf inf inf inf inf inf inf inf inf inf inf inf inf 0 inf 2;... Inf inf inf inf inf inf inf inf inf inf inf inf inf inf 0 1;... Inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf 0]s11=a(11,14)+a(14,16);s12=min(a(12,14)+a(14,16),a(12,15)+a(15,16));s13=a(13,15)+a(15,16);s7=a(7,11)+s11;s8=min(a(8,11)+s11,a(8,12)+s12);s9=min(a(9,12)+s12,a(9,13)+s13);s10=a(10,13)+s13;s4=min(a(4,7)+s7,a(4,8)+s8);s5=min(a(5,8)+s8,a(5,9)+s9);s6=min(a(6,9)+s9,a(6,10)+s10);s2=min(a(2,4)+s4,a(2,5)+s5);s3=min(a(3,5)+s5,a(3,6)+s6);s1=min(a(1,2)+s2,a(1,3)+s3)程序运行结果:于是从A 到B 的最短路线为:A->C->F->J->M->O->B ,其长度为16。

2.3.2 Dijkstra 算法算法步骤:(1)赋初值:令 A 顶点为u 0,S ={u 0}, l u ()0=0,∀∈=v S VS \,令l v ()=Wu v (,)0,z v ()= u 0 u ←u 0(2)更新l v ()、z v (): ∀∈=v S VS \,若l v ()>lu W u v ()(,)+则令l v ()=lu W u v ()(,)+,z v ()= u(3)设v *是使l v ()取最小值的S 中的顶点,则令S=S ∪{v *},u ←v *(4)若S ≠φ,转2,否则,停止。

用上述算法求出的l v ()就是A 到其它顶点的最短路的权,从v 的父亲标记)(v z 追溯到A, 就得到A 到B 的最短路的路线。

Matlab代码如下:w=[0 4 3 inf inf inf inf inf inf inf inf inf inf inf inf inf;... Inf 0 inf 5 4 inf inf inf inf inf inf inf inf inf inf inf;...Inf inf 0 inf 7 3 inf inf inf inf inf inf inf inf inf inf;...Inf inf inf 0 inf inf 2 1 inf inf inf inf inf inf inf inf;...Inf inf inf inf 0 inf inf 1 2 inf inf inf inf inf inf inf;...Inf inf inf inf inf 0 inf inf 7 4 inf inf inf inf inf inf;...Inf inf inf inf inf inf 0 inf inf inf 3 inf inf inf inf inf;... Inf inf inf inf inf inf inf 0 inf inf 3 4 inf inf inf inf;...Inf inf inf inf inf inf inf inf 0 inf inf 2 5 inf inf inf;...Inf inf inf inf inf inf inf inf inf 0 inf inf 2 inf inf inf;... Inf inf inf inf inf inf inf inf inf inf 0 inf inf 5 inf inf;... Inf inf inf inf inf inf inf inf inf inf inf 0 inf 2 8 inf;...Inf inf inf inf inf inf inf inf inf inf inf inf 0 inf 4 inf;... Inf inf inf inf inf inf inf inf inf inf inf inf inf 0 inf 2;... Inf inf inf inf inf inf inf inf inf inf inf inf inf inf 0 1;... Inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf 0] n=size(w,1);w1=w(1,:);%赋初值for i=1:nl(i)=w1(i);z(i)=1;ends=[];s(1)=1;u=s(1);k=1lzwhile k<n% 更新 l(v) 和 z(v)for i=1:nfor j=1:kif i~=s(j)if l(i)>l(u)+w(u,i)l(i)=l(u)+w(u,i);z(i)=u;endendendendlz%求v*ll=l;for i=1:nfor j=1:kif i~=s(j)ll(i)=ll(i); elsell(i)=inf; endendendlv=inf;for i=1:nif ll(i)<lvlv=ll(i);v=i;endendlvvs(k+1)=vk=k+1u=s(k)endlz程序运行结果为:于是从A到B的最短路线为:A->C->F->J->M->O->B,其长度为16。

相关主题