数学建模图论.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

zdq9873 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档