用Python实现运筹学——Day 3: 线性规划模型构建

devtools/2024/10/18 14:23:40/

一、学习内容

线性规划模型构建的步骤与技巧

线性规划(Linear Programming, LP)模型构建是运筹学中的核心内容,通常用于求解资源的最优分配问题。要从实际问题中提取出一个线性规划模型,需要按照以下步骤进行:

  1. 问题描述与分析: 首先,明确问题的实际背景,并识别问题的关键要素,如目标、限制条件和可控变量。

  2. 定义决策变量: 决策变量是影响目标函数值的变量。要明确哪些量是可以调整的,并将其设为变量。

  3. 构建目标函数: 目标函数是需要最大化或最小化的量,通常是与经济效益、成本、效率等相关的指标。目标函数应该是一个关于决策变量的线性表达式。

  4. 构建约束条件: 实际问题中的限制条件通常来源于资源的有限性、生产能力、市场需求等。这些条件通常以不等式或等式的形式表示,并且是线性的。

  5. 确定变量的非负性或其他约束: 决策变量通常有一些范围限制,如生产数量不能为负数。


二、实战案例:生产计划中的线性规划

2.1 问题描述

一家工厂生产两种产品:产品 A和产品 B。每种产品的利润、生产时间以及材料需求如下表所示:

产品每单位利润(元)每单位所需生产时间(小时)每单位材料需求(单位)
A5043
B4032

公司每天最多可提供 240 小时的生产时间和 180 单位的原材料。公司希望最大化利润,决定每天生产多少单位的产品 A 和产品 B。

2.2 构建线性规划模型
  1. 定义决策变量

    • x_1​:每天生产的产品 A 的数量。
    • x_2:每天生产的产品 B 的数量。
  2. 构建目标函数: 目标是最大化利润。利润来自生产 A 和 B,每单位 A 的利润为 50 元,每单位 B 的利润为 40 元。因此,目标函数为:

    Z = 50x_1 + 40x_2

    其中, Z 表示总利润。

  3. 构建约束条件

  • 生产时间限制:每单位 A 需要 4 小时,每单位 B需要 3 小时。总生产时间不能超过 240 小时,因此:4x_1 + 3x_2 \leq 240
  • 材料限制:每单位 A需要 3 单位原材料,每单位 B 需要 2 单位原材料。总材料消耗不能超过 180 单位,因此:3x_1 + 2x_2 \leq 180
  • 非负性约束:生产数量不能为负数:x_1 \geq 0, \quad x_2 \geq 0
2.3 Python 实现

我们将使用 scipy.optimize.linprog 函数求解这个线性规划问题。

python">import numpy as np
from scipy.optimize import linprog# 目标函数系数 (将最大化问题转为最小化,通过乘 -1)
c = [-50, -40]  # 每单位产品A和产品B的利润# 约束条件系数矩阵 (左边部分)
A = [[4, 3],   # 生产时间约束[3, 2]    # 材料需求约束
]# 约束条件右侧常数项
b = [240, 180]  # 最大生产时间和最大材料使用量# 变量的边界(非负性约束)
x_bounds = [(0, None), (0, None)]  # x1 和 x2 均为非负数# 求解线性规划问题
result = linprog(c, A_ub=A, b_ub=b, bounds=x_bounds, method='highs')# 输出结果
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("优化失败。")
2.4 代码解释
  1. 目标函数

    • 我们需要最大化目标函数 Z = 50x_1 + 40x_2​。在 scipy.optimize.linprog 中只能处理最小化问题,因此我们将目标函数的系数乘以 -1,使得最大化问题转为最小化问题。
  2. 约束条件

    • A_ub 表示不等式约束的系数矩阵,其中每一行代表一个约束条件。
    • b_ub 表示不等式约束右边的常数值。
    • x_bounds 限制变量 x_1x_2 为非负。
  3. 求解方法

    • method='highs' 是一种稳定且高效的线性规划求解方法。
2.5 运行结果分析

运行代码后,系统会输出每天生产产品 A 和 B 的最优数量,以及最大化的利润。运行结果(示例)

python">优化成功!
每天生产产品 A 的数量:30.00
每天生产产品 B 的数量:40.00
最大每日利润:3700.00 元

分析结果

  • 最优生产方案是每天生产 30 单位的产品 A和 40 单位的产品 B。
  • 此时的最大利润为 3700 元。
  • 这个结果满足生产时间和材料的限制,既没有超出资源限制,也能实现利润最大化。

三、总结

通过这个案例,我们展示了如何从实际问题中提取线性规划模型。构建模型时,需要明确决策变量、目标函数以及约束条件。该模型求解问题清晰,并且可以通过 Python 实现自动化求解,能够有效地帮助决策者优化资源配置并实现目标(如最大化利润或最小化成本)。


http://www.ppmy.cn/devtools/117435.html

相关文章

怎么删除右键出现的Open Folder as Intellij IDEA Project

首先,WinR 输入 regedit (注册表编辑器),然后按Enter。 1.右键单击文件夹背景时(出现的情况): 在注册表中打开“ 计算机 \ HKEY_CLASSES_ROOT \ Directory \ Background \ shell \ IDEA Commun…

逆概率加权(R和Python案例)

逆概率加权(Inverse Probability Weighting, IPW)是一种统计技术,用于观察性研究中调整混杂变量的影响,以便更准确地估计因果关系。这种方法特别有用于在无法进行随机化实验的情况下,通过给予不同个体不同的权重&#…

Electron-vue asar 局部打包优化处理方案——绕开每次npm run build 超级慢的打包问题

背景 因为组员对于 Electron 打包过程存在比较迷糊的状态,且自己也没主动探索 Electron-vue 打包细节,导致每次打包过程都消耗 5-6 分钟的时间,在需要测试生产打包时,极其浪费时间,为此针对 Electron-vue 打包的几个环…

JVM基本组成

目录 JDK\JRE\JVM 架构 Java执行流程 工作原理 类型 优点 缺陷 JDK\JRE\JVM JDK:全称“Java Development Kit”,Java开发工具包,提供javac编译器jheap、jconsole 等监控工具;JRE:全称“Java Runtime Environment”,Java 运…

MySQL练手题--获得最近第二次的活动(困难)

一、准备工作 Create table If Not Exists UserActivity (username varchar(30), activity varchar(30), startDate date, endDate date); Truncate table UserActivity; insert into UserActivity (username, activity, startDate, endDate) values (Alice, Travel, 2020-02-…

java基础(3)数组的定义与使用

目录 1.前言 2.正文 2.1数组的概念 2.2数组的创建与初始化 2.2.1数组的创建 2.2.1数组的静态初始化 2.2.2数组的动态初始化 2.3数组是引用类型 2.3.1引用类型与基本类型区别 2.3.2认识NULL 2.4二维数组 2.5数组的基本运用 2.5.1数组的遍历 2.5.2数组转字符串 2.…

【Linux】 tcp | 解除服务器对tcp连接的限制 | 物联网项目配置

一、修改tcp连接限制 1、编辑 vi /etc/sysctl.conf 2、内容 net.ipv4.tcp_keepalive_intvl 75 net.ipv4.tcp_keepalive_probes 9 net.ipv4.tcp_keepalive_time 7200 net.ipv4.ip_local_port_range 1024 65535 net.ipv4.ip_conntrack_max 20000 net.ipv4.tcp_max_tw_bucket…

Ubuntu环境切换到服务器某个用户后source等命令和Tab快捷补全都用不了了,提示没找到,但root用户可以

以escs用户为例: 输入以下命令 grep root /etc/passwd grep escs /etc/passwd 对比发现,root用户配的是bash,而escs却是sh, 所以把escs的sh改成和root一样的bash,命令为 usermod -s /bin/bash escs 改好后就可以了。 …