用Python实现运筹学——Day 10: 线性规划的计算机求解

一、学习内容

1. 使用 Python 的 scipy.optimize.linprog 进行线性规划求解

scipy.optimize.linprog 是 Python 中用于求解线性规划问题的函数。它实现了单纯形法、内点法等算法,能够处理求解最大化或最小化问题,同时满足线性约束条件。

  • 线性规划问题的形式: 线性规划问题可以描述为:

    目标函数

    约束条件

    其中,x 是决策变量,c 是目标函数的系数向量,A 是约束条件的系数矩阵,b 是约束的右端常数项。

2. Python 实现线性规划求解

在 Python 中,我们可以通过 scipy.optimize.linprog 函数求解上述形式的线性规划问题。该函数接受目标函数的系数、约束条件、变量的上下界等参数,并返回最优解和相关信息。

3. 案例学习:公司生产问题

假设某公司生产两种产品 AAA 和 BBB,它们的每单位利润分别为 40 元和 30 元。生产这两种产品时需要消耗两种资源,资源 1 和资源 2 的需求及可用量如下:

产品 每单位利润(元) 资源 1 需求(单位) 资源 2 需求(单位)
产品 A 40 3 2
产品 B 30 1 2

资源 1 和资源 2 的可用量分别为 200 和 150 单位。公司希望最大化总利润。


二、线性规划模型

  1. 决策变量

    • :生产产品 A 的数量。
    • :生产产品 B 的数量。
  2. 目标函数: 最大化利润:

  3. 约束条件

资源 1 的约束:

资源 2 的约束:

非负性约束:


三、Python 实现:使用 scipy.optimize.linprog 求解线性规划问题

python 复制代码
import numpy as np
from scipy.optimize import linprog

# 目标函数系数 (最大化问题转换为最小化,乘以 -1)
c = [-40, -30]  # 利润系数

# 约束条件矩阵 A 和 b (左边系数和右边常数)
A = [
    [3, 1],  # 资源 1 的限制
    [2, 2]   # 资源 2 的限制
]
b = [200, 150]  # 资源 1 和资源 2 的可用量

# 变量的边界(非负性约束)
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"生产产品 A 的数量:{result.x[0]:.2f}")
    print(f"生产产品 B 的数量:{result.x[1]:.2f}")
    print(f"最大总利润:{-result.fun:.2f} 元")
else:
    print("优化失败。")

代码解释

  1. 目标函数 : 由于 linprog 求解的是最小化问题,我们将最大化问题的目标函数系数 乘以 -1,转换为最小化问题,即​。

  2. 约束条件: 我们构造了资源 1 和资源 2 的约束条件矩阵 A 和对应的资源数量 b。

  3. 变量的边界 均为非负数,表示生产数量不能为负。

  4. 求解方法 : 使用 method='simplex' 指定单纯形法求解。

运行结果分析

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

示例运行结果

python 复制代码
优化成功!
生产产品 A 的数量:50.00
生产产品 B 的数量:50.00
最大总利润:3500.00 元

分析结果

  • 生产 50 单位的产品 A 和 50 单位的产品 B 可以获得最大利润 3500 元。
  • 通过合理分配资源,公司可以在约束条件下达到利润最大化。

四、总结

通过使用 Python 中的 scipy.optimize.linprog 函数,我们可以轻松地求解线性规划问题。在实际应用中,线性规划广泛用于生产、资源分配、物流等领域。使用 linprog 工具可以有效解决这些问题并找到最优解。同时,借助线性规划的数学模型,我们可以通过构造目标函数和约束条件对各种实际问题进行建模并求解。

相关推荐
Ambition_LAO17 分钟前
Python--导入模块报错处理
python
ww大魔王丷17 分钟前
python 棒棒糖图
python
s_little_monster25 分钟前
【C++】多态(上)
开发语言·c++·经验分享·笔记·学习·学习方法
卑微求AC28 分钟前
(C语言贪吃蛇)12.Linux线程概念引入及编程实现
linux·c语言·开发语言
风槐啊28 分钟前
四、Java 基础语法
java·开发语言·markdown
梦幻通灵1 小时前
Postman另存的curl脚本调试运行
java·开发语言·ide
Java搬砖组长1 小时前
Bilibili视频如何保存到本地
python·音视频
call_me_wangcheng1 小时前
django创建一个新的应用
数据库·python·django
ZLRRLZ1 小时前
【C++】C++基础
开发语言·c++