数学建模-自来水管道铺设问题

数学建模-自来水管道铺设问题

 

赛题要点:

自来水管道铺设技术要求如下:

  1. 中心供水站只能和一级供水站连接(铺设I型管道),不能和二级供水站直接相连,但一级供水站之间可以连接(铺设I型管道)。
  2. 一级供水站可以与二级供水站相连(铺设II型管道),且二级供水站之间也可以连接(铺设II型管道)。
  3. 各级供水站之间的连接管道必须从上一级供水站或同一级供水站的位置坐标出发,不能从任意管道中间的一点进行连接。
  4. 相邻两个供水站之间(如果有管道相连)所需管道长度可简化为欧氏距离。

请您结合上述管道铺设要求,建立数学模型,完成以下问题

1.从中心供水站A出发,自来水管道应该如何铺设才能使管道的总里程最少?以图形给出铺设方案,并给出I型管道和II型管道总里程数。

2.由于II型管道市场供应不足,急需减少从一级供水站出发铺设的II型管道总里程,初步方案是将其中两个二级供水站升级为一级供水站。问选取哪两个二级供水站,自来水管道应该如何铺设才能使铺设的II型管道总里程最少?相对问题1的方案,II型管道的总里程减少了多少公里?

3.在问题1基础上,假如现实中由于功率的影响,从一级供水站出发铺设的管道最多只能供水40公里(按从该一级供水站管道输送的总里程计算),但从中心供水站A出发铺设的管道供水不受此距离限制。为实现对所有供水站供水,需要将若干个二级供水站升级为一级供水站,但升级后从该供水站出发铺设的管道也最多只能供水40公里。问最少升级几个二级供水站,可实现对所有的供水站供水?在这种配置下铺设管道的总里程数最少是多少公里?

 

赛题分析

针对问题一:由题目可知,I型管道的铺设方式和II型管道的铺设方式是互相独立的,互不影响的,所以可将问题一分为两部分,第一部分为I型管道的最少总里程数的铺设方案;第二部分为II型管道的最少总里程数的铺设方案。两部分都为最小生成树问题,利用prim算法可解答。

针对问题二:此问目标很明确,只要求从168个二级供水站选取两个升级成一级供水站,即遍历 C 168 2 C^{2}_{168} C1682=14028种可能,找出其中II型管道最少总里程数的铺设方案即可。当然,在解答问题一的基础上,进行理论分析,仍然可以确认出是哪两个二级供水站升级,但理论分析可能出现纰漏,表达不清,给人一种“水”感,不如枚举法来的简单、粗暴的好。

针对问题三:在I型管道和II型管道总里程数最少的基础上,求满足约束条件(从该一级供水站管道输送的总里程数不得超过40公里)的最少二级供水站升级方案。以及该配置下铺设管道的最少总里程数。

 

模型建立

 

问题一:

中心供水站与一级供水站之间的最小生成树

步骤一:设集合A、V;中心供水站为元素a,一级供水站为元素v1、v2、…、v12;且A={a},V={v1、v2、…、v12};
步骤二:从集合A和集合V中各找出一个元素,使得这两个元素距离最近,假设为元素a和元素v1;
步骤三:将这两个元素的距离累加到初始值为0的变量I_mileage;并且更新集合A={a、v1},V={v2、…、v12};
步骤四:重复步骤二,直至集合V为空集时结束循环;此时变量I_mileage即为I型管道的最少总里程数。

一级供水站与二级供水站之间的最小生成树
只需要将集合A、V改为集合V={v1、v2、…、v12}和P={p1、p2、…、p168};计算得到的变量II_mileage即为II型管道的最少总里程数。
在这里插入图片描述

中心供水站与一级供水站之间的最小生成树代码:

while size(V_point,1)
    Shortest_distance = inf;
    for j = 1:1:size(W,1)
        for i = 1:1:size(V_point,1)
            distance = (W(j,1)-V_point(i,1))^2 + (W(j,2)-V_point(i,2))^2;
            distance = sqrt(distance);
            if Shortest_distance >= distance
            Shortest_distance = distance;
            abab= j;
            grade = i;
            end
        end
    end
    hold on;
    plot([W(abab,1),V_point(grade,1)],[W(abab,2),V_point(grade,2)],'r');
    Total_mileage = Total_mileage + Shortest_distance;
    I_mileage = I_mileage + Shortest_distance;
    Num_I = Num_I+1;
    W = [W;V_point(grade,1),V_point(grade,2)];
    V_point(grade,:) = [];
end 

 

问题二:

 
使用两个for循环对每种可能更换升级后的V、P元素;此时的初始元素个数是:集合V有14个元素,集合P有166个元素;然后执行问题一的算法模型,求解出每种方案下的最少总里程数。最后比对数据,得出最优解。此遍历方法耗时较长,运行一次需要45分钟左右。

在这里插入图片描述

遍历循环代码

for d = 1:1:size(P_point,1)
    V_point_1 = V_point;
    P_point_1 = P_point;
    V_point_1 = [V_point_1;P_point_1(d,1),P_point_1(d,2)];
    P_point_1(d,:) = [];
    for b = 1:1:size(P_point_1,1)
        V_point_2 = V_point_1;
        P_point_2 = P_point_1;
        V_point_2 = [V_point_2;P_point_2(b,1),P_point_2(b,2)];
        P_point_2(b,:) = [];
        Num_II = 0;
        II_mileage = 0;
        Total_mileage = 0;             %初始化
        while size(P_point_2,1)
            Shortest_distance = inf;
            for j = 1:1:size(V_point_2,1)
                for i = 1:1:size(P_point_2,1)
                    distance = (V_point_2(j,1)-P_point_2(i,1))^2 + (V_point_2(j,2)-P_point_2(i,2))^2;
                    distance = sqrt(distance);
                    if Shortest_distance >= distance
                        Shortest_distance = distance;
                        abab= j;
                        grade = i;
                    end
                end
            end
            Total_mileage = Total_mileage + Shortest_distance;          %计算总距离
            II_mileage = II_mileage + Shortest_distance;                %计算第二级距离
            Num_II = Num_II+1;                                          %得出第二级段数
            V_point_2 = [V_point_2;P_point_2(grade,1),P_point_2(grade,2)];      %更新数据
            P_point_2(grade,:) = [];                                                     %更新数据
        end
        if Best_mileage >= Total_mileage
            D_B_buff = [d,b];
            First_point = [P_point(d,1),P_point(d,2)];
            Second_point = [P_point_1(b,1),P_point_1(b,2)];
            BEST_II_mileage = II_mileage;
            Best_mileage = Total_mileage;
        end
    end
end

 

问题三:

试探法思想】 假设一:不升级即可在满足要求下实现对所有供水站供水,验证;假设成立,则问题解答完毕。否则假设二:只升级一个二级供水站,求解验证;假设成立,则问题解答完毕。否则假设三:只升级两个二级供水站,求解验证…

在满足约束条件(从该一级供水站管道输送的总里程数不得超过40公里)下,求解最少总里程数的方法(以验证假设一不升级方案为例):
步骤一:将12个一级供水站分为十二个集合VI、V2、…、V12;将168个二级供水站作为一个集合P;设数组Mileage = [0,0,0,0,0,0,0,0,0,0,0,0],负责记录集合VI、V2、…、V12中II型管道的里程数;
步骤二:从集合VI、V2、…、V12中选取一个元素,从集合P中选取一个元素,使得这两个元素欧式距离最近;假设集合VI、V2、…、V12中选取的元素是集合V1的元素a,集合P中选取的是集合b;
步骤三:检验各集合内累加和是否小于40公里;若集合VI、V2、…、V12中某个集合的总里程数超过40公里,则再次循环时,步骤二不在从该集合内选取元素;否则将元素b放入集合V1,去除集合P的b元素;并将其欧氏距离累计在对应集合的数组内;
步骤四:结束循环的条件有两个
P集合为空集时;
P集合不为空集,但P集合的任何一个元素放入十二个集合VI、V2、…、V12中,都会使得其总里程数超过40公里。
结论:P集合为空集;则不需要升级即可在约束条件下对所有供水站供水;
       ‌‍P集合不为空集;则不升级就不能在约束条件下对所有供水站供水;
实际结果为P集合不为空集;此时仍有二级供水站P77(17,51)、P154(43、23)存在。

在这里插入图片描述

假设二只升级一个二级供水站即可在约束条件下对所有供水站供水
从二级供水站选出一个升级为一级供水站,放入集合V13中,更新集合,按照假设一重新计算验证,遍历168种可能;筛选出可升级的二级供水站;再从中选取总里程数最少的方案即可解答问题三。若没有可升级的二级供水站,则进行假设三的验证,以此类推,直至解答问题三。

在这里插入图片描述
代码分享
https://download.csdn.net/download/weixin_44048022/12682914

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值