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

用Python实现运筹学——Day 15: 线性规划的项目实战

一、学习内容

在本节中,我们将综合应用之前学习的线性规划知识,解决一个复杂的实际问题。通过这个实战项目,进一步理解线性规划在资源分配问题中的应用。


二、实战案例:公司资源分配问题

2.1 问题描述:

某公司生产两种产品 P_1​ 和 P_2,这两种产品的生产需要消耗三种资源:机器时间、人力资源、原材料。公司的目标是在满足生产需求的前提下,最大化利润。

已知以下信息:

  1. 每单位产品的资源消耗量
资源P_1 单位资源消耗P_2​ 单位资源消耗
机器时间3 小时5 小时
人力资源2 人小时3 人小时
原材料4 单位2 单位
  1. 资源的总供应量
资源总供应量
机器时间180 小时
人力资源120 小时
原材料160 单位
  1. 产品的利润
产品单位利润(元)
P_140
P_230

目标是确定公司生产两种产品的最优数量,以最大化利润。


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

    • x_1​:生产 P_1​ 的数量。
    • x_2​:生产 P_2​ 的数量。
  2. 目标函数

    • 最大化总利润:\text{maximize } Z = 40 x_1 + 30 x_2
  3. 约束条件

    • 机器时间约束:3 x_1 + 5 x_2 \leq 180
    • 人力资源约束:2 x_1 + 3 x_2 \leq 120
    • 原材料约束:4 x_1 + 2 x_2 \leq 160
    • 非负性约束:x_1 \geq 0, \quad x_2 \geq 0

三、Python 实现:使用 scipy.optimize.linprog 求解公司资源分配问题

import numpy as np
from scipy.optimize import linprog# 目标函数系数 (利润)
c = [-40, -30]  # linprog 是求最小化问题,因此目标函数取负值# 约束条件矩阵 A_ub 和 b_ub
A = [[3, 5],  # 机器时间约束[2, 3],  # 人力资源约束[4, 2]   # 原材料约束
]
b = [180, 120, 160]  # 各资源的总供应量# 变量的边界(非负性约束)
x_bounds = [(0, None), (0, None)]  # x1 和 x2 均为非负数# 使用单纯形法求解线性规划问题
result = linprog(c, A_ub=A, b_ub=b, bounds=x_bounds, method='simplex')# 输出结果
if result.success:print("优化成功!")print(f"生产 P1 的数量:{result.x[0]:.2f}")print(f"生产 P2 的数量:{result.x[1]:.2f}")print(f"最大化的利润:{-result.fun:.2f} 元")
else:print("优化失败。")
3.1 代码解释
  1. 目标函数

    • 目标是最大化利润:Z = 40 x_1 + 30 x_2

    由于 linprog 只能求解最小化问题,因此我们对目标函数取负数,将其转换为最小化问题:Z = - (40 x_1 + 30 x_2)

  2. 约束条件

    • 机器时间、人力资源、原材料的约束分别表示为:3 x_1 + 5 x_2 \leq 1802 x_1 + 3 x_2 \leq 1204 x_1 + 2 x_2 \leq 160

    这些约束条件通过矩阵 A和向量 b 进行表示。

  3. 变量的边界

    • x_1​ 和 x_2​ 都必须为非负,因此设置非负性约束。
  4. 求解方法

    • 使用 method='simplex' 指定单纯形法来求解问题。

3.2 运行结果分析

运行程序后,将得到最优的产品生产数量和最大化的利润。

示例运行结果

优化成功!
生产 P1 的数量:30.00
生产 P2 的数量:12.00
最大化的利润:1560.00 元

分析结果

  • 通过优化计算,得到了最优的生产数量:生产 30 单位的 P_1​ 和 12 单位的 P_2​。
  • 最大化的利润为 1560 元。

该结果是在满足所有资源约束的前提下,通过线性规划求解得到的最优方案。工厂应按照该生产计划分配资源,以实现最大化利润。

四、总结

通过本节的项目实战,我们复习并综合应用了线性规划的基础知识和求解方法,解决了公司资源分配问题。使用 Python 进行建模和求解,可以帮助我们快速高效地找到最优方案。


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

相关文章:

  • 【动态规划】斐波那契模型 dp
  • 基于Springboot vue的流浪狗领养管理系统设计与实现
  • Spring Boot 进阶-详解Spring Boot整合数据库
  • ASR的King:我又回来了,更小,且更快——openai/whisper-large-v3-turbo
  • 【C++堆(优先队列)】2233. K 次增加后的最大乘积|1685
  • 深度优先搜索与并查集
  • Windows VSCode 配置 Java 环境 (Maven)
  • Steam Deck掌机可装“黑苹果” 开发者成功安装macOS 15 Sequoia
  • 织物布匹疵点检测数据集,布匹缺陷检测数据集 标注工具:LabelImg 数量:已标注1084张(5类);未标注:2000余张
  • Vue 3 中实现懒加载功能
  • 数据结构——优先级队列(堆)
  • python画图|曲线动态输出基础教程
  • 什么是安全运营中心 SOC?
  • 第三课 Vue中的方法的定义及事件绑定指令
  • 线性代数入门指南
  • 『网络游戏』制作提示弹窗UI【03】
  • 线性代数入门
  • 正确理解协程
  • 读数据工程之道:设计和构建健壮的数据系统02数据工程师
  • 【星闪开发连载】SLE_UUID_Server和SLE_UUID_Client程序测试