Matlab编程实现迪杰斯特拉算法Dijkstra算法

function[P,d] = fun_Dijkstra(G,start,End)
% 建立权重矩阵
% 判断是否存在权重矩阵,如果不存在,那么默认权重为1
[n,m] = size(G.Edges);x = length(unique(G.Edges.EndNodes));
W(1:x,1:x) = inf;W(logical(eye(size(W)))) = 0; % 初始化权重矩阵W,对角线赋值为0

if m ==1
    for i = 1:n
        W(G.Edges.EndNodes(i,1),G.Edges.EndNodes(i,2)) = 1; 
        
        try
            if class(G) == 'graph' % 如果为有向图,那么该权重矩阵为对称
                W(G.Edges.EndNodes(i,2),G.Edges.EndNodes(i,1)) = W(G.Edges.EndNodes(i,1),G.Edges.EndNodes(i,2));
            end
        end
    end
elseif m == 2
    for i = 1:n
        W(G.Edges.EndNodes(i,1),G.Edges.EndNodes(i,2)) = G.Edges.Weight(i);
        try
            if class(G) == 'graph' % 如果为有向图,那么该权重矩阵为对称
                W(G.Edges.EndNodes(i,2),G.Edges.EndNodes(i,1)) = W(G.Edges.EndNodes(i,1),G.Edges.EndNodes(i,2));
            end
        end
    end
end


% 建立距离矩阵Distend 父节点矩阵Parent 是否已访问矩阵Visit
% 初始化距离矩阵,默认初始距离为无穷,起始点距离为0
D(1,1:x) = inf;D(1,start) = 0;D_ = D; % D_为D的傀儡
% 初始化父节点矩阵为0
Parent = zeros(1,x);
% 初始化访问矩阵 为访问完成为0,访问完成为1
Visit = zeros(1,x);

% 计算起始点到每个点的最短距离
for i = 1:x
    [~,index] = min(D_);
    for j = 1:x
        if W(index,j) ~= inf && W(index,j) ~= 0 && Visit(j) == 0
            distent = W(index,j) + D(index);
            if distent < D(j)
                D(j) = distent;D_(j) = distent;
                Parent(j) = index; % 更新父节点
            end
        end     
    end
    Visit(index) = 1;D_(index) =inf; %这里把已访问过的节点距离设为inf方便之后查询D的最短路径时排除已访问过的节点
end
% 得到最短路径
d = D(End);
% 得到父节点们
% 初始化路径
P = [];
p = Parent(End);
for i = 1:x
    if any(P==start) == 0
        P(1,i) = p;
        p = Parent(p);
    end
end
P = fliplr(P);P(1,end+1) =End;
end
可以使用Matlab中的图论工具箱(Graph Theory Toolbox)来构建成本最小的航线网络。具体步骤如下: 1. 创建一个4个节点的图,每个节点表示一个城市,使用`graph`函数创建。 ``` G = graph([1 1 1 2 2 2 3 3 3 4 4 4], [2 3 4 1 3 4 1 2 4 1 2 3]); ``` 这里的第一个参数是起点,第二个参数是终点,表示每条边所连接的两个节点。 2. 将城市之间的航线成本添加到图中,使用`addedge`函数添加边权值。 ``` G.Edges.Weight = [730 821 1339 730 646 690 821 646 741 1339 690 741]; ``` 这里的`G.Edges.Weight`表示图中所有边的权值,按照节点的连接顺序依次设置。 3. 对于任意两个城市之间,如果它们之间没有直接相连的航线,则可以添加一条成本为20的边连接它们,使用`addedge`函数添加边。 ``` idx = find(~ismember(G.Edges.EndNodes, [1 2; 1 3; 1 4; 2 3; 2 4; 3 4], 'rows')); G = addedge(G, G.Edges.EndNodes(idx, 1), G.Edges.EndNodes(idx, 2), 20); ``` 这里的`ismember`函数用于判断两个节点之间是否已经存在边,如果不存在则返回`false`。`find`函数找到所有未连接的节点对,然后使用`addedge`函数添加边权值为20的边。 4. 使用最小生成树算法求得成本最小的航线网络,使用`minspantree`函数实现。 ``` T = minspantree(G); plot(T, 'LineWidth', 1.5, 'EdgeColor', [0.5 0.5 0.5], 'NodeColor', 'r', 'MarkerSize', 8); ``` 这里的`minspantree`函数返回一个最小生成树,即成本最小的航线网络。使用`plot`函数将其可视化。 完整代码如下: ``` G = graph([1 1 1 2 2 2 3 3 3 4 4 4], [2 3 4 1 3 4 1 2 4 1 2 3]); G.Edges.Weight = [730 821 1339 730 646 690 821 646 741 1339 690 741]; idx = find(~ismember(G.Edges.EndNodes, [1 2; 1 3; 1 4; 2 3; 2 4; 3 4], 'rows')); G = addedge(G, G.Edges.EndNodes(idx, 1), G.Edges.EndNodes(idx, 2), 20); T = minspantree(G); plot(T, 'LineWidth', 1.5, 'EdgeColor', [0.5 0.5 0.5], 'NodeColor', 'r', 'MarkerSize', 8); ``` 运行后可以得到成本最小的航线网络的可视化图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值