首页/文章/ 详情

路径寻优:动态规划逆顺序算法的程序

3年前浏览2402

image.png

 过冷水诚挚邀请你加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载,群号:927550334

QQ图片20210424105303.png

图片

    如图所示两定点连线上的数字表示距离,确定一条从定点1到定点7的最短路径应该如何做?

    直观上有这么一个重要常识如果图片为最短路径,则

图片为从mi出发到m7的最短路线。这一特性即为最优性原理。根据最优性原理,寻找最短路径可以从最后一段开始,用由后向前逐步递推的方法,求出各点到m7点的最短路径,我们来看一下具体求算方法:

    由路线图可知mim7分三步走。用k表示步数(1 、2 、3):

当k=3,有三个出发点:m4、m5、m6,出发点到下个点的距离记做dk(mi,mj)。出发点到m7的最短距离记做:f3(m4)、f3(m5)、f3(m6),可知:f3(m4)=d3(m4,m7)、f3(m5)=d3(m5,m7)、f3(m6)=d3(m6,m7)值分别为f3(m4)=3,f3(m5)=5,f3(m6)=4;

当k=2,有二个出发点:m2m3,出发点到m7的最短路径f2(m2)、f2(m3)具体计算方法为:

图片

    分别从m2m3,出发的最短路径为:

图片

当k=1,有一个出发点:m1,f1(m1)的具体计算公式为:

图片

    得出最短路径为f1(m1)=13:图片

这是比较简单的路径优化问题,如果步数多一点,过冷水就不能做到这么直观的演示求解过程了,问题的解决思路就是这样,我们需要把它做到编程化。

出发点和目的点的选择,代码如下:

if x==1;

    x1=[2;3];

elseif x==2;

    x1=[4;5];

elseif x==3;

    x1=[4;5;6];

elseif (x==4)|(x==5)|(x==6)

    x1=7;

elseif x==7;

    x1=7;

出发点和目的点之间的距离,代码如下:

dxx1=[5;4;6;3;8;7;6;3;5;4];

xx1=[x==1&x1==2,x==1&x1==3,x==2&x1==4,x==2&x1==5,x==3&x1==4,x==3&x1==5,x==3&x1==6,x==4&x1==7,x==5&x1==7,x==6&x1==7];

v=xx1*dxx1;

    阶段和出发点之间的联系:k=4,x=7;k=3,x=[4,5,6];k=2,x=[2,3];k=1,x=[1];可以写成矩阵形式,代码如下:

x=NaN*ones(3,4);

x(1,1)=1;

x(1:2,2)=[2,3];

x(1:3,3)=(4:6)';

x(1,4)=7;

x

x =

     1     2     4     7

   NaN     3     5   NaN

   NaN   NaN     6   NaN

总的出发点和目的点之间的距离寻优代码如下:

clear all

%不同阶段对应的出发点

x=NaN*ones(3,3);

x(1,1)=1;x(1:2,2)=[2,3];x(1:3,3)=(4:6)';

v=cell(3,4);v{1,4}=0;v{2,4}=0;v{3,4}=0;%用于储存x,x1之间的距离的原包组,

w=zeros(3,4);%构建用于存储当前出发点到终点的最近距离的矩阵;

for n=1:3;

    k=4-n;%倒序阶段

    matx_point=x(:,k);

    x1=~isnan(matx_point);

    m=find(x1==1);

    d=matx_point(m);

    %判断当前出发点下可到达的下一个出发点

    for i=1:length(m);

        if d(m(i))==1;

            d1=[2;3];

        elseif d(m(i))==2;

            d1=[4;5];

        elseif d(m(i))==3;

            d1=[4;5;6];

        elseif (d(m(i))==4)|(d(m(i))==5)|(d(m(i))==6);

            d1=7;

        elseif d(m(i))==7;

            d1=7;

        end

        %计算当前出发点到一下出发点的距离

         distan=[5;4;6;3;8;7;6;3;5;4];

         dd1=[d(m(i))==1&d1==2,d(m(i))==1&d1==3,d(m(i))==2&d1==4,d(m(i))==2&d1==5,d(m(i))==3&d1==4,d(m(i))==3&d1==5,d(m(i))==3&d1==6,d(m(i))==4&d1==7,d(m(i))==5&d1==7,d(m(i))==6&d1==7];

         v{m(i),k}=dd1*distan;

         %当前出发点到终点的距离最近距离

         l=length(d1);

         for j=1:l;

             mind(j)=v{m(i),k}(j)  w(j,k 1);

         end

         w(i,k)=min(mind);

         [positioni,poxitionj]=find(min(mind)==mind);

        rout(i,k)=d1(poxitionj);

        clear mind;

    end

end

%最优路线距离

opt_distance=w(1,1)

%最优路线方案

rout(1,1);[u1,s1]=find(x==rout(1,1));

rout(u1,s1);[u2,s2]=find(x==rout(u1,s1));

rout(u2,s2);

opt_path=[1,rout(1,1),rout(u1,s1),rout(u2,s2)]

    该代码是根据理论叙述过冷水写出来的算法,参数设置和特定目标实现的方法和奇怪。还请大家见谅,动态规划实际是有比较成熟的算法代码的,可用的场合也比较广泛,在此过冷水给出用动态规划逆顺序算法的程序,后期会对程序进行分析讲解。对路径寻优感兴趣的可以和过冷水交流,深入理解路径寻优的问题。

路径寻优参考代码:

clear all

x=NaN*ones(3,4);

x(1,1)=1;

x(1:2,2)=[2,3];

x(1:3,3)=(4:6)';

x(1,4)=7;

x

[p,f]=dynprog(x,@DecisFun,@SubObjfun,@TransFun)%f:最优解;p:最优指标

dynprog.m

function [p_opt fval]=dynprog(x,DecisFun,SubObjFun,TransFun,ObjFun)

k=length(x(1,:));

x_isnan=~isnan(x);

t_vub=inf;

t_vubm=inf*ones(size(x));

f_opt=nan*ones(size(x));

d_opt=f_opt;

%计算终端

tmp1=find(x_isnan(:,k));

tmp2=length(tmp1);

for i=1:tmp2

    u=feval(DecisFun,k,x(i,k));

    tmp3=length(u);

    for j=1:tmp3;

        tmp=feval(SubObjFun,k,x(tmp1(i),k),u(j));

        if tmp<=t_vub;

            f_opt(i,k)=tmp;

            d_opt(i,k)=u(j);

            t_vub=tmp;

        end;

    end;

end;

for ii=k-1:-1:1;

    tmp10=find(x_isnan(:,ii));

    tmp20=length(tmp10);

    for i=1:tmp20;

        u=feval(DecisFun,ii,x(i,ii));

        tmp30=length(u);

        for j=1:tmp30;

            tmp00=feval(SubObjFun,ii,x(tmp10(i),ii),u(j));

            tmp40=feval(TransFun,ii,x(tmp10(i),ii),u(j));

            tmp50=x(:,ii 1)-tmp40;

            tmp60=find(tmp50==0);

            if~isempty(tmp60);

            if nargin<5,

                tmp00=tmp00 f_opt(tmp60(1),ii 1);

            else

                tmp00=feval(ObjFun,tmp00,f_opt(tmp60(1),ii 1));

            end

            if tmp00<=t_vubm(i,ii);

                f_opt(i,ii)=tmp00;

                d_opt(i,ii)=u(j);

                t_vubm(i,ii)=tmp00;

            end

            end

        end

    end

end

fval=f_opt(tmp1,1);

fval=fval(find(~isnan(fval)),1);

%记录最优决策、最优线性轨线和相应指标函数

p_opt=[];tmpx=[];tmpd=[];tmpf=[];

tmp0=find(x_isnan(:,1));

tmp01=length(tmp0);

for i=1:tmp01;

    tmpd(i)=d_opt(tmp0(i),1);

    tmpx(i)=x(tmp0(i),1);

    tmpf(i)=feval(SubObjFun,1,tmpx(i),tmpd(i));

    p_opt(k*(i-1) 1,[1,2,3,4])=[1,tmpx(i),tmpd(i),tmpf(i)];

    for ii=2:k;

        tmpx(i)=feval(TransFun,ii-1,tmpx(i),tmpd(i));

        tmp1=x(:,ii)-tmpx(i);

        tmp2=find(tmp1==0);

        if~isempty(tmp2);

            tmpd(i)=d_opt(tmp2(1),ii);

        end;

        tmpf(i)=feval(SubObjFun,ii, tmpx(i),tmpd(i));

        p_opt(k*(i-1) ii,[1,2,3,4])=[ii,tmpx(i),tmpd(i),tmpf(i)];

    end

end

DecisFun.m

function x1=DecisFun(k,x)

if x==1;

    x1=[2;3];

elseif x==2;

    x1=[4;5];

elseif x==3;

    x1=[4;5;6];

elseif (x==4)|(x==5)|(x==6)

    x1=7;

elseif x==7;

    x1=7;

end

DecisFun.m

function x1=DecisFun(k,x)

if x==1;

    x1=[2;3];

elseif x==2;

    x1=[4;5];

elseif x==3;

    x1=[4;5;6];

elseif (x==4)|(x==5)|(x==6)

    x1=7;

elseif x==7;

    x1=7;

end

SubObjfun.m

function x1=DecisFun(k,x)

if x==1;

    x1=[2;3];

elseif x==2;

    x1=[4;5];

elseif x==3;

    x1=[4;5;6];

elseif (x==4)|(x==5)|(x==6)

    x1=7;

elseif x==7;

    x1=7;

end

TransFun.m

function y=TransFun(k,x,x1)

y=x1;

图片

        过冷水发表于仿真秀 平台原创文章,未经授权禁止私自转载,如需转载请需要和作者沟通表明授权声明,未授权文章皆视为侵权行为,必将追责。如果您希望加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载均可加群:927550334。

精品回顾

matlab绘制农夫过河动态图

分子动力学的原子空间运动轨迹演示编程

过冷水带你用matlab制作演示动画

python批量移动文件&重命名代码分享

过冷水和你分享 matlab读取存储各种文件的方法 文末有独家金曲分享

image.png

科普理论代码&命令MATLAB
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-05-08
最近编辑:3年前
过冷水
博士 | 讲师 讨论号:927550334
获赞 358粉丝 180文章 107课程 11
点赞
收藏
作者推荐

¥5 5.0
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈