最大化运输问题求解——Python实现
运输问题(Transportation Problem)是运筹学中的经典问题,通常涉及将资源从供应点转移到需求点,以最小化运输成本或满足需求。这个问题在各种实际场景中都有广泛的应用。如在供应链管理中,最小化运输问题可用于确定最有效的货物运输方式,以满足各个节点之间的需求。这包括原材料从供应商到制造商、成品从制造商到分销商、以及最终产品从分销商到消费者的运输。最大化运输问题关注的是如何最优地分配有限的资源,以在给定约束条件下实现运输总量的最大化,这类问题在物流、供应链管理、生产规划等领域有着广泛的应用,最大化的运输问题可以通过适当的转化转换为最小化运输问题。
一、最小化运输问题
最小化运输问题(transportation problem) 属于线性规划问题,可以根据模型按照线性规划的方式求解,但由于其特殊性,用常规的线性规划来求解并不是最有效的方法,它是运输问题的标准型,后面简称为运输问题。
1.1运输问题的数学模型
一般地,产销平衡的运输问题可以表述为:设有个地点(称为产地或发地),,...,的某种物资调至个地点(称为销地或收地),,...,,各个产地需要调出的物资量分别为单位,各个销地需要调进的物资量分别为 单位,且各个发点的供应量之和等于各个收点的需求量之和。已知每个发点 到每个收点 调运单位物资的价格为,现问如何安排调运,才能使总运费最小。
于是得产销平衡运输问题的数学模型:
=
=
=
不平衡运输问题只要简单地调整约束的松紧关系即得。
1.2 Python计算程序
例1: 有三个造纸厂A1、A2 和A3,造纸量分别为16 个单位、10 个单位和22 个单位,四个客户B1、B2、B3 和B4 的需求量分别为8 个单位、14 个单位、12 个单位和14 个单位。造纸厂到客户之间的单位运价如表所示,确定总运费最少的调运方案。单位运价表如下所示:
[[ 4 12 4 11]
[ 2 10 3 9]
[ 8 5 11 6]]
总产量等于总销量,都为48个单位,这是一个产销平衡的运输问题。
Python代码及运行结果如下:
import pulp
import numpy as np
from pprint import pprint
def transportation_problem(costs, x_max, y_max):
row = len(costs)
col = len(costs[0])
prob = pulp.LpProblem('Transportation Problem', sense=pulp.LpMinimize)
var = [[pulp.LpVariable(f'x{i}{j}', lowBound=0, cat=pulp.LpInteger) for j in range(col)] for i in range(row)]
flatten = lambda x: [y for l in x for y in flatten(l)] if type(x) is list else [x]
prob += pulp.lpDot(flatten(var), costs.flatten())
for i in range(row):
prob += (pulp.lpSum(var[i]) == x_max[i])
for j in range(col):
prob += (pulp.lpSum([var[i][j] for i in range(row)]) == y_max[j])
prob.solve()
return {'objective':pulp.value(prob.objective), 'var': [[pulp.value(var[i][j]) for j in range(col)] for i in range(row)]}
if __name__ == '__main__':
costs = np.array([[4, 12, 4, 11],
[2, 10, 3, 9],
[8, 5, 11, 6]])
max_plant = [16, 10, 22]
max_cultivation = [8, 14, 12, 14]
res = transportation_problem(costs, max_plant, max_cultivation)
print(f'最小值为{res["objective"]}')
print('各变量的取值为:')
pprint(res['var'])
二、最大化运输问题
随着已知条件的不同,比如在运输中考虑的是单位利润,就得到最大化运输问题。
2.1 最大化运输问题
运输问题是一个经典的线性规划问题,涉及到如何在满足一定约束条件的情况下,最小化或最大化某种运输成本或收益。产销平衡的运输问题可以表述为:设有个地点(称为产地或发地),,...,的某种物资调至个地点(称为销地或收地),,...,,各个产地需要调出的物资量分别为单位,各个销地需要调进的物资量分别为 单位,且各个发点的供应量之和等于各个收点的需求量之和。已知每个发点 到每个收点 调运单位物资的利润为,见下表,现问如何安排调运,才能使总利润最大。
产地 销地 | ... | 供应量 | |||
---|---|---|---|---|---|
... | |||||
... | |||||
... | ... | ... | ... | ... | ... |
... | |||||
需求量 | ... |
设表示从从第个产地到第个销地的货物运输量。于是得产销平衡最大化运输问题的数学模型:
=
=
=
不平衡运输问题只要简单地调整约束的松紧关系即得。
例2: 某三个煤炭厂供应3个地区,假定等量的煤炭在这些地区使用效果相同,已知各煤炭厂年产量,各地区的需要量及从各煤炭厂到各地区的单位利润如下表所示,试决定最优的调运方案。
表1 | | | | 产量 |
---|---|---|---|---|
2 | 5 | 8 | 9 | |
| 9 | 10 | 7 | 10 |
| 6 | 5 | 4 | 12 |
销量 | 8 | 14 | 9 |
若产地(煤炭厂) 到销地(地区)的运量为,建立的数学模型如下形式:
该模型就是最大化运输问题的数学模型,目标函数求最大。为不重复建立理论可将最大化运输问题转化为最小化的运输问题, 给目标函数所有的数都乘以-1,得表2
表2 | | | | 产量 |
---|---|---|---|---|
-2 | -5 | -8 | 9 | |
| -9 | -10 | -7 | 10 |
| -6 | -5 | -4 | 12 |
销量 | 8 | 14 | 9 |
在所有值都变为负数后, 为了方便计算, 给所有的值都加上一个正数, 计算的数值虽然不同, 但是最终的运输方案相同,最后重新代入原模型计算最优值即可。如加上 14 , 表格变为:
表3 | | | | 产量 |
---|---|---|---|---|
12 | 9 | 6 | 9 | |
| 5 | 4 | 7 | 10 |
| 8 | 9 | 10 | 12 |
销量 | 8 | 14 | 9 |
求解最小化运输问题得出最优解,然后代入原目标函数即可求出最大利润。
3.2 考研试题1
某超市在外地采购 A,B,C,D四种规格的服装,数量分别为:A——1300套,B——2000套,C——3000套,D——3500套。有三个城市供应上述规格的服装且质量、运价和销量情况不同, 预计售出后的利润也不同, 详见下表。请为该公司制定一个预期总利润最大的采购方案。
城市 | 服装 A | 服装 B | 服装 C | 服装D | 产量/套 |
---|---|---|---|---|---|
I | 10 | 5 | 6 | 7 | 2500 |
II | 8 | 2 | 7 | 6 | 2500 |
III | 9 | 3 | 4 | 8 | 5000 |
采购量/套 | 1500 | 2000 | 3000 | 3500 | 10000\10000 |
该运输问题的数学模型为
由于是最大化运输问题,所以用一个常数(常选择单位利润中的最大数) 减去单位利润表本中的各数, 再运用表上作业法求出最优解,然后代入原目标函数就得最大值。利用上表中最大的数 10 减去表中的每个数, 得到下表:
城市 | 服装 A | 服装 B | 服装 C | 服装D | 产量/套 |
---|---|---|---|---|---|
I | 0 | 5 | 4 | 3 | 2500 |
II | 2 | 8 | 3 | 4 | 2500 |
III | 1 | 7 | 6 | 2 | 5000 |
采购量/套 | 1500 | 2000 | 3000 | 3500 | 10000\10000 |
最后可得最优解为
城市 | 服装 A | 服装 B | 服装 C | 服装D | 产量/套 |
---|---|---|---|---|---|
I | 2000 | 500 | 2500 | ||
II | 2500 | 2500 | |||
III | 1500 | 3500 | 5000 | ||
采购量/套 | 1500 | 2000 | 3000 | 3500 | 10000\10000 |
最大利润为
3.3 考研试题2
某自行车制造公司设有两个装配厂, 且在四个地区有销售公司。两个装配厂的有关数据如表I所示,四个销售公司的需求量如表II所示,从两个装配厂到四个销售公司的运价表如表III所示。各家销售公司需要的自行车应由哪个厂装配,才能保证公司获得最大利润?
解 本题是求公司的最大利润, 但题目没有告诉每辆自行车的售价, 可以把价格看作是确定的 (因为生产量是确定的),求利润最大,其实就是求成本最小。此题有装配费用,但由于生产量是确定的,所以装配费用也是确定的。
本题两个装配厂生产量为 2100 辆, 而四个销售公司的需求量为 2000 辆。为了达到产销平衡,虚拟一个销售公司 5,它的销售量为 100 辆。装配厂到虚拟销售公司的运价为 0,产销平衡的单位运价表如下所示。
装配厂 | 销售公司1 | 销售公司2 | 销售公司3 | 销售公司4 | 销售公司5 | 生产量 / 辆 |
---|---|---|---|---|---|---|
装配厂 A | 9 | 4 | 7 | 18 | 0 | 1100 |
装配厂 B | 2 | 17 | 15 | 8 | 0 | 1000 |
销售量 / 辆 | 500 | 300 | 550 | 650 | 100 | 2100 \2100 |
应用表上作业法求出最优解,见下表所示。
注 本题也可以把装配费用加到运价表中,所得的最优解是相同的。这是因为在运输问题的单位运价表的某一行加上一个常数,最优解不变。
三、练习题
3.1 练习1
某化学公司有甲、乙、丙、丁四个化工厂生产某种产品,产量分别为 ,供应I、II、III、IV、V、VI六个地区的需要, 需要量分别为 。由于工艺、技术等条件差别,各厂每 产品成本分别为1.2、1.4、1.1、1.5(元),又由于行情不同,各地区销售价分别为 元 。已知从各厂运往各销售地区每 产品运价如下表所示。如第III个地区至少供应100t,第IV个地区的需要必须全部满足,试确定使该公司获利最大的产品调运方案。
假设:为从工厂运往地区 的产品量(以千克为单位),为从工厂运往地区 每千克产品的运价,为工厂 生产的产品总量(以千克为单位), 为地区的需求量(以千克为单位),为工厂 生产的每千克产品的成本,为地区销售的每千克产品的价格。数学模型如下:
约束条件:
每个工厂的产品供应不能超过其产量:,其中 ;
每个地区的需求必须得到满足:,其中 ;
第III个地区至少供应100t:,其中 ;
第IV个地区的需求必须全部满足:。
这样建立的数学模型可以通过线性规划方法求解,得到使公司获利最大的产品调运方案。
3.2 练习2
已知某工厂生产 两种产品,月产能为 300 件、500 件,有甲乙两个经销商,对应的月需求量分别为 件。受经营环境限制,要求A产品至少销售250件,且甲经销商获得B产品的数量不多于200件,各经销商售卖产品利润如下表所示,试确定最大利润及分配方案。(北京交通大学2001真题)
3.3 练习3
某玩具公司分别生产三种新型玩具, 每月可供应分别为 1000 件、2000件和 2000 件, 它们分别被送到甲、乙、丙三个百货商店销售。已知每月百货商店各类玩具预期销售量均为 1500 件,由于经营方面原因, 各商店销售不同玩具的盈利额不同(见下表)。又知丙百货商店要求至少供应C玩具1000件, 而拒绝进 A 玩具。求满足上述条件下使总利润额为最大的供销分配方案。
四、总结
最大化运输问题涉及在有限资源和供需之间找到最佳的分配方案,以最大化总运输量或利润,该问题通常使用线性规划方法求解,考虑到各供应地点到需求地点的运输成本、供需之间的配额限制以及各地点之间的运输容量限制。解决此问题的关键是建立一个有效的运输网络模型,其中节点表示供应地点和需求地点,边表示可能的运输路径,并确保在满足供需约束的同时最大化总运输量或利润。在生产规划领域,最大化运输问题要求如何最优地安排生产流程和产品配送,以最大化生产效率和满足市场需求。例如,一家汽车制造商需要决定在不同工厂生产多少辆不同类型的汽车,并将它们运送到全球各地的经销商处。通过运筹学中的线性规划或整数规划方法,企业可以优化生产计划和物流配送,以实现利润最大化或成本最小化,其实最大化与最小化运输问题是一个问题的两个视角,从求解过程中就可以领略。
参考文献
1. 运输规划求最大值问题示例
2.运输问题之最小配置问题
3.Python数学建模PuLP库线性规划入门示例详解
最小配置问题
某航运公司承担六个港口城市 的四条固定航线的物质运输任务。已知各条航线的起点、终点城市及每天航班数见表4。
假定各条航线使用相同型号的船只,又各城市间的航程天数见表5。
又知每条船只每次装卸货的时间各需1天,则该航运公司至少应配备多少条船, 才能满足所有航线的运货需求?
解 该公司所需配备船只分两部分。(1) 载货航程需要的周转船只数。例如航线1,在港口E装货 1 天, 航程17天,在D卸货1天,总计19天。每天3航班,故该航线周转船只需57条。各条航线周转所需船只数见表6。
需周转船只数合计为91只。
(2)各港口间调度所需船只数。有些港口每天到达船只数多于需要船数,例如港口D,每天到达3条,需求1条; 而有港口到达数少于需求数, 例如港口B。各港口每天余缺船只数的计算见表7。
为使配备船只数最少, 应做到周转的空船数为最少。因此建立以下运输问题, 其产销平衡表见表8。
单位运价表应为相应各港口之间的船只航程天数,见表9。
用表上作业法求出空船的最优调度方案见表10。
由表10知最少需周转的空船数为
这样在不考虑维修、储备等情况下, 该公司至少应配备 条船。
中转运输
有一条运输链路:1. 3 个工厂到 5 各仓库的运输费; 2. 5 个仓库到 8 个分店的运输费。我们从表格中可以看到这两方面的运输费的各自的运输费单价。
表1:3 个工厂到 5 个仓库的运输单价(元/件)
表2: 5 个仓库到 8 个分店的单位运价(元/件)
从这两个表格中我们可以分析,从 3 个加工厂运输物资到 8 个分店的路线图如下:
从上面的图中, 我们可以算出从 3 个加工厂到 8 各分店之间共有 条路线,我们可以利用上面那个表格进行整合,让 这两个量进行组合,再让 , 这两个量进行组合,最后将这两个组合的所有组合进行叠加,取出其中 3 个厂分别到 8 个分店的最佳的路线,使得运输费单价最小。具体见如下表格:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!