用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 进行建模和求解,可以帮助我们快速高效地找到最优方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值