转载请注明出处
一、实验程序
%% 生成10个结点20条边的无向连通图
function [pic] = getliantong10_20
n = 10;
m = 20;
[ST,~]=graphminspantree(sparse(ones(n)),'Method','Kruskal');
st=full(ST);
s = m - sum(sum(st));
li(1:11)=1;
li(12:36)=0;
ni = randperm(length(li));
list=li(ni);
j=1;
for i = 2:n
for k = 1:i-1
if st(i,k)==0
st(i,k)=list(j);
j=j+1;
end
end
end
pic = max(st,st');
% view(biograph(tril(pic),[],'ShowArrows','off'));
pic(pic==0)=inf;
pic(logical(eye(n))) = 0;%对角线上为0
end
function [ex,U] = f_path(W)
% W 表示权值矩阵
% ex为该图的直径
% U为图中每两点之间的最短路径
% 初始化
n = length(W); % 几个点
U = W; % 初始化最短距离矩阵
m = 1; % 初始化更新点
% 更新最短距离矩阵的值
while m<=n % 遍历完所有点后停止
for i = 1:n
for j = 1:n
if U(i,j)>U(i,m)+U(m,j)
U(i,j) = U(i,m) + U(m,j); % 更新dij
end
end
end
m = m + 1;
end
ex = max(max(U));
end
二、实验结果
clc,clear
min = inf;
pic_final = ones(10);
% 遍历1000次
for i = 1:1000
[pic] = getliantong10_20;
[ex,~] = f_path(pic);
if ex < min
min = ex;
pic_final = pic;
end
end
[ex,U] = f_path(pic_final) % 得到最终图的直径和每两点之间的最短距离
pic_final(pic_final==inf)=0;
view(biograph(tril(pic_final),[],'ShowArrows','off')); % 画出想得到的图