【建模算法】动态规划与最优路径问题(matlab求解)

【建模算法】动态规划与最优路径问题(matlab求解)

最短路径问题手工求解

可用倒序求解:
在这里插入图片描述

存在的问题:繁琐、易出错、难以求解大规模问题

图的矩阵表示方法

图是由节点和边构成的。边是连接两个节点的直接路径。如果边是有向的,则图称为有向图,否则称为无向图。

在计算机中,图用矩阵表示,即邻接矩阵。MATLAB语言支持邻接矩阵的稀疏矩阵表示方法。

邻接矩阵表示

构造邻接矩阵的稀疏矩阵函数调用格式:
在这里插入图片描述
其中,a i _i i 为起始节点向量, b i b_i bi 为终止节点向量, w i w_i wi为边权值向量,这里i=1,2,…,m

各个向量最后的一个值使得邻接矩阵为方阵。

有向图的路径寻优

例:有向图的矩阵描述
在这里插入图片描述
在这里插入图片描述
建立邻接矩阵并显示图

代码:

ab=[1 1 2 2 3 3 4 4 4 4 5 6 6 7 8]; 
bb=[2 3 5 4 4 6 5 7 8 6 7 8 9 9 9];
w=[1 2 12 6 3 4 4 15 7 2 7 7 15 3 10]; 
R=sparse(ab,bb,w); R(9,9)=0;
h=view(biograph(R,[],'ShowWeights','on'))

在这里插入图片描述

搜索最短路径

代码:

[d,p]=graphshortestpath(R,1,9)
set(h.Nodes(p),'Color',[1 0.4 0.4])
edges=getedgesbynodeid(h,get(h.Nodes(p),'ID'));
set(edges,'LineColor',[1 0 0])

在这里插入图片描述

d =
    19
p =
     1     3     4     5     7     9

即:节点1到达节点9的最短路径权值为19,路径:1->3->4->5->7->9

无向图的路径最优搜索

无向图的邻接矩阵的构造方法:

先按照有向图的方式构造邻接矩阵 R

无向图的邻接矩阵为:
在这里插入图片描述

如果无向图中,某些边是有向的,则手工修改该矩阵。若由节点 ij 与由节点 ji 的边权值是不同的,用手工方法重新定义和修改。

Dijstra算法

利用Dijstra算法,我们编写了一个求任意两点最短路径的函数:

function [d,path]=dijkstra(W,s,t)    
%Dijkstra搜索算法
%输入参数:W为邻接矩阵,s为起点,t为重点
%输出参数:d为最短路径权值,path为最短路径

[n,m]=size(W); ix=(W==0); W(ix)=Inf;  %将不通路径的权值统一设置为无穷大
if n~=m, error('Square W required'); end  %如果邻接矩阵不是方阵,给出错误信息
visited(1:n)=0; dist(1:n)=Inf; parent(1:n)=0; dist(s)=0; d=Inf; %设置各种标记
for i=1:(n-1),   %求出每个节点与起始节点的关系
   ix=(visited==0); vec(1:n)=Inf; vec(ix)=dist(ix); [a,u]=min(vec); visited(u)=1;
   for v=1:n, if (W(u,v)+dist(u)<dist(v)), dist(v)=dist(u)+W(u,v); parent(v)=u;
end; end; end
if parent(t)~=0, path=t; d=dist(t);  %回溯最短路径
   while t~=s, p=parent(t); path=[p path]; t=p; end
end

利用该函数求解,求解前述算例:

clear,clc;
ab=[1 1 2 2 3 3 4 4 4 4 5 6 6 7 8]; %起始节点向量
bb=[2 3 5 4 4 6 5 7 8 6 7 8 9 9 9]; %终止节点向量
w=[1 2 12 6 3 4 4 15 7 2 7 7 15 3 10];  %权值向量
R=sparse(ab,bb,w); R(9,9)=0; %邻接矩阵
W=ones(9);
[d,p]=dijkstra(R.*W,1,9)   %搜索从节点1到达节点9最优路径

结果:

d =
    19
p =
     1     3     4     5     7     9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值