钢管订购和运输模型——Python实现
要铺设一条的输送天然气的主管道,如图所示。经筛选后可以生产这种主管道钢管的钢厂有。图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km)。为方便计算, 1km主管道钢管称为1单位钢管。
一、问题描述
一个钢厂如果承担制造这种钢管,至少需要生产500个单位。钢厂 在指定期限内能生产该钢管的最大数量为个单位,钢管出厂销价1单位钢管为万元,如下表:
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|
800 | 800 | 1000 | 2000 | 2000 | 2000 | 3000 | |
160 | 155 | 155 | 160 | 155 | 150 | 160 |
单位钢管的铁路运价如下表:
里程(km) | ≤300 | 301~350 | 351~400 | 401~450 | 451~500 | 501~600 | 601~700 | 701~800 | 801~900 | 901~1000 |
---|---|---|---|---|---|---|---|---|---|---|
运价(万元) | 20 | 23 | 26 | 29 | 32 | 37 | 44 | 50 | 55 | 60 |
1000km以上每增加1至100km运价增加5万元。公路运输费用为1单位钢管每公里0.1万元(不足整公里部分按整公里计算)。钢管可由铁路、公路运往铺设地点(不只是运到点 ,而是管道全线)。请制定一个主管道钢管的订购和运输计划,使总费用最小(给出总费用)。
二、数学模型
2.1 模型假设
假设沿管道或者原来有公路,或者建有施工公路;
运费只按铁路、公路里程收取,即不考虑火车、汽车由于停靠站等其他一切外因带来的费用;
钢管在铺设过程中以1km为单位进行铺设;
钢管可由铁路、公路运往铺设路线任一地点;
所有钢管在指定期限内都能按时生产并运送指定地点;
钢管铺设过程中由站点向左右两边进行铺设。
2.2 符号说明
符号 | 解释 |
---|---|
第个钢厂的最大产量, | |
输送管道(主管道)上的第个点, | |
钢厂向点订购和运输单位钢管的费用, | |
钢厂向点运输的钢管量, | |
第个钢厂1单位钢管的销价, | |
管道段需要铺设的钢管单位, | |
节点向左铺设的钢管量, | |
节点向右铺设的钢管量, |
2.3 数学模型的构建
项目总费用=铺设总费用+成本及运输总费用
铺设总费用
当钢管从钢厂运到点后,钢管就要向运输点的两边端和段运输(铺设)管道。:表示节点到之间铺设钢管单位(),铺设方法如下图:
由于相邻运输点与之间的距离为,其左边为,右边为,那么 向 的运输费可分为两部分
右边的铺设费用:
左边铺设的费用:
成本和运输总费用
若运输点向钢厂订购单位钢管,是1单位钢管从钢厂到点的最少总费用,即公路运费、铁路运费和钢管销价之和;则钢管从钢厂运到运输点所需的费用为,合并就得所有钢管从钢厂运到各个运输点上的总费用。所以该问题的数学模型:
三、计算过程
使用计算机求解上述数学规划时, 需要对非线性约束条件进行处理。引进0-1变量
把约束条件第一式转化为线性约束
3.1 运费矩阵的计算
将铁路与公路交界的点编号为 ,先构造铁路距离赋权图,其中,各顶点的编号如上图所示,,有
其中是单位钢管的铁路运费,根据铁路运价表,可以得到铁路运输费用,若两点间的铁路距离值为无穷大,则对应的铁路运输费用也为无穷大。下面介绍购买单位钢管及从运送到的最小购运费用的计算过程。
计算到铁路直达的运输费用
(1)由于钢厂直接与铁路相连,所以可求出钢厂到铁路和公路相交点(对应于)的最短路径;
(2)依据钢管的铁路运价表,算出钢厂到的铁路运输费用,并把费用作为边权赋给钢厂到的边。
如以为例,到的单位钢管铁路费用为:
160 | 140 | 135 | 37 | 80 | 20 | 20 | 20 | 60 | 85 | 95 | 95 | 105 | 100 | 120 | 130 | 145 |
计算以费用为权的公路交通网络图
(1)再考虑从、到运输点的公路赋权图;
(2)根据单位钢管在公路上的运价规定,得出每一段公路的运费,并把此费用作为边权赋给相应的边。以为例得图:
构造公路费用赋权图,其中V同上,,有
其中为钢厂到节点的公路运输费用。!!!32是15个A和17个B节点的和,需要计算钢厂和他们之间的公路连接距离,以便计算相应的运费。
计算到结点的最小运输费用
由于可以用铁路、公路交叉运送,所以任意相邻两点间的最小运输费用为铁路、公路两者运输费用加和的最小值(即最短路)。构造铁路公路混合赋权图,,,对图应用Floyd算法,就可以计算出所有顶点对之间的最小运输费用,最后提取需要的到的最小运送费用(单位:万元)。
计算单位钢管购买单位钢管运到结点加上销售价的最小费用
可用同样的方法求出钢厂到点的最小费用,从而得出从钢厂购买单位钢管运到节点的最小总费用(单位:万元)。综合见下表:
170.7 | 160.3 | 140.2 | 98.6 | 38 | 20.5 | 3.1 | 21.2 | 64.2 | 92 | 96 | 106 | 121.2 | 128 | 142 | |
215.7 | 205.3 | 190.2 | 171.6 | 111 | 95.5 | 86 | 71.2 | 114.2 | 142 | 146 | 156 | 171.2 | 178 | 192 | |
230.7 | 220.3 | 200.2 | 181.6 | 121 | 105.5 | 96 | 86.2 | 48.2 | 82 | 86 | 96 | 111.2 | 118 | 132 | |
260.7 | 250.3 | 235.2 | 216.6 | 156 | 140.5 | 131 | 116.2 | 84.2 | 62 | 51 | 61 | 76.2 | 83 | 97 | |
255.7 | 245.3 | 225.2 | 206.6 | 146 | 130.5 | 121 | 111.2 | 79.2 | 57 | 33 | 51 | 71.2 | 73 | 87 | |
265.7 | 255.3 | 235.2 | 216.6 | 156 | 140.5 | 131 | 121.2 | 84.2 | 62 | 51 | 45 | 26.2 | 11 | 28 | |
275.7 | 265.3 | 245.2 | 226.6 | 166 | 150.5 | 141 | 131.2 | 99.2 | 77 | 66 | 56 | 38.2 | 26 | 2 |
3.2 总费用的计算
**单位钢管从钢厂运输到的运输量 **
总量 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
S(1) | 0 | 0 | 0 | 335 | 0 | 200 | 265 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 800 |
S(2) | 0 | 179 | 188 | 133 | 0 | 0 | 0 | 300 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 800 |
S(3) | 0 | 0 | 320 | 0 | 16 | 0 | 0 | 0 | 664 | 0 | 0 | 0 | 0 | 0 | 0 | 1000 |
S(4) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
S(5) | 0 | 0 | 0 | 0 | 600 | 0 | 0 | 0 | 0 | 0 | 415 | 0 | 0 | 0 | 0 | 1015 |
S(6) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 351 | 0 | 86 | 333 | 621 | 165 | 1556 |
S(7) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
即厂家往节点运输335单位钢管,往节点运输200单位钢管,往节点运输265单位钢管,共计800单位。其它钢厂以此类推,得最小费用为127.8632亿元。
3.3 Python计算代码
#铁路赋权图
[进行中,参看链接程序](https://blog.csdn.net/weixin_60200880/article/details/125881596)
#公路赋权图
[进行中,参看链接程序](https://blog.csdn.net/weixin_60200880/article/details/125881596)
#最小费用
[进行中,参看链接程序](https://blog.csdn.net/weixin_60200880/article/details/125881596)
引进0 −1 变量后,求得总费用的最小值为 127.8632 亿。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!