首页 > 编程语言 >钢管订购和运输模型——Python实现

钢管订购和运输模型——Python实现

时间:2023-05-12 22:22:32浏览次数:54  
标签:... 15 钢管 钢厂 Python 订购 铺设 quad

要铺设一条\(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
运价(万元) 20 23 26 29 32
里程(km) 501~600 601~700 701~800 801~900 901~1000
运价(万元) 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\)
\(y_j\) 在点\(A_j\)与点\(A_{j+1}\)之间的公路上,运输点\(A_j\)向点\(A_{j+1}\)方向铺设的钢管量,\(j=1,2,3,...,14\)
\(A_{ij}\) 1单位钢管从钢厂\(S_i\)到点\(A_j\)的最少总费用,即订购费用、公路运费、铁路运费、铺设管道和钢管销价之和,\(i=1,2,...,7 \quad j=1,2,...,15\)
\(l_j\) 管道第\(j\)需要铺设的钢管量,\(j=1,2,...,15\)
\(y_j\) 节点\(j\)向左铺设的钢管量,\(j=1,2,...,15\)
\(z_j\) 节点\(j\)向右铺设的钢管量,\(j=1,2,...,15\)

2.3 数学模型

\[\begin{array}{ll} \min \sum_{i=1}^7 \sum_{j=1}^{15} c_{i j} x_{i j}+\frac{0.1}{2} \sum_{j=1}^{15}\left[z_j\left(z_j+1\right)+y_j\left(y_j+1\right)\right] \\ \text { s.t. }\left\{\begin{array}{l} \sum_{j=1}^{15} x_{i j} \in\{0\} \cup\left[500, s_i\right], \quad i=1,2, \cdots, 7, \\ \sum_{j=1}^{15} x_{i j} \leq s_i, \quad i=1,2, \cdots, 7, \\ \sum_{i=1}^7 x_{i j}=z_j+y_j,\quad j=1,2, \cdots, 15, \\ y_{j+1}+z_j=l_j, \quad j=1,2, \cdots, 14, \\ y_1=0, \quad z_{15}=0 \\ x_{i j} \geqslant 0, z_j \geqslant 0, y_j \geqslant 0,\quad i=1,2, \cdots 7, j=1,2 \cdots, 15 \end{array}\right. \end{array} \]

三、求解过程

3.1 运费矩阵的计算

使用计算机求解上述数学规划时, 需要对非线性约束条件式(4.23)进行处理。引进0-1变量

\[f_i=\left\{\begin{array}{l} 1, \text { 钢厂 } i \text { 生产, } \\ 0, \text { 钢厂 } i \text { 不生产。 } \end{array} \quad i=1,2, \cdots, 7\right. \text { 。 } \]

把约束条件式(4.23)转化为线性约束

\[500 f_i \leqslant \sum_{j=1}^{15} x_{i j} \leqslant s_i f_i, i=1,2, \cdots, 7 \]

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) 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

**单位钢管从钢厂\(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

即厂家S1往A4节点运输335单位钢管,往A6节点运输200单位钢管,往A7节点运输265单位钢管,共计800单位。其它钢厂以此类推…………最小费用为127.8632亿元。

3.3 Python代码


使用计算机求解上述数学规划时,需要对约束条件(20)进行处理。我们引进0 −1 变量

求得总费用的最小值为 127.8632 亿。

参考文献

  1. 钢管订购与运输优化模型
  2. 钢管运输模型
  3. 最短路+最小费用+线性规划(钢管订购和运输问题)

标签:...,15,钢管,钢厂,Python,订购,铺设,quad
From: https://www.cnblogs.com/haohai9309/p/17396079.html

相关文章

  • Python用T-SNE非线性降维技术拟合和可视化高维数据iris鸢尾花、MNIST 数据|附代码数据
    原文链接:http://tecdat.cn/?p=24002最近我们被客户要求撰写关于非线性降维技术的研究报告,包括一些图形和统计输出。T-distributedStochasticNeighborEmbedding(T-SNE)是一种可视化高维数据的工具。T-SNE基于随机邻域嵌入,是一种非线性降维技术,用于在二维或三维空间中可视化......
  • python推荐系统实现(矩阵分解来协同过滤)|附代码数据
    原文链接:http://tecdat.cn/?p=10911最近我们被客户要求撰写关于推荐系统的研究报告,包括一些图形和统计输出。用户和产品的潜在特征编写推荐系统矩阵分解工作原理使用潜在表征来找到类似的产品1.用户和产品的潜在特征我们可以通过为每个用户和每部电影分配属性,然后将它们相乘......
  • Python爱彼迎Airbnb新用户体验数据XGBoost、随机森林预测
    全文链接:http://tecdat.cn/?p=32380原文出处:拓端数据部落公众号分析师:ZhuhuaHuang在多项用户数据中寻找与预测值相关的属性。查看各个特征的分布与特征之间的关联。分析用户数据,查看特定人群的使用习惯进行产品优化。最后选择合适的模型与参数来进行预测。解决方案任务/目标......
  • python软件与编程语言
    编程语言的发展史1.机器语言:计算机内部只认识01二进制数据  #由于计算机是基于电工作的,电是有高低电频之分的,高电频和低电频 优点:执行速度快 缺点:学习难度大2.汇编语言  #用简单的字母表示一串二进制  00011001  a  00001  b  00010  c......
  • Python 输出简单彩色字符【ANSI 转义序列笔记】
    """ASCII码的0-31和127被称为C0控制字符例如\07就是BEL,响铃(\0表示八进制)其中\033(十进制27,十六进制x1B)是ESC,转义字符,它可以用于转义序列如\033[表示序列导入(ControlSequenceIntroducer),简写为CSI也可写作\x1b[两个字......
  • Python
    Python变量变量命名规则变量名必须以字母或下划线字符开头变量名称不能以数字开头变量名只能包含字母数字字符和下划线(A-z、0-9和_)变量名称区分大小写(age、Age和AGE是三个不同的变量)变量赋值切片法:x,y,z="Orange","Banana","Cherry"多个变量名同时赋值:x=......
  • Python中的for循环
    在Python中,for循环用于遍历序列(列表、元组、字符串等)或其他可迭代对象中的元素。for循环的语法如下:for变量in序列:执行代码块其中,变量是用于存储序列中当前元素的变量名,序列是要遍历的序列,代码块是要执行的操作。代码块必须缩进,通常使用四个空格缩进。下面是一个遍历列表......
  • 编程语言与Python介绍题
    计算机存储单位1024bytes=1KB  1024KB=1MB 1024MB=1GB 1024GB=1TB(10.24程序员节日)编程语言的发展史1.机器语言:计算机内部只认识01二进制数据。优点:执行效率高,缺点:学习难度大、跨平台性差2.汇编语言:用一个英文字母来表示一串二进制 优点:执行效率高,缺点:开发效率低,跨平......
  • Python通过GeoIP获取IP信息(国家、城市、经纬度等)
    前言IP地址信息是非常重要的情报信息,通过IP可以定位到该IP所在的国家、城市、经纬度等。获取IP信息的方式有很多,很多服务商都提供了相应的地址库或API接口服务。如国内的ipip.net,国外的ip-api.com、maxmind.com等。很多公司都是使用Maxmind网站的IP信息库,里面包含着IP的详细信息,......
  • Python 执行 Shell命令
    方法一:os.system() os.system()可以说是最为基本的运行shell命令的方式了,这个方法的特点就是直接运行命令,并将运行之后的状态值返回码返回,所以结果是一个int类型,这个方式比较常见是运用在只需要执行shell命令而不需要得到命令的返回结果的场景。比如执行一个创建目录的......