2011高教社杯全国大学生数学建模竞赛B题(题目改变)参考答案

参考文献

[1] 姜启元,《数学模型》第四版,北京:高等教育出版社,2011年

附录

Solution.m clc;

clear all;

A=xlsread('cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls','全市交通路口节点数据','b2:c583');

X=A(:,1); Y=A(:,2);

serve_plat=xlsread('cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls','全市交巡警平台','b2:b81');

city_out=xlsread('cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls','全市区出入口的位置','b2:b18');

road_start=xlsread('cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls','全市交通路口的路线','a2:a929');

road_end=xlsread('cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls','全市交通路口的路线','b2:b929');

name=xlsread('cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls','全市交巡警平台','a2:a81');

plat_location=A(serve_plat,:); city_out_location=A(city_out,:);

plot(city_out_location(:,1),city_out_location(:,2),'*',plat_location(:,1),plat_location(:,2),'r+');

legend('全市出口位置','全市平台位置'); hold on

for i=1:length(road_start)%%%%%%plot this city's routine

plot([X(road_start(i)),X(road_end(i))],[Y(road_start(i)),Y(road_end(i))]);

end

plot(362,443,'o');

%%%%%%%%%%%%%%%%%next transform the graph into matrix%%%%%%%%%%%%%% D=ones(582);

8

for i=1:582%%%%i 表示路口的节点编号%%%%%%%%%%%% m=find(road_start==i); N=road_end(m);

D(i,N)=sqrt(abs(X(i)^2+Y(i)^2-X(N).^2-Y(N).^2)); end

D(D==1)=inf;%%%%%%%%至此矩阵生成完毕

D(logical(eye(size(D))))=0;%将对角矩阵变为0

%%%%%%%%%%look for the shortest road to the city_out for every serve_plat————useing Floyd%%%%%%%%%%%%%%%%%

m=length(serve_plat); n=length(city_out);

distance=ones(m,n);%%%%%%initial the distance Path=cell(m,n);

[Dis,path]=floyd(D); for i=1:size(Dis,1)-1 for j=i+1:size(Dis,1)

if eq(Dis(i,j),Dis(j,i))==0

Dis(i,j)=min(Dis(i,j),Dis(j,i)); Dis(j,i)=Dis(i,j); end end end

[Dis,path]=floyd(Dis); for i=1:size(Dis,1)-1 for j=i+1:size(Dis,1)

if eq(Dis(i,j),Dis(j,i))==0

Dis(i,j)=min(Dis(i,j),Dis(j,i)); Dis(j,i)=Dis(i,j); end end end

for i=1:m for j=1:n

[distance1

path1]=router(Dis,path,serve_plat(i),city_out(j));

distance(i,j)=distance1; Path(i,j)= {path1}; end end

[Matching,Cost] = Edmonds(distance); [m n]=find(Matching==1); re=[];

9

for i=1:length(m)

re=[re distance(m(i),n(i))]; end

long=max(re);

time=long*1e5/(1e6)/60; bihao=serve_plat(m); Time=re/600;

function [Matching,Cost] = Edmonds(a) Matching = zeros(size(a)); num_y = sum(~isinf(a),1); num_x = sum(~isinf(a),2); x_con = find(num_x~=0); y_con = find(num_y~=0);

P_size = max(length(x_con),length(y_con)); P_cond = zeros(P_size);

P_cond(1:length(x_con),1:length(y_con)) = a(x_con,y_con); if isempty(P_cond) Cost = 0; return end

Edge = P_cond;

Edge(P_cond~=Inf) = 0;

cnum = min_line_cover(Edge);

Pmax = max(max(P_cond(P_cond~=Inf))); P_size = length(P_cond)+cnum; P_cond = ones(P_size)*Pmax;

P_cond(1:length(x_con),1:length(y_con)) = a(x_con,y_con); exit_flag = 1; stepnum = 1; while exit_flag switch stepnum case 1

[P_cond,stepnum] = step1(P_cond); case 2

[r_cov,c_cov,M,stepnum] = step2(P_cond); case 3

[c_cov,stepnum] = step3(M,P_size); case 4

[M,r_cov,c_cov,Z_r,Z_c,stepnum] step4(P_cond,r_cov,c_cov,M);

case 5

[M,r_cov,c_cov,stepnum] = step5(M,Z_r,Z_c,r_cov,c_cov);

10

=

case 6

[P_cond,stepnum] = step6(P_cond,r_cov,c_cov); case 7

exit_flag = 0; end end

Matching(x_con,y_con) = M(1:length(x_con),1:length(y_con)); Cost = sum(sum(a(Matching==1))); function [D,path]=floyd(a)

%floyd算法通用程序,输入a为赋权邻接矩阵 %输出为距离矩阵D,和最短路径矩阵path n=size(a,1); D=a;

path=zeros(n,n); for i=1:n for j=1:n

if D(i,j)~=inf path(i,j)=j; end end end

for k=1:n for i=1:n for j=1:n

if D(i,k)+D(k,j)

function [P_cond,stepnum] = step1(P_cond) P_size = length(P_cond); for ii = 1:P_size

rmin = min(P_cond(ii,:));

P_cond(ii,:) = P_cond(ii,:)-rmin; end

stepnum = 2;

function [r_cov,c_cov,M,stepnum] = step2(P_cond) P_size = length(P_cond); r_cov = zeros(P_size,1); c_cov = zeros(P_size,1);

11

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4