最短路径 matlab 动态规划

数模培训,遇到了上个暑假没有解决的动态规划,唉,看来出来混迟早得还:

如图,给定一个线路网络,两点之间连线上的数字表示两点之间的距离(或费用),试求一条由A到F的铺管线路,使总距离为最短(或总费用最少)。

matlab代码模板如下:

clc,clear
now=[3,5,4,0,0,0,0,0,0
    9,5,0,4,3,5,0,1,7
    1,5,0,8,4,6,4,4,2
    4,2,0,6,9,0,7,5,0
    1,0,0,2,0,0,0,0,0
    0,0,0,0,0,0,0,0,0];  %路程矩阵,第i行表示第i个阶段(最后一个阶段默认全为0);n*m列,n个起点,m种不同走法,隔m个数开始下一个起点
h=6 ;        %阶段数
a=3   ;      %起点数
b=3;         %决策数(决策数一般等于起点数)
%%只需修改上面的代码,就可以嵌套进其他的最短路径求解%%


now(now==0)=inf;    %先把他写成全矩阵,没有路的用00补充,之后吧0转换成无穷大
road_sum=zeros(h,a*b);   %保存每个阶段的最短路程长

for i=h-1:-1:1      %不同阶段
    for n=1:a       %不同阶段下的几个不同起点
        for k=1:b   %不同起点下的几个不同决策
            road_sum(i,(n-1)*a+k)=now(i,(n-1)*a+k)+min(road_sum(i+1,(k-1)*a+1:k*a));   %当前路径加上上个阶段下的最短路径
        end
    end
end

road=[];                %用来保存选择的起点
for i=1:h-1
    if i==1
        start=find(road_sum(1,:)==min(road_sum(1,:)));       %找到起点之后的第一个点
    else
        start=find(road_sum(i,(start-1)*a+1:start*a)==min(road_sum(i,(start-1)*a+1:start*a))) ;      %找到起点之后的第一个点
    end
    if length(start)>0
        disp('注意该问题存在多条最优解,已自动帮您规划了一条路径')
        start=start(1);
    end
    road=[road,start] ;  %保存
end

disp(['最短路径和为:' num2str(min(road_sum(1,:)))])
disp('其中一条对应的路径选择为:从起点出发,')
for i=road
    disp(['选下一个阶段的起点' num2str(i) ','])
end
    

该模板可以适用于无约束的最短路径这一类问题

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值