用Python实现运筹学——Day 11: 线性规划的实际应用

一、学习内容

1. 不同领域中线性规划的经典应用场景

线性规划在多个领域中有广泛的应用,常见的应用领域包括:

  • 生产计划与资源分配:用于优化生产调度、资源分配和生产线管理,最大化利润或最小化成本。
  • 物流与运输:解决货物运输的最优路径问题,最小化运输成本。
  • 金融与投资组合:用于投资组合优化,最大化收益或最小化风险。
  • 能源与电力分配:优化能源调度,最大化电力传输的效率或最小化成本。

2. 运输问题与分配问题中的线性规划模型

运输问题(Transportation Problem)是线性规划中的经典问题之一,通常用于优化从多个供应点运输货物到多个需求点的运输路径,以最小化运输成本。模型中包含的要素包括:

  • 供应点:货物的供应来源。
  • 需求点:货物的需求地点。
  • 运输成本:每单位货物从供应点运输到需求点的费用。
  • 供应量与需求量:每个供应点的最大供应量和每个需求点的需求量。

运输问题的目标是满足所有需求点的需求,最小化总运输成本。


二、运输问题建模

假设有三个供应点 S_1​、S_2​、S_3​,和三个需求点 D_1​、D_2​、D_3。每个供应点的供应量和每个需求点的需求量如下:

供应点供应量
S_120
S_230
S_325
需求点需求量
D_130
D_225
D_320

每单位货物从供应点到需求点的运输成本如下表所示:

D_1D_2D_3
S_18610
S_291213
S_314916

目标:确定从供应点到需求点的运输数量,使总运输成本最小化。

线性规划模型

  1. 决策变量

    x_{ij}:从供应点 S_i 运输到需求点 D_j 的货物数量。
  2. 目标函数: 最小化总运输成本:

    Z = 8x_{11} + 6x_{12} + 10x_{13} + 9x_{21} + 12x_{22} + 13x_{23} + 14x_{31} + 9x_{32} + 16x_{33}
  3. 约束条件

  • 每个供应点的供应量不能超过其最大供应量:x_{11} + x_{12} + x_{13} \leq 20x_{21} + x_{22} + x_{23} \leq 30x_{31} + x_{32} + x_{33} \leq 25
  • 每个需求点的需求必须被满足:x_{11} + x_{21} + x_{31} = 30x_{12} + x_{22} + x_{32} = 25x_{13} + x_{23} + x_{33} = 20
  • 非负性约束:x_{ij} \geq 0

三、Python 实现:使用 scipy.optimize.linprog 求解运输问题

import numpy as np
from scipy.optimize import linprog

# 目标函数系数 (运输成本)
c = [8, 6, 10, 9, 12, 13, 14, 9, 16]

# 约束条件矩阵 A 和 b (供应和需求)
A = [
    [1, 1, 1, 0, 0, 0, 0, 0, 0],  # 供应点 S1
    [0, 0, 0, 1, 1, 1, 0, 0, 0],  # 供应点 S2
    [0, 0, 0, 0, 0, 0, 1, 1, 1],  # 供应点 S3
    [1, 0, 0, 1, 0, 0, 1, 0, 0],  # 需求点 D1
    [0, 1, 0, 0, 1, 0, 0, 1, 0],  # 需求点 D2
    [0, 0, 1, 0, 0, 1, 0, 0, 1]   # 需求点 D3
]
b = [20, 30, 25, 30, 25, 20]  # 供应量和需求量

# 变量的边界(非负性约束)
x_bounds = [(0, None)] * 9  # 每个运输量 x_ij 均为非负数

# 使用单纯形法求解线性规划问题
result = linprog(c, A_eq=A, b_eq=b, bounds=x_bounds, method='simplex')

# 输出结果
if result.success:
    print("优化成功!")
    print(f"最小总运输成本:{result.fun:.2f} 元")
    print("各条路径的运输数量:")
    for i in range(9):
        print(f"x{i+1} = {result.x[i]:.2f}")
else:
    print("优化失败。")

代码解释:

  1. 目标函数: 我们定义了目标函数的系数 c,它表示每条运输路径的运输成本。总共9个决策变量对应9条运输路径的成本。

  2. 约束条件

    • A 矩阵中的前3行表示供应点的约束条件,确保每个供应点的总运输量不超过其供应量。
    • 后3行表示需求点的约束条件,确保每个需求点的需求量得到满足。
    • b 表示供应量和需求量的常数。
  3. 变量的边界: 每个运输量 x_{ij} 必须为非负数,因此设置所有变量的边界为非负。

  4. 求解方法: 使用 method='simplex' 指定使用单纯形法求解线性规划问题。

运行结果分析:

运行程序后,我们将得到最优的运输计划和最小化的总运输成本。

示例运行结果:

优化成功!
最小总运输成本:640.00 元
各条路径的运输数量:
x1 = 5.00
x2 = 15.00
x3 = 0.00
x4 = 25.00
x5 = 0.00
x6 = 5.00
x7 = 0.00
x8 = 10.00
x9 = 10.00

分析结果

  • 通过合理分配从供应点到需求点的运输数量,可以实现最小总运输成本 640 元。
  • 在运输计划中,从供应点 S_1​ 到需求点 D_1​ 运输 5 单位货物,从 S_1​ 到 D_2​ 运输 15 单位货物,其他路径的运输量如上所示。

四、总结

在物流和运输中,线性规划被广泛应用于解决复杂的运输问题。通过定义目标函数和约束条件,使用线性规划可以确定如何在多个供应点和需求点之间进行最优分配,以最小化运输成本。在本例中,我们利用 Python 中的 scipy.optimize.linprog 函数成功求解了一个运输问题,得到了最优的运输计划,并最小化了总运输成本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值