www.gusucode.com > 《LINGO软件及应用》程序和数据 > 《LINGO软件及应用》程序和数据/12第12章/Lanli12_9_9.m
clc, clear xy0=xlsread('cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls',1,'B2:C583'); %读入第1个表单中的路口坐标数据 nj=xlsread('cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls',1,'E2:E583'); uv=xlsread('cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls',2,'A2:B929'); %读入第2个表单中的道路顶点编号 a=zeros(582); pt=xlsread('cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls',3,'B2:B81'); %读入第3个表单中平台位置标号 n=length(pt); %警力平台个数 for i=1:length(uv) a(uv(i,1),uv(i,2))=sqrt((xy0(uv(i,1),1)-xy0(uv(i,2),1))^2+(xy0(uv(i,1),2)-xy0(uv(i,2),2))^2)*0.1; end a=a+a'; %构造实对称的邻接矩阵 a=tril(a); a=sparse(a); b=graphallshortestpaths(a,'directed',0);%求所有节点对之间的最短距离; speed=60; sp=speed/60; fail=1; t=0; tic %计时开始 b32=b(32,:); %32号节点到其他所有节点的距离 while fail~=0; ptD=[];%记录负责围堵的平台 B=[]; numD=0; A=find(b32<(3+t)*sp), numA=length(A); %确定tmin无法封锁的节点集合A及个数 for i=1:numA indB1=find(uv(:,1)==A(i)); %求A中节点的相邻节点地址 indB2=find(uv(:,2)==A(i)); %求A中节点的相邻节点地址 B=[B,setdiff(uv(indB1,2)',A)]; %B集合为A集合的相邻节点构成的集合 B=[B,setdiff(uv(indB2,1)',A)]; end B=unique(B),numB=length(B); %去掉重复元素,并统计B中元素个数 for j=1:numB [tt,indT]=min(b(B(j),pt)/sp); %平台到该节点的最短时间 if tt<t numD=numD+1; ptD(numD)=pt(indT); %B(j)由平台pt(indT)负责围堵 %pt(indT)=[]; %删除该平台编号,以后不能使用 end end if numD==numB fail=0; else t=t+0.1; end end B,t %显示围堵的节点和时间 c32=b(32,B); %提出嫌疑犯出发点到围堵点之间的最短距离 d=b(B,pt); %提出围堵点与平台之间的最短距离 xlswrite('Ldata1295.xlsx',c32); xlswrite('Ldata1295.xlsx',d,1,'A3') %把矩阵d写入表单Sheet1中A3开始的单元格中