最大化运输问题求解——Python实现

运输问题(Transportation Problem)是运筹学中的经典问题,通常涉及将资源从供应点转移到需求点,以最小化运输成本或满足需求。这个问题在各种实际场景中都有广泛的应用。如在供应链管理中,最小化运输问题可用于确定最有效的货物运输方式,以满足各个节点之间的需求。这包括原材料从供应商到制造商、成品从制造商到分销商、以及最终产品从分销商到消费者的运输。最大化运输问题关注的是如何最优地分配有限的资源,以在给定约束条件下实现运输总量的最大化,这类问题在物流、供应链管理、生产规划等领域有着广泛的应用,最大化的运输问题可以通过适当的转化转换为最小化运输问题。

一、最小化运输问题

最小化运输问题(transportation problem) 属于线性规划问题,可以根据模型按照线性规划的方式求解,但由于其特殊性,用常规的线性规划来求解并不是最有效的方法,它是运输问题的标准型,后面简称为运输问题。

1.1运输问题的数学模型

一般地,产销平衡的运输问题可以表述为:设有m个地点(称为产地或发地)A1,A2,...,Am的某种物资调至n个地点(称为销地或收地)B1,B2,...,Bn,各个产地需要调出的物资量分别为ai单位,各个销地需要调进的物资量分别为bj 单位,且各个发点的供应量之和等于各个收点的需求量之和。已知每个发点Ai 到每个收点Bj 调运单位物资的价格为cij,现问如何安排调运,才能使总运费最小。
于是得产销平衡运输问题的数学模型:

minz = i=1mj=1ncijxij
j=1nxij=aii=1,2,...,m
i=1mxij=bjj=1,2,...,n
xij0i=1,2,...,m,j=1,2,...,n
不平衡运输问题只要简单地调整约束的松紧关系即得。

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 最大化运输问题

运输问题是一个经典的线性规划问题,涉及到如何在满足一定约束条件的情况下,最小化或最大化某种运输成本或收益。产销平衡的运输问题可以表述为:设有m个地点(称为产地或发地)A1,A2,...,Am的某种物资调至n个地点(称为销地或收地)B1,B2,...,Bn,各个产地需要调出的物资量分别为ai单位,各个销地需要调进的物资量分别为bj 单位,且各个发点的供应量之和等于各个收点的需求量之和。已知每个发点Ai 到每个收点Bj 调运单位物资的利润为rij,见下表,现问如何安排调运,才能使总利润最大。

产地 销地 B1 B2 ... Bn 供应量
A1 r11 r12 ... r1n a1
A2 r21 r22 ... r2n a2
... ... ... ... ... ...
Am rm1 rm2 ... rmn am
需求量 b1 b2 ... bn j=1nbj=i=1mai

xij表示从从第i个产地到第j个销地的货物运输量。于是得产销平衡最大化运输问题的数学模型:
maxz = i=1mj=1nrijxij
j=1nxij=aii=1,2,...,m
i=1mxij=bjj=1,2,...,n
xij0i=1,2,...,m,j=1,2,...,n
不平衡运输问题只要简单地调整约束的松紧关系即得。

例2: 某三个煤炭厂供应3个地区,假定等量的煤炭在这些地区使用效果相同,已知各煤炭厂年产量,各地区的需要量及从各煤炭厂到各地区的单位利润如下表所示,试决定最优的调运方案。

表1 B1 B2 B3 产量
A1 2 5 8 9
A2 9 10 7 10
A3 6 5 4 12
销量 8 14 9

若产地(煤炭厂)Ai(i=1,2,3) 到销地(地区)Bj(j=1,2,3)的运量为xij,建立的数学模型如下形式:

maxZ=i=1mj=1nrijxijs.t{j=1nxij=ai    ( i=1,2,3,,m )i=1mxij=bj    ( j=1,2,3,,n )xij0    ( i=1,2,3,,m  ;  j=1,2,3,,n )

该模型就是最大化运输问题的数学模型,目标函数求最大。为不重复建立理论可将最大化运输问题转化为最小化的运输问题, 给目标函数所有的数都乘以-1,得表2

表2 B1 B2 B3 产量
A1 -2 -5 -8 9
A2 -9 -10 -7 10
A3 -6 -5 -4 12
销量 8 14 9

在所有值都变为负数后, 为了方便计算, 给所有的值都加上一个正数, 计算的数值虽然不同, 但是最终的运输方案相同,最后重新代入原模型计算最优值即可。如加上 14 , 表格变为:

表3 B1 B2 B3 产量
A1 12 9 6 9
A2 5 4 7 10
A3 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

该运输问题的数学模型为

maxz=i=1mj=1nrijxijj=1nxij=ai(i=1,2,,m)i=1mxij=bj(j=1,2,,n)xij0

由于是最大化运输问题,所以用一个常数(常选择单位利润中的最大数) 减去单位利润表本中的各数, 再运用表上作业法求出最优解,然后代入原目标函数就得最大值。利用上表中最大的数 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

最大利润为

1500×9 元 +2000×5 元 +500×6 元 +2500×7 元 +3500×8 元 =72000 元 

3.3 考研试题2

某自行车制造公司设有两个装配厂, 且在四个地区有销售公司。两个装配厂的有关数据如表I所示,四个销售公司的需求量如表II所示,从两个装配厂到四个销售公司的运价表如表III所示。各家销售公司需要的自行车应由哪个厂装配,才能保证公司获得最大利润?

IAB/11001000/(/)4555

II1234/500300550650

III1234A94718B217158

解 本题是求公司的最大利润, 但题目没有告诉每辆自行车的售价, 可以把价格看作是确定的 (因为生产量是确定的),求利润最大,其实就是求成本最小。此题有装配费用,但由于生产量是确定的,所以装配费用也是确定的。
本题两个装配厂生产量为 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

应用表上作业法求出最优解,见下表所示。

12345/A1503005501001100B3506501000/500300550650100

注 本题也可以把装配费用加到运价表中,所得的最优解是相同的。这是因为在运输问题的单位运价表的某一行加上一个常数,最优解不变。

三、练习题

3.1 练习1

某化学公司有甲、乙、丙、丁四个化工厂生产某种产品,产量分别为 200300400100(t),供应I、II、III、IV、V、VI六个地区的需要, 需要量分别为 200150400100150150(t)。由于工艺、技术等条件差别,各厂每 kg 产品成本分别为1.2、1.4、1.1、1.5(元),又由于行情不同,各地区销售价分别为 2.02.41.82.21.62.0(/kg) 。已知从各厂运往各销售地区每 kg 产品运价如下表所示。如第III个地区至少供应100t,第IV个地区的需要必须全部满足,试确定使该公司获利最大的产品调运方案。

IIIIIIIVVVI0.50.40.30.40.30.10.30.80.90.50.60.20.70.70.30.70.40.40.60.40.20.60.50.8

假设:xij为从工厂i运往地区j 的产品量(以千克为单位),cij为从工厂i运往地区j 每千克产品的运价,si为工厂i 生产的产品总量(以千克为单位),dj 为地区j的需求量(以千克为单位),pi为工厂i 生产的每千克产品的成本,rj为地区j销售的每千克产品的价格。数学模型如下:

maxi=14j=16(rjpicij)xij

约束条件:

每个工厂的产品供应不能超过其产量:j=16xijsi,其中 i=1,2,3,4;
每个地区的需求必须得到满足:i=14xijdj,其中 j=1,2,3,4,5,6;
第III个地区至少供应100t:xi3100,其中 i=1,2,3,4;
第IV个地区的需求必须全部满足:i=14xi4=d4

这样建立的数学模型可以通过线性规划方法求解,得到使公司获利最大的产品调运方案。

3.2 练习2

已知某工厂生产 A B 两种产品,月产能为 300 件、500 件,有甲乙两个经销商,对应的月需求量分别为 400300 件。受经营环境限制,要求A产品至少销售250件,且甲经销商获得B产品的数量不多于200件,各经销商售卖产品利润如下表所示,试确定最大利润及分配方案。(北京交通大学2001真题)

A57300B128500400300

3.3 练习3

某玩具公司分别生产三种新型玩具, 每月可供应分别为 1000 件、2000件和 2000 件, 它们分别被送到甲、乙、丙三个百货商店销售。已知每月百货商店各类玩具预期销售量均为 1500 件,由于经营方面原因, 各商店销售不同玩具的盈利额不同(见下表)。又知丙百货商店要求至少供应C玩具1000件, 而拒绝进 A 玩具。求满足上述条件下使总利润额为最大的供销分配方案。

A541000B16892000C1210112000

四、总结

最大化运输问题涉及在有限资源和供需之间找到最佳的分配方案,以最大化总运输量或利润,该问题通常使用线性规划方法求解,考虑到各供应地点到需求地点的运输成本、供需之间的配额限制以及各地点之间的运输容量限制。解决此问题的关键是建立一个有效的运输网络模型,其中节点表示供应地点和需求地点,边表示可能的运输路径,并确保在满足供需约束的同时最大化总运输量或利润。在生产规划领域,最大化运输问题要求如何最优地安排生产流程和产品配送,以最大化生产效率和满足市场需求。例如,一家汽车制造商需要决定在不同工厂生产多少辆不同类型的汽车,并将它们运送到全球各地的经销商处。通过运筹学中的线性规划或整数规划方法,企业可以优化生产计划和物流配送,以实现利润最大化或成本最小化,其实最大化与最小化运输问题是一个问题的两个视角,从求解过程中就可以领略。

参考文献

1. 运输规划求最大值问题示例
2.运输问题之最小配置问题
3.Python数学建模PuLP库线性规划入门示例详解

最小配置问题

某航运公司承担六个港口城市 ABCDEF 的四条固定航线的物质运输任务。已知各条航线的起点、终点城市及每天航班数见表4。

4线1ED32BC23AF14DB1

假定各条航线使用相同型号的船只,又各城市间的航程天数见表5。

5ABCDEFA0121477B1031388C2301555D14131501720E7851703F7852030

又知每条船只每次装卸货的时间各需1天,则该航运公司至少应配备多少条船, 才能满足所有航线的运货需求?

解 该公司所需配备船只分两部分。(1) 载货航程需要的周转船只数。例如航线1,在港口E装货 1 天, ED 航程17天,在D卸货1天,总计19天。每天3航班,故该航线周转船只需57条。各条航线周转所需船只数见表6。

6线11171193572131521031719194113115115

需周转船只数合计为91只。
(2)各港口间调度所需船只数。有些港口每天到达船只数多于需要船数,例如港口D,每天到达3条,需求1条; 而有港口到达数少于需求数, 例如港口B。各港口每天余缺船只数的计算见表7。

7A011B121C202D312E033F101

为使配备船只数最少, 应做到周转的空船数为最少。因此建立以下运输问题, 其产销平衡表见表8。

8ABEC2D2F1113

单位运价表应为相应各港口之间的船只航程天数,见表9。

9ABEC235D141317F783

用表上作业法求出空船的最优调度方案见表10。

10ABEC112D112F111135

由表10知最少需周转的空船数为

2×1+13×1+5×1+17×1+3×1=40 条。 

这样在不考虑维修、储备等情况下, 该公司至少应配备 40+91=131 条船。

中转运输

有一条运输链路:1. 3 个工厂到 5 各仓库的运输费; 2. 5 个仓库到 8 个分店的运输费。我们从表格中可以看到这两方面的运输费的各自的运输费单价。
表1:3 个工厂到 5 个仓库的运输单价(元/件)

B1B2B3B4B5A1...10141713A2108...916A31516915...

表2: 5 个仓库到 8 个分店的单位运价(元/件)

C1C2C3C4C5C6C7C8B132363145B2335253B352554B4414422B522535252

从这两个表格中我们可以分析,从 3 个加工厂运输物资到 8 个分店的路线图如下:

从上面的图中, 我们可以算出从 3 个加工厂到 8 各分店之间共有 120(358=120) 条路线,我们可以利用上面那个表格进行整合,让 Aa,Bb这两个量进行组合,再让 BbCc, 这两个量进行组合,最后将这两个组合的所有组合进行叠加,取出其中 3 个厂分别到 8 个分店的最佳的路线,使得运输费单价最小。具体见如下表格:

/ClC2C3C4C5C6C7$C8$()A1151313161512151315200A2131011131110111110500A3141611141714171311200()32905090445048001440485050204840

运输问题

IIB1 B2 B3 B4 产量 A15310490A2269640A314105770 销量 305010040

posted @   郝hai  阅读(672)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示