最短路线--dijkstra方法

本文详细介绍了Dijkstra算法在图论中的应用,通过实例演示如何使用Matlab实现从六个城市间的最短航线搜索。涵盖了最短路线、最小生成树、网络流问题等内容,并重点讲解了如何用Dijkstra算法求解最短路径,包括初始化、更新步骤和Matlab代码实现。
摘要由CSDN通过智能技术生成

图与网络模型及方法

1.最短路线问题
2.最小生成树问题
3.网络最大流问题
4.最小费用最大流问题
5.Matlab的图论工具箱
6.旅行商(TSP)问题
7.计划审评方法和关键路线法
8.钢管订购和运输


提示:这篇文章将解决最短路径,使用matlab作为编程语言,使用Dijkstra算法


Dijkstra算法:


1.初始时, S只包含起点s;U包含除s之外的其他顶点,且U中顶点的距离为“起点s到该顶点的距离”【例如:U中顶点v的距离为(s, v)的长度,然后s和v不相邻,则v的距离为∞】。
2.从U中选出“距离最短的顶点k”,并将顶点k加入到S中;同时,从U中移除顶点k。
3.更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其他顶点的距离;例如,(s, v)的距离可能大于(s, k)+(k, v)的距离。
4.重复步骤2和3,直到遍历完所有顶点。


提示:以下是本篇文章正文内容,下面案例可供参考

一、例题


某公司在六个城市c1,c2,…,c6,从ci到cj的直接航程的票价记在下列的矩阵的(i,j)位置上(∞表示无直接航班)。请帮助该公司设计一张c1到其他城市的最便宜的路线。

在这里插入图片描述

二、解决步骤

1.分析

1.初始化矩阵,将信息先输入进去
2.建立一个P表示已经遍历过的点(即已经是最短路径的点)
3.建一个index(i)记录最短路径的上一个点
4.建一个d(i)记录始点到第i顶点的最短路径

2.题目的具体代码

代码如下(示例):

%将矩阵初始化
a = zeros(6);
a(1,2) = 50;a(1,4) = 40;a(1,5) = 25;a(1,6) = 10;
a(2,3) = 15;a(2,4) = 20;a(2,6) = 25;
a(3,4) = 10;a(3,5) = 20;
a(4,5) = 10;a(4,6) = 25;
a(5,6) = 55;
a = a + a';
a(a == 0) = inf;
p(1:length(a))=0;p(1) =1;index1 = 1;index2 = ones(1,length(a));
d(1:length(a)) = inf ;d(1) = 0;
temp = 1;

%开始循环,寻找

while sum(p) < length(a)%当不是所有点都被标记
    %关于find()函数
    tb = find(p == 0);%找到所有未成P标的下标
    d(tb) = min(d(tb),d(temp)+ a(temp,tb)); % 所有未标记的点取min中两者的最小值
    tmpb = find(d(tb) == min(d(tb)));
    temp = tb(tmpb(1));
    p(temp) = 1;
    index2(temp) = index1;
    index1 = temp;
end
d,index2
    

3.Dijkstra算法代码

function [mydistance,mypath]=mydijkstra(a,sb,db);
% 输入:a—邻接矩阵,a(i,j)是指i到j之间的距离,可以是有向的
% sb—起点的标号, db—终点的标号
% 输出:mydistance—最短路的距离, mypath—最短路的路径
n=size(a,1); visited(1:n) = 0;
distance(1:n) = inf; distance(sb) = 0; %起点到各顶点距离的初始化
visited(sb)=1; u=sb;  %u为最新的P标号顶点
parent(1:n) = 0; %前驱顶点的初始化
for i = 1: n-1
     id=find(visited==0); %查找未标号的顶点
     for v = id           
         if  a(u, v) + distance(u) < distance(v)
             distance(v) = distance(u) + a(u, v);  %修改标号值 
             parent(v) = u;                                    
         end            
     end
     temp=distance;
     temp(visited==1)=inf;  %已标号点的距离换成无穷
     [t, u] = min(temp);  %找标号值最小的顶点 
     visited(u) = 1;       %标记已经标号的顶点
 end
mypath = [];
if parent(db) ~= 0   %如果存在路!
    t = db; mypath = [db];
    while t ~= sb
        p = parent(t);
        mypath = [p mypath];
        t = p;      
    end
end
mydistance = distance(db);


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,利用dijkstra算法求最小值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值