end
%做n次迭代,每次迭代都更新D和path
for k=1:n
fori=1:n
for j=1:n
if D(i,k)+D(k,j) D(i,j)=D(i,k)+D(k,j); path(i,j)=path(i,k); end end end end 第二问源程序: clear;clc; %计算任意两社区间的最短路 a=input('输入带权邻接矩阵:'); [D,path]=floyd1(a); v=500/60;t=3;f=ones(1,24);A=zeros(24);b=ones(24,1); for j=1:24 fori=1:24 %判断派出所j能否在3分钟内赶到事发地i if D(i,j)<=v*t A(i,j)=1; end end end %求能覆盖所有社区的最少派出所数量 [x,fval]=bintprog(f,-A,-b) %求各派出所管辖社区编号 c=find(x~=0),h1=find(A(:,c(1))~=0), h2=find(A(:,c(2))~=0),h3=find(A(:,c(3))~=0) 第三问源程序: clear;clc; a=input('输入带权邻接矩阵:'); [D,path]=floyd1(a); length=size(D,1); %连续执行30次模拟退火算法 fori=1:30 R1=inf; %随机生成一个路线经过点的顺序 zhixu=randperm(length); f=juli(zhixu,D); tmax=120;tmin=0.001;down=0.95; t=tmax; %模拟退火开始,初始温度120,结束温度0.001,温度下降速率0.95 while t>tmin for n=1:500 newzhixu=zhixu; e=ceil(rand(1,2)*length); temp=newzhixu(e(1)); newzhixu(e(1))=newzhixu(e(2)); newzhixu(e(2))=temp; newf=juli(newzhixu,D); ifnewf zhixu=newzhixu;f=newf; elseif rand zhixu=newzhixu;f=newf; end end t=t*down; end %把本次模拟退火求出的近似最优哈密顿圈划分成三段 [L1,L2,L3,fval]=huafen(zhixu,D); %按最大最小化原则逐步筛选出更好的哈密顿圈 %并记录其经最佳三分法得到的三个子哈密顿圈 iffval(4) LL1=L1;LL2=L2;LL3=L3;ffval=fval; end end LL1,LL2,LL3,ffval 划分哈密顿圈的函数文件: function [L1,L2,L3,fval]=huafen(zhixu,D) %划分哈密顿圈 %L1,L2,L3分别为三个子圈 %fval记录三个子圈的权及其中的最大权值 i=find(zhixu==22); ifi~=1 nzhixu(1:25-i)=zhixu(i:24); nzhixu(26-i:24)=zhixu(1:i-1); zhixu=nzhixu;