- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
{ ui 1} 。
若 i
u Si
min{
.
图论
一.最短路问题
问题描述:寻找最短路径就是在指定网络中两结点间找一条距离最小的路。
最短路不仅仅指一般地理意义上的距离最短 ,还可以引申到其它的度量 ,如时间、费用、线路容量等。
将问题抽象为赋权有向图或无向图 G ,边上的权均非负
对每个顶点定义两个标记( l (v) , z(v) ),其中:
l (v) :表示从顶点到 v 的一条路的权
z(v) : v 的父亲点,用以确定最短路的路线
:具有永久标号的顶点集
1.1Dijkstra 算法:即在每一步改进这两个标记,使最终 l (v) 为最短路的权
输入: G 的带权邻接矩阵 w(u, v)
步骤:
(1) 赋初 值: 令 l (u0 ) 0 ,对 v u0 ,令
l (v) , S={u 0} , i 0 。
(2) 对每个 v Si (Si V Si ) (即不属于上
面 S 集合的点),用 min{ l (v), l (u)
u Si
顶点 u 和 v 之间边的权值。计算顶点记为 ui 1 ,令 Si 1 Si
(3)
w(uv)} 代替 l (v) ,这里 w(uv) 表示
l (v)} ,把达到这个最小值的一个
V 1,则停止;若 i V 1,则
用 i 1 代替 i ,转( 2)
算法结束时,从 u0 到各顶点 v 的距离由 v 的最后一次编号 l (v) 给出。在 v 进
入 Si 之前的编号 l (v) 叫 T 标号, v 进入 Si 之后的编号 l (v) 叫 P 标号。算法就是不断修改各顶点的 T 标号,直至获得 P 标号。若在算法运行过程中,将每
一顶点获得 P 标号所由来的边在图上标明,则算法结束时, u0 至各顶点的最短路也在图上标示出来了。
理解:贪心算法。选定初始点放在一个集合里, 此时权值为 0 初始点搜索下一个相连接点,将所有相连接的点中离初始点最近的点纳入初始点所在的集合,并更新权值。然后以新纳入的点为起点继续搜索,直到所有的点遍历。
..
.
Matlab 代码:
Dijk.m
function[mydistance,mypath]=Dijk(a,sb,db);%sb 为起点, db为终点
n=size(a,1);visited(1:n)=0;%n 为结点数 visited 为结点标号
distance(1:n)=inf;distance(sb)=0;% 起点到各终点距离的初始化
visited(sb)=1;u=sb;%u 为新的 P标号顶点(初始点)
parent(1:n)=0;% 父节点的初始化
%经过以下一个 for..end 便可以找到最短路径及该最短路径对应的最短路程
for i=1:n-1%( 找所有未标号的点 )
id=find(visited==0);% 查找未标号的顶点
for v=id % 找到一个未标号的点 v
if a(u,v)+distance(u)distance(v)%uv 之间的距离 +起点到 u的距离小于 v 到起点的
距离(第一次是无穷大的,所以第一次肯定满足,下一次则找比这个点到 u距离小的 v )
distance(v)=distance(u)+a(u,v);% 修改标号值 则 v到原点的距离(权)修改。
parent(v)=u; %u 是 v 的父节点
end
end
temp=distance;% 以上面的 distance 作为临时的最小距离,如果下一次循环的未标号顶点有
更小的距离则替换
temp(visited==1)=inf;% 已标号的点距离换为无穷,避免再次搜索
[t,u]=min(temp);% 找出距离最小的点 (t 是最小值, u是最小值的下标) 最后一次循环会
得到一个最小距离的点
visited(u)=1;% 标记已经标号的顶点
end
%下面一段代码用于输出 path
mypath=[];% 定义 mypath 为一个空矩阵
if parent(db)~=0% 如果存在路 ~= 为不等于即前面有 parent 点
t=db;% 终点标号赋给 t
mypath=[db]% 将终点放入路径集合里
while t~=sb% 当终点不是初始点
P = parent(t);% 终点的父节点令为 P
mypath=[P mypath];
t=P;% 把上一个点的父节点令为下一轮循环的节点,继续搜索父节点
end
end
mydistance=distance(db);% 最短路程
..
.
main.m
n=29; a=zeros(n);
a(1,2)=2;a(1,10)=2;a(1,13)=180;a(1,20)=216;a(1,27)=131;
a(2,3)=2;
a(3,4)=2;
a(4,5
文档评论(0)