路径寻优

f09fadc29eb6e5731dc307000935db12.png

9969de9d62c950b6e3a6c2c1aef4b291.png

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

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

19e31310a169fdf9db8a3731a3ea8cd1.png为从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)具体计算方法为:

a71ee17e939167f0f23cac68cae30510.png

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

31871a088e43eb2cc7600931cf3ba247.png

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

2ad06df34085c3bde8c79bd29c0c6032.png

    得出最短路径为f1(m1)=13:d8719855769d7b40a7abaa5a52cc0fb4.png

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

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

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

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;

往期回顾>>>>>>

欢迎各路英雄豪杰来搞

图论与渡河问题

图论碎碎念(2.3)

图论碎碎念(2.2)

图论碎碎念(2.1)

互动专区

matlab爱好者公众号中,回复“QQ”加入公众号专属Q群;回复“原创”获取小编原创代码;回复“星球”加入资源分享园地知识星球。

如需转载,请在公众号中回复“转载”获取授权,未经授权擅自搬运抄袭的,必将追究其责任!

多目标优化问题一直是科学和工程研究领域的一个难题和热点问题,在遗传算法应用到这一领域以前,已经产生了许多经典的方法,经典方法在处理大维数、多模态等复杂问题上存在不足。多目标遗传算法具有处理大的问题空间的能力在依次进化过程中可以得到多个可行解,对问题域的先验知识没有要求,对函数定义域的凸性不敏感,这正是经典算法不具备的。所以,应用遗传算法求解多目标问题,是这一领域的发展趋势。 路径问题是网络设计中遇到的最常见的问题之一,寻找指定两点间总长度最短或费用最低的路径。经典的Dijkstra算法能够精确的求出两点间的最短路径,但是经典的Dijkstra算法存在着占用时间、空间消耗过大的缺点。利用遗传算法求解路径问题可以减少算法对时间、空间的消耗。 利用遗传算法求解多目标路径寻优要考虑两个方面的问题。1.在多目标优化过程中,如何给出确保遗传算法进化的选择压力;2在路径问题中,如何对路径进行遗传操作。 本文对遗传算法及其面向多目标优化问题和路径寻优问题的基础理论和基本方法进行了阐述,提出了自己的方法,并进行了实验分析,主要内容如下: 1.介绍了遗传算法的基本理论、方法和一般流程,遗传多目标优化的现状。 2.利用遗传算法对路径进行遗传操作进行寻优,并利用改进的Dijkstra算法进行验证。 3.在遗传算法多目标优化中权重和原有产生权的方法的基础上对权重的给出进行了改进。以此对多目标路径进行寻优
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值