当前位置: 首页 > news >正文

用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 元,最小化了每个月的生产成本和储存成本。

四、总结

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


http://www.mrgr.cn/news/44377.html

相关文章:

  • Arduino UNO R3自学笔记21 之 Arduino电机的闭环控制(PID)
  • C# 泛型集合实战:List<T>与Dictionary<TKey, TValue>的使用与优势
  • 给Linux操作系统命令取个别名
  • 【含文档】基于Springboot+Android的房屋租赁App(含源码+数据库+lw)
  • 数据采集工具sqoop介绍
  • 高级java每日一道面试题-2024年10月6日-数据库篇-MVCC是什么? 它的底层原理是什么?
  • 设计模式的学习
  • Trie树之最大异或对问题
  • C语言 | Leetcode C语言题解之第461题汉明距离
  • VMware ESXi 7.0U3q macOS Unlocker OEM BIOS 2.7 Dell HPE 联想定制版 9 月更新发布
  • 【Canvas与色彩】十二等分多彩隔断圆环
  • 单链表的分解
  • 【QT】QT入门
  • 前沿论文创新点集合
  • 输电线路悬垂线夹检测无人机航拍图像数据集,总共1600左右图片,悬垂线夹识别,标注为voc格式
  • 通用版本升级规范
  • 微软推出针对个人的 “AI伴侣” Copilot 会根据用户的行为模式、习惯自动进化
  • 二叉树的进阶
  • 五、存储引擎
  • 详细分析Spring Framework中 @ConditionalOnProperty的基本知识(附Demo)