数学建模——管道铺设问题

数学建模之管道铺设问题

题目:在村村通自来水工程实施过程中,从保证供水质量以及设备维护方便角度出发,某地区需要建设一个中心供水站,12个一级供水站和168个二级供水站,各级供水站的位置坐标如表1所示,其中类型A表示中心供水站,类型V代表一级供水站,类型P为二级供水站。图1是各级供水站的地理位置图。

现在要将中心供水站A处的自来水通过管道输送到一级供水站和二级供水站。自来水管道铺设技术要求如下:
1.中心供水站只能和一级供水站连接,不能和二级供水站直接相连,但一级供水站之间可以连接。
2.一级供水站可以与二级供水站相连,且二级供水站之间也可以连接。
3.各级供水站之间的连接管道必须从上一级供水站或同一级供水站的位置坐标出发,不能从任意管道中间的一点进行连接。
4.相邻两个供水站之间(如果有管道相连)所需管道长度可简化为欧氏距离。

请您结合上述管道铺设要求,建立数学模型,完成以下问题
1.从中心供水站A出发,自来水管道应该如何铺设才能使管道的总里程最少?以图形给出铺设方案,并给出管道总里程数。
2.为减少输送距离,准备将其中两个二级供水站升级为一级供水站,问选取哪两个二级供水站时,自来水管道应该如何铺设才能使管道的总里程最少?相对问题1总里程减少了多少公里?
3.在问题1基础上,假如现实中由于功率的影响,从一级供水站出发铺设的管道最多只能供水40公里(按从该一级供水站管道输送的总里程计算),但从中心供水站A出发铺设的管道供水不受此距离限制。为实现对所有供水站供水,需要将若干个二级供水站升级为一级供水站,但升级后从该供水站出发铺设的管道也最多只能供水40公里。问最少升级几个二级供水站,可实现对所有的供水站供水?在这种配置下铺设管道的最小公里是多少?
图1各级供水站的地理位置图


问题分析
对于问题一:分为两个步骤进行建模求解。步骤一利用prim算法建立最小生成树以求解最小管道总里程数,步骤二借用Matlab软件运用欧式距离公式(即两点间距离公式)对步骤一生成的管道是否符合“自来水管道铺设总里程最少”这一条件进行验算。
对于问题二:分为两个步骤进行建模。步骤一利用枚举法,在168个二级供水站中任意选取两个供水站使之升级成为一级供水站,步骤二采用第一问的算法计算路径,逐一进行比对,筛选出路径最少的组合即是所要求的,即可求出哪两个二级供水站升级为一级供水站,同时也计算出了该组合的最少里程。
对于问题三:采用试探法的思想,以枚举法为主,弗洛伊德算法为辅。首先假设不升级供水站,看能否实现全部供水,如若可以则不需要升级,否则任意选取一个二级供水站进行升级,看能否实现全部供水,不行则继续任意选取两个供水站升级,以此类推,直到实现全部供水。

问题一代码

clc;
clear;
A=[26 31;   %1个中心供水站A
      5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38];   %12个一级供水站V
B=[5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38;     %12个一级供水站V
     41 35;40 34;38 35;38 37;33 37;31 36;33 35;28 32;24 30;21 31;22 27;28 29;43 37;44 39;25 27;21 29;22 30;24 32;37 33;38 33;37 36;14 13;     %168个二级供水站P
     16 9;14 7;18 14;12 6;15 14;20 13;13 46;16 39;21 39;26 44;28 40;27 42;29 38;29 44;36 44;41 40;39 52;27 49;23 46;20 46;16 46;22 44;40 44;
     42 40;37 42;35 49;35 51;35 52;34 55;26 53;27 51;31 51;31 45;31 41;28 45;27 35;24 38;26 39;13 37;17 36;21 41;18 41;21 43;13 39;14 43;12 43;
     10 44;16 44;18 44;24 44;25 49;24 49;24 51;21 48;17 51;10 34;9 35;7 37;4 37;5 42;2 44;7 32;7 30;1 24;2 16;3 18;2 20;4 24;5 28;6 24;9 29;2 33;7 34;
     3 30;3 41;10 36;17 34;20 22;24 21;22 17;21 16;27 19;26 16;9 16;12 17;14 15;19 26;14 28;13 25;9 19;2 1;6 6;7 8;6 14;5 17;5 16;16 19;26 13;29 11;
     31 14;28 17;20 19;17 22;15 23;21 23;24 23;26 23;25 25;15 31;15 29;10 28;38 26;37 25;33 21;40 24;44 44;41 31;33 24;32 27;40 14;42 26;45 33;
     29 23;31 30;30 25;31 23;35 15;40 16;40 20;37 20;35 24;43 23;45 26;37 28;35 28;33 29;37 30;39 30;41 29;43 31;47 34;46 43;42 43;48 45;42 44;43 50];
C=[26 31;    %1个中心供水站A
      5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38;     %12个一级供水站V
      41 35;40 34;38 35;38 37;33 37;31 36;33 35;28 32;24 30;21 31;22 27;28 29;43 37;44 39;25 27;21 29;22 30;24 32;37 33;38 33;37 36;14 13;     %168个二级供水站P
      16 9;14 7;18 14;12 6;15 14;20 13;13 46;16 39;21 39;26 44;28 40;27 42;29 38;29 44;36 44;41 40;39 52;27 49;23 46;20 46;16 46;22 44;40 44;
      42 40;37 42;35 49;35 51;35 52;34 55;26 53;27 51;31 51;31 45;31 41;28 45;27 35;24 38;26 39;13 37;17 36;21 41;18 41;21 43;13 39;14 43;12 43;
      10 44;16 44;18 44;24 44;25 49;24 49;24 51;21 48;17 51;10 34;9 35;7 37;4 37;5 42;2 44;7 32;7 30;1 24;2 16;3 18;2 20;4 24;5 28;6 24;9 29;2 33;7 34;
      3 30;3 41;10 36;17 34;20 22;24 21;22 17;21 16;27 19;26 16;9 16;12 17;14 15;19 26;14 28;13 25;9 19;2 1;6 6;7 8;6 14;5 17;5 16;16 19;26 13;29 11;
      31 14;28 17;20 19;17 22;15 23;21 23;24 23;26 23;25 25;15 31;15 29;10 28;38 26;37 25;33 21;40 24;44 44;41 31;33 24;32 27;40 14;42 26;45 33;
      29 23;31 30;30 25;31 23;35 15;40 16;40 20;37 20;35 24;43 23;45 26;37 28;35 28;33 29;37 30;39 30;41 29;43 31;47 34;46 43;42 43;48 45;42 44;43 50];
m=length(A);    %m=13
n=length(B);      %n=180
a=zeros(181);    %带权邻接矩阵
b=zeros(181);    %无权邻接矩阵

for i=1:m
for j=i+1:m
a(i,j)=sqrt(sum((A(i,:)-A(j,:)).^2));  %中心与一级,一级之间距离
if i>1
a(j,i)=sqrt(sum((A(i,:)-A(j,:)).^2));  %一级供水站之间距离
end
end
end

for i=1:n
for j=i+1:n
a(i+1,j+1)=sqrt(sum((B(i,:)-B(j,:)).^2));   %一级与二级,二级之间距离
if i>12
a(j+1,i+1)=sqrt(sum((B(i,:)-B(j,:)).^2));   %二级供水站之间距离
end
end
end

total=0;      %管道总里程数
a(find(a==0))=inf;    %prim算法
result=[];p=1;tb=2:length(a);
while length(result)~=length(a)-1
 temp=a(p,tb);temp=temp(:);
 d=min(temp);
 total=total+d;
 [jb,kb]=find(a(p,tb)==d);
 j=p(jb(1));k=tb(kb(1));
 b(j,k)=1;
 b(k,j)=1;
 result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[];
end
result
total

A1=[26];         %中心供水站x坐标
A2=[31];         %中心拱水站y坐标

V1=[5 8 10 13 17 20 25 31 35 36 41 45 ];       %一级供水站x坐标
V2=[33 9 24 34 23 10 47 18 42 25 31 38];      %一级供水站y坐标

P1=[41 40 38 38 33 31 33 28 24 21 22 28 43 44 25 21 22 24 37 38 37 14 16 14 18 12 15 20 13 16 21 26 28 27 29 29 36 41 39 27 23 20 16 22 40 42 37 35 35 35 34 26 27 31 31 31 28 27 24 26 13 17 21 18 21 13 14 12 10 16 18 24 25 24 24 21 17 10 9 7 4 5 2 7 7 1 2 3 2 4 5 6 9 2 7 3 3 10 17 20 24 22 21 27 26 9 12 14 19 14 13 9 2 6 7 6 5 5 16 26 29 31 28 20 17 15 21 24 26 25 15 15 10 38 37 33 40 44 41 33 32 40 42 45 29 31 30 31 35 40 40 37 35 43 45 37 35 33 37 39 41 43 47 46 42 48 42 43];                  %二级供水站x坐标

P2=[35 34 35 37 37 36 35 32 30 31 27 29 37 39 27 29 30 32 33 33 36 13 9 7 14 6 14 13 46 39 39 44 40 42 38 44 44 40 52 49 46 46 46 44 44 40 42 49 51 52 55 53 51 51 45 41 45 35 38 39 37 36 41 41 43 39 43 43 44 44 44 44 49 49 51 48 51 34 35 37 37 42 44 32 30 24 16 18 20 24 28 24 29 33 34 30 41 36 34 22 21 17 16 19 16 16 17 15 26 28 25 19 1 6 8 14 17 16 19 13 11 14 17 19 22 23 23 23 23 25 31 29 28 26 25 21 24 44 31 24 27 14 26 33 23 30 25 23 15 16 20 20 24 23 26 28 28 29 30 30 29 31 34 43 43 45 44 50];               %二级供水站y坐标

%画线路图
scatter(A1,A2,'bo')  %中心供水站位置
hold on;
scatter(V1,V2,'k*')  %一级供水站位置
hold on;
scatter(P1,P2,'b.')   %二级供水站位置
hold on;

xlabel('x')
ylabel('y')
gplot(b,C,'r-')
hleg=legend('中心供水站','一级供水站','二级供水站','管道','Location','NorthEastOutside');
hold on;

%540.9142

运行结果


问题二代码

clc;
clear;
A=[26 31;   %1个中心供水站A
     5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38];   %12个一级供水站V
B=[5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38;     %12个一级供水站V
    41 35;40 34;38 35;38 37;33 37;31 36;33 35;28 32;24 30;21 31;22 27;28 29;43 37;44 39;25 27;21 29;22 30;24 32;37 33;38 33;37 36;14 13;     %168个二级供水站P
    16 9;14 7;18 14;12 6;15 14;20 13;13 46;16 39;21 39;26 44;28 40;27 42;29 38;29 44;36 44;41 40;39 52;27 49;23 46;20 46;16 46;22 44;40 44;
    42 40;37 42;35 49;35 51;35 52;34 55;26 53;27 51;31 51;31 45;31 41;28 45;27 35;24 38;26 39;13 37;17 36;21 41;18 41;21 43;13 39;14 43;12 43;
    10 44;16 44;18 44;24 44;25 49;24 49;24 51;21 48;17 51;10 34;9 35;7 37;4 37;5 42;2 44;7 32;7 30;1 24;2 16;3 18;2 20;4 24;5 28;6 24;9 29;2 33;7 34;
    3 30;3 41;10 36;17 34;20 22;24 21;22 17;21 16;27 19;26 16;9 16;12 17;14 15;19 26;14 28;13 25;9 19;2 1;6 6;7 8;6 14;5 17;5 16;16 19;26 13;29 11;
    31 14;28 17;20 19;17 22;15 23;21 23;24 23;26 23;25 25;15 31;15 29;10 28;38 26;37 25;33 21;40 24;44 44;41 31;33 24;32 27;40 14;42 26;45 33;
    29 23;31 30;30 25;31 23;35 15;40 16;40 20;37 20;35 24;43 23;45 26;37 28;35 28;33 29;37 30;39 30;41 29;43 31;47 34;46 43;42 43;48 45;42 44;43 50];
C=[26 31;    %1个一级供水站A
     5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38;     %12个一级供水站V
     41 35;40 34;38 35;38 37;33 37;31 36;33 35;28 32;24 30;21 31;22 27;28 29;43 37;44 39;25 27;21 29;22 30;24 32;37 33;38 33;37 36;14 13;     %168个二级供水站P
     16 9;14 7;18 14;12 6;15 14;20 13;13 46;16 39;21 39;26 44;28 40;27 42;29 38;29 44;36 44;41 40;39 52;27 49;23 46;20 46;16 46;22 44;40 44;
     42 40;37 42;35 49;35 51;35 52;34 55;26 53;27 51;31 51;31 45;31 41;28 45;27 35;24 38;26 39;13 37;17 36;21 41;18 41;21 43;13 39;14 43;12 43;
     10 44;16 44;18 44;24 44;25 49;24 49;24 51;21 48;17 51;10 34;9 35;7 37;4 37;5 42;2 44;7 32;7 30;1 24;2 16;3 18;2 20;4 24;5 28;6 24;9 29;2 33;7 34;
     3 30;3 41;10 36;17 34;20 22;24 21;22 17;21 16;27 19;26 16;9 16;12 17;14 15;19 26;14 28;13 25;9 19;2 1;6 6;7 8;6 14;5 17;5 16;16 19;26 13;29 11;
     31 14;28 17;20 19;17 22;15 23;21 23;24 23;26 23;25 25;15 31;15 29;10 28;38 26;37 25;33 21;40 24;44 44;41 31;33 24;32 27;40 14;42 26;45 33;
     29 23;31 30;30 25;31 23;35 15;40 16;40 20;37 20;35 24;43 23;45 26;37 28;35 28;33 29;37 30;39 30;41 29;43 31;47 34;46 43;42 43;48 45;42 44;43 50];
m=length(A);    %m=13
n=length(B);      %n=180
p=length(C);      %p=181
a=zeros(181);    %带权邻接矩阵
b=zeros(181);    %无权邻接矩阵

for i=1:m
for j=i+1:m
a(i,j)=sqrt(sum((A(i,:)-A(j,:)).^2)); %中心与一级,一级之间距离
if i>1
a(j,i)=sqrt(sum((A(i,:)-A(j,:)).^2));  %一级供水站之间距离
end
end
end

for i=1:n
for j=i+1:n
a(i+1,j+1)=sqrt(sum((B(i,:)-B(j,:)).^2));   %一级与二级,二级之间距离
if i>12
a(j+1,i+1)=sqrt(sum((B(i,:)-B(j,:)).^2));   %二级供水站之间距离
end
end
end

D=nchoosek(1:168,2);   %需要升级的二级供水站组合
mindist=540.9142;              %未升级时最小管道总里程
minx=0;miny=0;            %需要升级的二级供水站序号

for k=1:length(D)  
change=D(k,:);
x=change(1:1)+13;
y=change(2:2)+13;

for i=14:p                   %升级后更改带权邻接矩阵信息
if i==x||i==y
a(1,i)=sqrt(sum((C(1,:)-C(i,:)).^2));  
end
end

for i=14:p
for j=2:13
if i==x||i==y
a(i,j)=sqrt(sum((C(i,:)-C(j,:)).^2)); 
end
end
end

for i=14:p
for j=14:p
if i~=x&&j==y
a(i,j)=0;
end
if i==x&&j~=y
a(j,i)=0;
end
end
end

total=0;    %管道总里程数
a(find(a==0))=inf;    %prim算法
result=[];p=1;tb=2:length(a);
while length(result)~=length(a)-1
temp=a(p,tb);temp=temp(:);
d=min(temp);
total=total+d;
[jb,kb]=find(a(p,tb)==d);
j=p(jb(1));k=tb(kb(1));
b(j,k)=1;
b(k,j)=1;
result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[];
end

if(total<mindist)   %更改最小管道总里程及需要升级的二级供水站序号
mindist=total;
minx=x;
miny=y;
end
end
mindist
minx
miny

问题二生成图解代码

clc;
clear;
A=[26 31;   %1个A
     5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38];   %12个V
B=[5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38;     %12个V
    41 35;40 34;38 35;38 37;33 37;31 36;33 35;28 32;24 30;21 31;22 27;28 29;43 37;44 39;25 27;21 29;22 30;24 32;37 33;38 33;37 36;14 13;     %168个P
    16 9;14 7;18 14;12 6;15 14;20 13;13 46;16 39;21 39;26 44;28 40;27 42;29 38;29 44;36 44;41 40;39 52;27 49;23 46;20 46;16 46;22 44;40 44;
    42 40;37 42;35 49;35 51;35 52;34 55;26 53;27 51;31 51;31 45;31 41;28 45;27 35;24 38;26 39;13 37;17 36;21 41;18 41;21 43;13 39;14 43;12 43;
    10 44;16 44;18 44;24 44;25 49;24 49;24 51;21 48;17 51;10 34;9 35;7 37;4 37;5 42;2 44;7 32;7 30;1 24;2 16;3 18;2 20;4 24;5 28;6 24;9 29;2 33;7 34;
    3 30;3 41;10 36;17 34;20 22;24 21;22 17;21 16;27 19;26 16;9 16;12 17;14 15;19 26;14 28;13 25;9 19;2 1;6 6;7 8;6 14;5 17;5 16;16 19;26 13;29 11;
    31 14;28 17;20 19;17 22;15 23;21 23;24 23;26 23;25 25;15 31;15 29;10 28;38 26;37 25;33 21;40 24;44 44;41 31;33 24;32 27;40 14;42 26;45 33;
    29 23;31 30;30 25;31 23;35 15;40 16;40 20;37 20;35 24;43 23;45 26;37 28;35 28;33 29;37 30;39 30;41 29;43 31;47 34;46 43;42 43;48 45;42 44;43 50];
C=[26 31;  
     5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38;     %12个V
     41 35;40 34;38 35;38 37;33 37;31 36;33 35;28 32;24 30;21 31;22 27;28 29;43 37;44 39;25 27;21 29;22 30;24 32;37 33;38 33;37 36;14 13;     %168个P
     16 9;14 7;18 14;12 6;15 14;20 13;13 46;16 39;21 39;26 44;28 40;27 42;29 38;29 44;36 44;41 40;39 52;27 49;23 46;20 46;16 46;22 44;40 44;
     42 40;37 42;35 49;35 51;35 52;34 55;26 53;27 51;31 51;31 45;31 41;28 45;27 35;24 38;26 39;13 37;17 36;21 41;18 41;21 43;13 39;14 43;12 43;
     10 44;16 44;18 44;24 44;25 49;24 49;24 51;21 48;17 51;10 34;9 35;7 37;4 37;5 42;2 44;7 32;7 30;1 24;2 16;3 18;2 20;4 24;5 28;6 24;9 29;2 33;7 34;
     3 30;3 41;10 36;17 34;20 22;24 21;22 17;21 16;27 19;26 16;9 16;12 17;14 15;19 26;14 28;13 25;9 19;2 1;6 6;7 8;6 14;5 17;5 16;16 19;26 13;29 11;
     31 14;28 17;20 19;17 22;15 23;21 23;24 23;26 23;25 25;15 31;15 29;10 28;38 26;37 25;33 21;40 24;44 44;41 31;33 24;32 27;40 14;42 26;45 33;
     29 23;31 30;30 25;31 23;35 15;40 16;40 20;37 20;35 24;43 23;45 26;37 28;35 28;33 29;37 30;39 30;41 29;43 31;47 34;46 43;42 43;48 45;42 44;43 50];
m=length(A);    %m=13
n=length(B);      %n=180
p=length(C);
a=zeros(181);
b=zeros(181);
for i=1:m
for j=i+1:m
a(i,j)=sqrt(sum((A(i,:)-A(j,:)).^2));
if i>1
a(j,i)=sqrt(sum((A(i,:)-A(j,:)).^2));
end
end
end
for i=1:n
for j=i+1:n
a(i+1,j+1)=sqrt(sum((B(i,:)-B(j,:)).^2));
if i>12
a(j+1,i+1)=sqrt(sum((B(i,:)-B(j,:)).^2));
end
end
end

for i=14:p
if i==27||i==28
a(1,i)=sqrt(sum((C(1,:)-C(i,:)).^2));  
end
end

for i=14:p
for j=2:13
if i==27||i==28
a(i,j)=sqrt(sum((C(i,:)-C(j,:)).^2)); 
end
end
end

for i=14:p
for j=14:p
if i~=27&&j==28
a(i,j)=0;
end
if i==27&&j~=28
a(j,i)=0;
end
end
end

total=0;
a(find(a==0))=inf;
result=[];p=1;tb=2:length(a);
while length(result)~=length(a)-1
temp=a(p,tb);temp=temp(:);
d=min(temp);
total=total+d;
[jb,kb]=find(a(p,tb)==d);
j=p(jb(1));k=tb(kb(1));
b(j,k)=1;
b(k,j)=1;
result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[];
end
total

A1=[26];
A2=[31];
V1=[5 8 10 13 17 20 25 31 35 36 41 45];
V2=[33 9 24 34 23 10 47 18 42 25 31 38];
U1=[44 25];
U2=[39 27];
P1=[41 40 38 38 33 31 33 28 24 21 22 28 43 21 22 24 37 38 37 14 16 14 18 12 15 20 13 16 21 26 28 27 29 29 36 41 39 27 23 20 16 22 40 42 37 35 35 35 34 26 27 31 31 31 28 27 24 26 13 17 21 18 21 13 14 12 10 16 18 24 25 24 24 21 17 10 9 7 4 5 2 7 7 1 2 3 2 4 5 6 9 2 7 3 3 10 17 20 24 22 21 27 26 9 12 14 19 14 13 9 2 6 7 6 5 5 16 26 29 31 28 20 17 15 21 24 26 25 15 15 10 38 37 33 40 44 41 33 32 40 42 45 29 31 30 31 35 40 40 37 35 43 45 37 35 33 37 39 41 43 47 46 42 48 42 43];
P2=[35 34 35 37 37 36 35 32 30 31 27 29 37 29 30 32 33 33 36 13 9 7 14 6 14 13 46 39 39 44 40 42 38 44 44 40 52 49 46 46 46 44 44 40 42 49 51 52 55 53 51 51 45 41 45 35 38 39 37 36 41 41 43 39 43 43 44 44 44 44 49 49 51 48 51 34 35 37 37 42 44 32 30 24 16 18 20 24 28 24 29 33 34 30 41 36 34 22 21 17 16 19 16 16 17 15 26 28 25 19 1 6 8 14 17 16 19 13 11 14 17 19 22 23 23 23 23 25 31 29 28 26 25 21 24 44 31 24 27 14 26 33 23 30 25 23 15 16 20 20 24 23 26 28 28 29 30 30 29 31 34 43 43 45 44 50];
scatter(A1,A2,'bo')  %中心供水站位置
hold on;
scatter(V1,V2,'k*')  %一级供水站位置
hold on;
scatter(U1,U2,'ks')  %二级升为一级供水站位置
hold on;
scatter(P1,P2,'b.')   %二级供水站位置
hold on;
%画线路图
xlabel('x')
ylabel('y')
gplot(b,C,'r-')
hleg=legend('中心供水站','一级供水站','二级升为一级供水站','二级供水站','管道','Location','NorthEastOutside');
hold on;

运行结果


问题三代码

clc;
clear;
A=[26 31;   %1个中心供水站A
      5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38];   %12个一级供水站V
B=[5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38;     %12个一级供水站V
     41 35;40 34;38 35;38 37;33 37;31 36;33 35;28 32;24 30;21 31;22 27;28 29;43 37;44 39;25 27;21 29;22 30;24 32;37 33;38 33;37 36;14 13;     %168个二级供水站P
     16 9;14 7;18 14;12 6;15 14;20 13;13 46;16 39;21 39;26 44;28 40;27 42;29 38;29 44;36 44;41 40;39 52;27 49;23 46;20 46;16 46;22 44;40 44;
     42 40;37 42;35 49;35 51;35 52;34 55;26 53;27 51;31 51;31 45;31 41;28 45;27 35;24 38;26 39;13 37;17 36;21 41;18 41;21 43;13 39;14 43;12 43;
     10 44;16 44;18 44;24 44;25 49;24 49;24 51;21 48;17 51;10 34;9 35;7 37;4 37;5 42;2 44;7 32;7 30;1 24;2 16;3 18;2 20;4 24;5 28;6 24;9 29;2 33;7 34;
     3 30;3 41;10 36;17 34;20 22;24 21;22 17;21 16;27 19;26 16;9 16;12 17;14 15;19 26;14 28;13 25;9 19;2 1;6 6;7 8;6 14;5 17;5 16;16 19;26 13;29 11;
     31 14;28 17;20 19;17 22;15 23;21 23;24 23;26 23;25 25;15 31;15 29;10 28;38 26;37 25;33 21;40 24;44 44;41 31;33 24;32 27;40 14;42 26;45 33;
     29 23;31 30;30 25;31 23;35 15;40 16;40 20;37 20;35 24;43 23;45 26;37 28;35 28;33 29;37 30;39 30;41 29;43 31;47 34;46 43;42 43;48 45;42 44;43 50];
C=[26 31;    %1个中心供水站A
      5 33;8 9;10 24;13 34;17 23;20 10;25 47;31 18;35 42;36 25;41 31;45 38;     %12个一级供水站V
      41 35;40 34;38 35;38 37;33 37;31 36;33 35;28 32;24 30;21 31;22 27;28 29;43 37;44 39;25 27;21 29;22 30;24 32;37 33;38 33;37 36;14 13;     %168个二级供水站P
      16 9;14 7;18 14;12 6;15 14;20 13;13 46;16 39;21 39;26 44;28 40;27 42;29 38;29 44;36 44;41 40;39 52;27 49;23 46;20 46;16 46;22 44;40 44;
      42 40;37 42;35 49;35 51;35 52;34 55;26 53;27 51;31 51;31 45;31 41;28 45;27 35;24 38;26 39;13 37;17 36;21 41;18 41;21 43;13 39;14 43;12 43;
      10 44;16 44;18 44;24 44;25 49;24 49;24 51;21 48;17 51;10 34;9 35;7 37;4 37;5 42;2 44;7 32;7 30;1 24;2 16;3 18;2 20;4 24;5 28;6 24;9 29;2 33;7 34;
      3 30;3 41;10 36;17 34;20 22;24 21;22 17;21 16;27 19;26 16;9 16;12 17;14 15;19 26;14 28;13 25;9 19;2 1;6 6;7 8;6 14;5 17;5 16;16 19;26 13;29 11;
      31 14;28 17;20 19;17 22;15 23;21 23;24 23;26 23;25 25;15 31;15 29;10 28;38 26;37 25;33 21;40 24;44 44;41 31;33 24;32 27;40 14;42 26;45 33;
      29 23;31 30;30 25;31 23;35 15;40 16;40 20;37 20;35 24;43 23;45 26;37 28;35 28;33 29;37 30;39 30;41 29;43 31;47 34;46 43;42 43;48 45;42 44;43 50];

lm=length(A);    %lm=13
ln=length(B);      %ln=180
l=length(C);      %l=181
a=ones(181)*inf;    %带权邻接矩阵

for i=1:lm
for j=i+1:lm
a(i,j)=sqrt(sum((A(i,:)-A(j,:)).^2));  %中心与一级,一级之间距离
if i>1
a(j,i)=sqrt(sum((A(i,:)-A(j,:)).^2));  %一级供水站之间距离
end
end
end

for i=1:ln
for j=i+1:ln
a(i+1,j+1)=sqrt(sum((B(i,:)-B(j,:)).^2));   %一级与二级,二级之间距离
if i>12
a(j+1,i+1)=sqrt(sum((B(i,:)-B(j,:)).^2));   %二级供水站之间距离
end
end
end

n=size(a,1);    %floyd算法
for i=1:n
for j=1:n
end
end
for k=1:n
for i=1:n
for j=1:n
if a(i,j)>a(i,k)+a(k,j)
a(i,j)=a(i,k)+a(k,j);
end
end
end
end
%dist=a(s,e),s为起点,e为终点

flag=[];
maxn=0;  %未升级覆盖二级供水站数
num=0;    %升级的二级供水站数
for i=2:lm
for j=14:l
if a(i,j)<=40&&ismember(j-13,flag)==0
flag=[flag j-13];
maxn=maxn+1;
end
end
end

x=zeros(1,168);
maxs=zeros(1,168);     %需要升级的二级供水站序号  

while maxn<168-num
num=num+1;        
D=nchoosek(1:168,num);   %需要升级的二级供水站组合
for s=1:length(D)  
change=D(s,:);
for i=1:num
x(i)=change(i:i)+13;    
end

for i=14:l
for k=1:num
if i==x(k)                   %升级后更改带权邻接矩阵信息
a(1,i)=sqrt(sum((C(1,:)-C(i,:)).^2));  
end
end
end

for i=14:l
for j=2:13
for k=1:num
if i==x(k)     
a(i,j)=sqrt(sum((C(i,:)-C(j,:)).^2)); 
end
end
end
end

for i=14:l
for j=14:l
for k=1:num
if i~=x(k)&&j==x(k)
a(i,j)=inf;
end
if i==x(k)&&j~=x(k)
a(j,i)=inf;
end
end
end
end

count=0;
flag=[];
for i=2:lm
for j=14:l
for k=1:num
if a(i,j)<=40&&j~=x(k)&&ismember(j-13,flag)==0
flag=[flag j-13];
count=count+1;
end
end
end
end

for i=14:l
for j=14:l
for k=1:num
if a(i,j)<=40&&i==x(k)&&j~=x(k)&&ismember(j-13,flag)==0
flag=[flag j-13];
count=count+1;
end
end
end
end

maxn=count;
for i=1:num      %更改需要升级的二级水站信息
maxs(i)=x(i);
end
if maxn>=168-num
break;
end

end
end

num
flag
for i=1:num
    maxs(i)
end

问题结果
问题一:最短的总里程数为total=540.9142公里
问题二:利用第一问的思想,将168个二级供水站中任意选取两个供水站使之升级成一级供水站,列举出所有的情况,利用Prim算法求出所有方案的距离,逐一比较,发现最短的是将P14和P15升级为一级供水站点,最短距离为mindist=538.6416公里,比第一问少了2.2726公里。
问题三:不需要修改升级任何二级站点,便可以实现对所有站点的供水。
故总管道距离依旧是第一问的540.9142公里。

以上就是本人在参加学校数学建模校内选拔赛后想要分享的内容。
第一次写技术文档,还有很多不足之处请多多包涵,谢谢!

  • 54
    点赞
  • 231
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值