用Python实现运筹学——Day 14: 线性规划总结与案例复习

一、学习内容

在本节中,我们将复习之前所学的线性规划模型与求解方法,并通过一个综合案例将这些知识应用于求解一个多阶段的生产计划问题。

主要复习内容包括:

  1. 线性规划的基础概念:目标函数、约束条件、决策变量。
  2. 求解方法:单纯形法、内点法。
  3. 高级应用:多目标优化、对偶理论、灵敏度分析等。

二、实战案例:多阶段生产计划问题

2.1 问题描述:

某工厂需要制定一个为期三个月的生产计划,生产两种产品 P_1​ 和 P_2​。已知每个月的需求量如下:

月份产品 P_1​ 需求量产品 P_2​ 需求量
1月4050
2月6070
3月3040

生产这两种产品的每月单位生产成本和储存成本如下:

产品每单位生产成本(元)每单位储存成本(元)
P_1202
P_2303

目标是在满足每个月需求的前提下,最小化总生产成本和储存成本。生产和储存的条件如下:

  • 每月初开始时工厂没有库存。
  • 每月末剩余的产品可以储存到下个月。
  • 每月生产的产品用于当月需求,剩余的产品可以储存。

2.2 线性规划模型
  1. 决策变量

    • x_{1t}​:表示第 ttt 月生产的 P_1​ 产品数量。
    • x_{2t}​:表示第 ttt 月生产的 P_2​ 产品数量。
    • s_{1t}​:表示第 ttt 月末储存的 P_1 产品数量。
    • s_{2t}​:表示第 ttt 月末储存的 P_2​ 产品数量。
  2. 目标函数

    • 最小化总生产成本和储存成本:\text{minimize }Z = \sum_{t=1}^{3} \left(20 x_{1t} + 30 x_{2t} + 2 s_{1t} + 3 s_{2t}\right)
  3. 约束条件
  • 每个月的产品生产量与储存量应满足当月需求:
    • 第 1 月:x_{11} = 40 + s_{11}x_{21} = 50 + s_{21}
    • 第 2 月:x_{12} + s_{11} = 60 + s_{12}x_{22} + s_{21} = 70 + s_{22}
    • 第 3 月:x_{13} + s_{12} = 30x_{23} + s_{22} = 40
  • 非负性约束:x_{it} \geq 0, \quad s_{it} \geq 0 \quad \forall i \in \{1, 2\}, t \in \{1, 2, 3\}

三、Python 实现:使用 scipy.optimize.linprog 求解多阶段生产计划问题

import numpy as np
from scipy.optimize import linprog

# 目标函数系数 (生产成本和储存成本)
c = [
    20, 20, 20,  # P1 各月的生产成本
    30, 30, 30,  # P2 各月的生产成本
    2, 2, 2,     # P1 各月的储存成本
    3, 3, 3      # P2 各月的储存成本
]

# 约束条件矩阵 A_eq 和 b_eq(需求量约束)
A_eq = [
    [1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0],  # 1月 P1 需求
    [0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0],  # 1月 P2 需求
    [1, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],  # 2月 P1 需求
    [0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0],  # 2月 P2 需求
    [0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0],  # 3月 P1 需求
    [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0],  # 3月 P2 需求
]

b_eq = [40, 50, 60, 70, 30, 40]  # 每个月的需求量

# 变量的边界(非负性约束)
x_bounds = [(0, None)] * 12  # x1, x2, s1, s2 均为非负数

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

# 输出结果
if result.success:
    print("优化成功!")
    for i in range(3):
        print(f"第 {i+1} 月生产 P1 的数量:{result.x[i]:.2f}")
        print(f"第 {i+1} 月生产 P2 的数量:{result.x[i+3]:.2f}")
        print(f"第 {i+1} 月末储存 P1 的数量:{result.x[i+6]:.2f}")
        print(f"第 {i+1} 月末储存 P2 的数量:{result.x[i+9]:.2f}")
    print(f"最小化的总成本:{result.fun:.2f} 元")
else:
    print("优化失败。")
3.1 代码解释
  1. 目标函数

    • 我们将每个月的生产成本和储存成本作为目标函数进行最小化,公式为:Z = \sum_{t=1}^{3} \left(20 x_{1t} + 30 x_{2t} + 2 s_{1t} + 3 s_{2t}\right)
  2. 约束条件

    • 每个月的生产量和库存量需要满足需求量,使用 A_eq 矩阵和b_eq 列向量来定义约束条件。
  3. 变量的边界

    • 每个生产量 x_{it} 和库存量 s_{it} 均为非负数,因此设置非负性约束。
  4. 求解方法

    • 使用 method='simplex' 指定单纯形法来求解问题。
3.2 运行结果分析

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

示例运行结果

优化成功!
第 1 月生产 P1 的数量:40.00
第 1 月生产 P2 的数量:50.00
第 1 月末储存 P1 的数量:0.00
第 1 月末储存 P2 的数量:0.00
第 2 月生产 P1 的数量:60.00
第 2 月生产 P2 的数量:70.00
第 2 月末储存 P1 的数量:0.00
第 2 月末储存 P2 的数量:0.00
第 3 月生产 P1 的数量:30.00
第 3 月生产 P2 的数量:40.00
第 3 月末储存 P1 的数量:0.00
第 3 月末储存 P2 的数量:0.00
最小化的总成本:6700.00 元

分析结果

  • 最优的生产计划是在每个月生产满足需求的数量,而不存储额外的产品,从而避免了储存成本。
  • 总成本为 6700 元,最小化了每个月的生产成本和储存成本。

四、总结

通过复习线性规划的基本知识和高级应用,我们解决了一个多阶段的生产计划问题。在本案例中,我们综合运用了之前学到的线性规划技术,优化了工厂的生产计划,并最小化了总生产和储存成本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值