钢管订购和运输模型——Python实现
要铺设一条\(A_1→A_2→…→A_{15}\)的输送天然气的主管道,如图所示。经筛选后可以生产这种主管道钢管的钢厂有\(S_1 ,S_2,…,S_7\)。图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道(假设沿管道或者原有公路,或者建有施工公路),圆圈表示火车站,每段铁路、公路和管道旁的阿拉伯数字表示里程(单位:km)。为方便计算, 1km主管道钢管称为1单位钢管。
一、问题描述
一个钢厂如果承担制造这种钢管,至少需要生产500个单位。钢厂\(S_i\) 在指定期限内能生产该钢管的最大数量为\(s_i\)个单位,钢管出厂销价1单位钢管为\(p_i\)万元,如下表:
\(i\) | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
\(S_i\) | 800 | 800 | 1000 | 2000 | 2000 | 2000 | 3000 |
\(p_i\) | 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万元(不足整公里部分按整公里计算)。钢管可由铁路、公路运往铺设地点(不只是运到点\(A_1,A_2,...,A_{15}\) ,而是管道全线)。请制定一个主管道钢管的订购和运输计划,使总费用最小(给出总费用)。
二、数学模型
2.1 模型假设
假设沿管道或者原来有公路,或者建有施工公路;
运费只按铁路、公路里程收取,即不考虑火车、汽车由于停靠站等其他一切外因带来的费用;
钢管在铺设过程中以1km为单位进行铺设;
钢管可由铁路、公路运往铺设路线任一地点;
所有钢管在指定期限内都能按时生产并运送指定地点;
钢管铺设过程中由站点向左右两边进行铺设。
2.2 符号说明
符号 | 解释 |
---|---|
\(s_i\) | 第\(i\)个钢厂的最大产量,\(i=1,2,...,7\) |
\(A_j\) | 输送管道(主管道)上的第\(j\)个点,\(j=1,2,...,15\) |
\(c_{ij}\) | 钢厂\(S_i\)向点\(A_j\)订购和运输单位钢管的费用,\(i=1,2,...,7 \quad j=1,2,...,15\) |
\(x_{ij}\) | 钢厂\(S_i\)向点\(A_j\)运输的钢管量,\(i=1,2,...,7 \quad j=1,2,...,15\) |
\(p_i\) | 第\(i\)个钢厂1单位钢管的销价,\(i=1,2,...,7\) |
\(l_j\) | 管道\(A_jA_{j+1}\)段需要铺设的钢管单位,\(j=1,2,...,14\) |
\(y_j\) | 节点\(j\)向左铺设的钢管量,\(j=1,2,...,15\) |
\(z_j\) | 节点\(j\)向右铺设的钢管量,\(j=1,2,...,15\) |
2.3 数学模型的构建
项目总费用=铺设总费用+成本及运输总费用
铺设总费用
当钢管从钢厂运到点\(A_j\)后,钢管就要向运输点\(A_j\)的两边\(A_jA_{j+1}\)端和\(A_{j-1}A_j\)段运输(铺设)管道。\(l_j\):表示节点\(A_j\)到\(A_{j+1}\)之间铺设钢管单位(\(y_1=0,z_{15}=0\)),铺设方法如下图:
由于相邻运输点\(A_j\)与\(A_{j+1}\)之间的距离为\(l_{j}\),其左边为\(y_j\),右边为\(z_j\),那么\(A_j\) 向\(A_jA_{j+1}\) 的运输费可分为两部分
右边的铺设费用:$$ 0.1×( 1 + 2 + . . . + z_j ) =\frac{ z_j(z_j + 1)}{2} $$
左边铺设的费用:
成本和运输总费用
若运输点\(A_j\)向钢厂\(S_i\)订购\(x_{ij}\)单位钢管,\(c_{ij}\)是1单位钢管从钢厂\(S_i\)到点\(A_j\)的最少总费用,即公路运费、铁路运费和钢管销价之和;则钢管从钢厂\(S_i\)运到运输点\(A_j\)所需的费用为\(c_{ij}x_{ij}\),合并就得所有钢管从钢厂运到各个运输点上的总费用。所以该问题的数学模型:
三、计算过程
使用计算机求解上述数学规划时, 需要对非线性约束条件进行处理。引进0-1变量
把约束条件第一式转化为线性约束
3.1 运费矩阵的计算
将铁路与公路交界的点编号为\(B_j(j=1,2,…,17)\) ,先构造铁路距离赋权图\(G=(V,E_1,W_1)\),其中\(V =\{S_1,…,S_7,A_1,…,A_{15} ,B_1,…,B_{17}\}\),各顶点的编号如上图所示,\(W_1=[w_{ij}^{(1)}]_{39 \times 39}\),有
其中\(c_{ij}^{(1)}\)是单位钢管的铁路运费,根据铁路运价表,可以得到铁路运输费用,若两点间的铁路距离值为无穷大,则对应的铁路运输费用也为无穷大。下面介绍购买单位钢管及从\(S_i(i=1 ,2,…,7)\)运送到\(A_j(j = 1 ,2,…,15)\)的最小购运费用\(c_{ij}\)的计算过程。
计算\(S_i\)到\(B_j\)铁路直达的运输费用
(1)由于钢厂\(S_i\)直接与铁路相连,所以可求出钢厂\(S_i\)到铁路和公路相交点\(B_j\)(对应于\(A_j\))的最短路径;
(2)依据钢管的铁路运价表,算出钢厂\(S_i\)到\(B_j\)的铁路运输费用,并把费用作为边权赋给钢厂\(S_i\)到\(B_j\)的边。
如以\(S_1\)为例,\(S_1\)到\(B_j\)的单位钢管铁路费用为:
\(B_1\) | \(B_2\) | \(B_3\) | \(B_4\) | \(B_5\) | \(B_6\) | \(B_7\) | \(B_8\) | \(B_9\) | \(B_{10}\) | \(B_{11}\) | \(B_{12}\) | \(B_{13}\) | \(B_{14}\) | \(B_{15}\) | \(B_{16}\) | \(B_{17}\) |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
160 | 140 | 135 | 37 | 80 | 20 | 20 | 20 | 60 | 85 | 95 | 95 | 105 | 100 | 120 | 130 | 145 |
计算以费用为权的公路交通网络图
(1)再考虑从\(S_i\)、\(B_j\)到运输点\(A_j\)的公路赋权图;
(2)根据单位钢管在公路上的运价规定,得出每一段公路的运费,并把此费用作为边权赋给相应的边。以\(S_1\)为例得图:
构造公路费用赋权图\(G2=( V,E_2, W_2)\),其中V同上,\(W_2=[w_{ij}^{(2)}]_{39 \times 39}\),有
其中\(c_{ij}^{(2)}\)为钢厂\(i\)到节点\(j\)的公路运输费用。!!!32是15个A和17个B节点的和,需要计算钢厂和他们之间的公路连接距离,以便计算相应的运费。
计算\(S_i\)到结点\(A_j\)的最小运输费用
由于可以用铁路、公路交叉运送,所以任意相邻两点间的最小运输费用为铁路、公路两者运输费用加和的最小值(即最短路)。构造铁路公路混合赋权图\(G=(V,E,W)\),\(W=[c_{ij}]_{39 \times 39}\),\(c_{ij}= \min \{c_{ij}^{(1)},c_{ij}^{(2)}\}\),对图\(G\)应用Floyd算法,就可以计算出所有顶点对之间的最小运输费用,最后提取需要的\(S_i(i=1 ,2,…,7)\)到\(A_j(j=1,2,…,15)\)的最小运送费用\(c_{ij}\)(单位:万元)。
计算单位钢管\(S_i\)购买单位钢管运到结点\(A_j\)加上销售价\(p_i\)的最小费用
可用同样的方法求出钢厂\(S_2,S_3,S_4,S_5,S_6,S_7\)到点\(A_j\)的最小费用,从而得出从钢厂\(S_i\)购买单位钢管运到节点\(A_j\)的最小总费用(单位:万元)。综合见下表:
\(A_1\) | \(A_2\) | \(A_3\) | \(A_4\) | \(A_5\) | \(A_6\) | \(A_7\) | \(A_8\) | \(A_9\) | \(A_{10}\) | \(A_{11}\) | \(A_{12}\) | \(A_{13}\) | \(A_{14}\) | \(A_{15}\) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
\(S_1\) | 170.7 | 160.3 | 140.2 | 98.6 | 38 | 20.5 | 3.1 | 21.2 | 64.2 | 92 | 96 | 106 | 121.2 | 128 | 142 |
\(S_2\) | 215.7 | 205.3 | 190.2 | 171.6 | 111 | 95.5 | 86 | 71.2 | 114.2 | 142 | 146 | 156 | 171.2 | 178 | 192 |
\(S_3\) | 230.7 | 220.3 | 200.2 | 181.6 | 121 | 105.5 | 96 | 86.2 | 48.2 | 82 | 86 | 96 | 111.2 | 118 | 132 |
\(S_4\) | 260.7 | 250.3 | 235.2 | 216.6 | 156 | 140.5 | 131 | 116.2 | 84.2 | 62 | 51 | 61 | 76.2 | 83 | 97 |
\(S_5\) | 255.7 | 245.3 | 225.2 | 206.6 | 146 | 130.5 | 121 | 111.2 | 79.2 | 57 | 33 | 51 | 71.2 | 73 | 87 |
\(S_6\) | 265.7 | 255.3 | 235.2 | 216.6 | 156 | 140.5 | 131 | 121.2 | 84.2 | 62 | 51 | 45 | 26.2 | 11 | 28 |
\(S_7\) | 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_i\)运输到\(A_j\)的运输量 **
\(A_1\) | \(A_2\) | \(A_3\) | \(A_4\) | \(A_5\) | \(A_6\) | \(A_7\) | \(A_8\) | \(A_9\) | \(A_{10}\) | \(A_{11}\) | \(A_{12}\) | \(A_{13}\) | \(A_{14}\) | \(A_{15}\) | 总量 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
即厂家\(S_1\)往\(A_4\)节点运输335单位钢管,往\(A_6\)节点运输200单位钢管,往\(A_7\)节点运输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 亿。