【建模算法】动态规划与最优路径问题(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
无向图的邻接矩阵为:
如果无向图中,某些边是有向的,则手工修改该矩阵。若由节点 i 到 j 与由节点 j 到 i 的边权值是不同的,用手工方法重新定义和修改。
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