图(最短路径)(最小生成树)

pull/2/head
盘荣博 5 months ago
parent f5a4c8b16b
commit cb4ffe074c

@ -0,0 +1,94 @@
%ej.4.10仓库选址
clc; clear; close all; format long g;
a=zeros(6);
a(1,[2,5])=[20,15];
a(2,[1,3,4,5])=[20,20,60,25];
a(3,[2,4,5])=[20,30,18];
a(4,[2,3])=[60,30];
a(5,[1,2,3,6])=[15,25,18,15];
a(6,5)=15;
s = cellstr(strcat('销售点',int2str([1:6]')));
G=graph(a,s);
P = plot(G,'layout','force','EdgeColor','k','NodeFontSize',12);
D=[];
for i=1:6
temp=0;
for j=1:6
[path,d]=shortestpath(G,i,j);
if d>temp;
temp=d;
end
end
D=[D,temp];
end
[minVal,minInd]=min(D);
disp('仓库应建在销售点');
disp(minInd);
%答案版
clc; clear; close all;
% 初始化邻接矩阵
a = zeros(6);
a(1, [2, 5]) = [20, 15];
a(2, 3:5) = [20, 60, 25];
a(3, [4, 5]) = [30, 18];
a(5, 6) = 15;
% 创建节点标签
s = cellstr(strcat('V', int2str([1:6]')));
% 创建图
G = graph(a, s, 'upper');
% 计算所有节点之间的最短路径距离矩阵
d = distances(G);
% 计算从每个节点到其他节点的最大最短路径距离
D = max(d, [], 2)'; %第三个参数 2 指定沿着矩阵的第二个维度(即列)进行操作。
% 找到最大最短路径距离中的最小值及其下标
[minD, minIndex] = min(D);
% 绘制图
plot(G, 'EdgeLabel', G.Edges.Weight, 'Layout', 'force');%设置边的标签
% 显示结果
fprintf('从每个节点到任意其他节点的最大最短路径距离: \n');
disp(D);
fprintf('最大最短路径距离中的最小值为: %f\n', minD);
fprintf('对应的节点为: V%d\n', minIndex);
%设备更新问题;
clc;clear;close all;
a=zeros(6);
a(1,[2:6])=[15,20,27,37,54];
a(2,[3:6])=[15,20,27,37];
a(3,[4:6])=[16,21,28];
a(4,[5:6])=[16,21];
a(5,6)=17;
s=cellstr(strcat(int2str((1:6)'),'年初'));
G=digraph(a,s);
P = plot(G,'layout','force','EdgeColor','k','NodeFontSize',12);
[path,d]=shortestpath(G,1,6);%注意参数个数
highlight(P,path,"EdgeColor","red",'LineWidth',3.5);
%最小生成树
clc;clear;
a=zeros(9);
a(1,[2:9])=[2 1 3 4 4 2 5 4]; % 顶点1到其他顶点的边的权重
a(2,[3 9])=[4 1]; % 顶点2到顶点3、顶点9的边的权重
a(3,4)=1; % 同上。因为写过1到3和2到3的边的权重无需重复设
a(4,5)=1;
a(5,6)=5;
a(6,7)=2;
a(7,8)=3;
a(8,9)=5;
s=cellstr(strcat('节点',int2str([1:9]')));
G=graph(a,s,'upper');
P=plot(G,'layout','force');
T=minspantree(G,'Method','sparse');
L=sum(T.Edges.Weight);
highlight(P,T,"EdgeColor","red",'LineWidth',2.5);
Loading…
Cancel
Save