一、学习内容
在本节中,我们将综合应用之前学习的线性规划知识,解决一个复杂的实际问题。通过这个实战项目,进一步理解线性规划在资源分配问题中的应用。
二、实战案例:公司资源分配问题
2.1 问题描述:
某公司生产两种产品 和 ,这两种产品的生产需要消耗三种资源:机器时间、人力资源、原材料。公司的目标是在满足生产需求的前提下,最大化利润。
已知以下信息:
- 每单位产品的资源消耗量:
资源 | 单位资源消耗 | 单位资源消耗 |
---|---|---|
机器时间 | 3 小时 | 5 小时 |
人力资源 | 2 人小时 | 3 人小时 |
原材料 | 4 单位 | 2 单位 |
- 资源的总供应量:
资源 | 总供应量 |
---|---|
机器时间 | 180 小时 |
人力资源 | 120 小时 |
原材料 | 160 单位 |
- 产品的利润:
产品 | 单位利润(元) |
---|---|
| 40 |
| 30 |
目标是确定公司生产两种产品的最优数量,以最大化利润。
2.2 线性规划模型
-
决策变量:
- :生产 的数量。
- :生产 的数量。
-
目标函数:
- 最大化总利润:
-
约束条件:
- 机器时间约束:
- 人力资源约束:
- 原材料约束:
- 非负性约束:
三、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 代码解释
-
目标函数:
- 目标是最大化利润:
由于
linprog
只能求解最小化问题,因此我们对目标函数取负数,将其转换为最小化问题: -
约束条件:
- 机器时间、人力资源、原材料的约束分别表示为:,,
这些约束条件通过矩阵 A和向量 b 进行表示。
-
变量的边界:
- 和 都必须为非负,因此设置非负性约束。
-
求解方法:
- 使用
method='simplex'
指定单纯形法来求解问题。
- 使用
3.2 运行结果分析
运行程序后,将得到最优的产品生产数量和最大化的利润。
示例运行结果
优化成功!
生产 P1 的数量:30.00
生产 P2 的数量:12.00
最大化的利润:1560.00 元
分析结果:
- 通过优化计算,得到了最优的生产数量:生产 30 单位的 和 12 单位的 。
- 最大化的利润为 1560 元。
该结果是在满足所有资源约束的前提下,通过线性规划求解得到的最优方案。工厂应按照该生产计划分配资源,以实现最大化利润。
四、总结
通过本节的项目实战,我们复习并综合应用了线性规划的基础知识和求解方法,解决了公司资源分配问题。使用 Python 进行建模和求解,可以帮助我们快速高效地找到最优方案。