【优化数学模型】1. 基于Python的线性规划问题求解

2024-02-15 08:20

本文主要是介绍【优化数学模型】1. 基于Python的线性规划问题求解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

【优化数学模型】1. 基于Python的线性规划问题求解

  • 一、线性规划问题
    • 1.概述
    • 2.三要素
  • 二、示例:药厂生产问题
  • 三、使用 Python 绘图求解线性规划问题
    • 1.绘制约束条件
    • 2.绘制可行域
    • 3.绘制目标函数
    • 4.绘制最优解
  • 四、使用 scipy.optimize 软件包求解线性规划问题
    • 1.导入库
    • 2.输入目标函数参数和约束条件
    • 3.求解
  • 参考文献


一、线性规划问题

1.概述

线性规划(Linear Programming, LP) 是解决最优化问题的工具之一,也是运筹学的重要分支。

运筹学(Operations Research) 是一门研究人类对各种广义资源的运用及筹划活动的新兴学科,其目的在于了解和发现这种运用及筹划活动的基本规律,以便更有效发挥有限资源的效益,从而达到总体或全局有效或平衡的目标。

1947年,美国数学家G.B.Dantzig及其同事提出了求解线性规划的单纯形法及其有关理论,为线性规划这一学科的建立奠定了理论基础。1979年苏联数学家哈奇扬的椭球算法和1984年美籍印度数学家H.Karmarkar算法的相继问世,使得线性规划的理论更加完备、成熟,实用领域更加宽广。

线性规划涉及的实际问题多种多样,包括生产计划问题、物资运输问题、合理下料问题、库存问题、劳动力问题、最优设计问题等,这些问题虽然出自不同的行业,有着不同的实际背景,但都是属于如何计划、安排、调度的问题,即如何物尽其用、人尽其才的问题。

2.三要素

最优化问题往往具有三个基本要素,即决策变量、目标函数和约束条件,也被称为优化模型的三要素。

  1. 决策变量:是决策者可以控制的因素,在规划模型中,用一组决策变量来表示某一方案或措施,即描述所要做出的决策,可由决策者决定和控制。例如根据不同的实际问题,决策变量可以选为药品或器械的产量、医疗物资的运量及工作的天数等。
  2. 目标函数:是以函数形式来表示决策者追求的目标,表示决策者希望实现的目标。按问题的不同,要求目标函数实现最大化或最小化,在前面加上max或min来表示,目标函数也是衡量方案优劣的标准。例如目标可以是利润最大或成本最小等。对于线性规划,目标函数要求是线性的。
  3. 约束条件:是决策变量需要满足的限定条件,通常表示为一组含有决策变量的等式或不等式,是决策方案可行的保障。对于线性规划,约束条件是一组线性等式或不等式。

二、示例:药厂生产问题

假设一家药厂可以生产两种药品,称为“药品A”和“药品B”。

生产每种药品都需要材料和劳动力。销售每种药品都会产生收入。

所需单位材料和劳动力投入,以及收入如下表所示:

药品A药品B
材料25
劳动42
收入34

一家药厂药构建一个生产计划,使用 30 个单位的材料和 20 个单位的劳动力,以使其收入最大化。该问题可以表述为:

max ⁡ x 1 , x 2 z = 3 x 1 + 4 x 2 subject to  2 x 1 + 5 x 2 ≤ 30 4 x 1 + 2 x 2 ≤ 20 x 1 , x 2 ≥ 0 \begin{array}{cl}\ \max _{x_1, x_2} & z=3 x_1+4 x_2 \\ \text { subject to } & 2 x_1+5 x_2 \leq 30 \\ & 4 x_1+2 x_2 \leq 20 \\ & x_1, x_2 \geq 0\end{array}  maxx1,x2 subject to z=3x1+4x22x1+5x2304x1+2x220x1,x20

三、使用 Python 绘图求解线性规划问题

1.绘制约束条件

fig, ax = plt.subplots(figsize=(8, 6))
ax.grid()ax.hlines(0, -1, 17.5)
ax.vlines(0, -1, 12)
ax.plot(np.linspace(-1, 17.5, 100), 6-0.4*np.linspace(-1, 17.5, 100), color="c")
ax.plot(np.linspace(-1, 5.5, 100), 10-2*np.linspace(-1, 5.5, 100), color="c")
ax.text(1.5, 8, "$2x_1 + 5x_2 \leq 30$", size=12)
ax.text(10, 2.5, "$4x_1 + 2x_2 \leq 20$", size=12)
ax.text(-2, 2, "$x_2 \geq 0$", size=12)
ax.text(2.5, -0.7, "$x_1 \geq 0$", size=12)

2.绘制可行域

feasible_set = Polygon(np.array([[0, 0],[0, 6],[2.5, 5],[5, 0]]),color="cyan")
ax.add_patch(feasible_set)

3.绘制目标函数

ax.plot(np.linspace(-1, 5.5, 100), 3.875-0.75*np.linspace(-1, 5.5, 100), color="orange")
ax.plot(np.linspace(-1, 5.5, 100), 5.375-0.75*np.linspace(-1, 5.5, 100), color="orange")
ax.plot(np.linspace(-1, 5.5, 100), 6.875-0.75*np.linspace(-1, 5.5, 100), color="orange")
ax.arrow(-1.6, 5, 0, 2, width = 0.05, head_width=0.2, head_length=0.5, color="orange")
ax.text(5.7, 1, "$z = 3x_1 + 4x_2$", size=12)

4.绘制最优解

ax.plot(2.5, 5, "*", color="black")
ax.text(2.7, 5.2, "Optimal Solution", size=12)plt.show()

绘制图像如下:

在这里插入图片描述

  • 其中,蓝色区域是满足所有约束条件的可行域。
  • 平行的橙色线是收入线。
  • 药厂的目标即找到平行的橙色线以达到可行域的上边界。
  • 可行域与最高橙色线的交点就是最优集合。在此示例中,最优集合是点 。

四、使用 scipy.optimize 软件包求解线性规划问题

scipy.optimize 软件包提供了 linprog 函数来求解线性规划问题,形式如下:

min ⁡ x c ′ x subject to  A u b x ≤ b u b A e q x = b e q l ≤ x ≤ u \begin{array}{cl} \min _x & c^{\prime} x \\ \text { subject to } & A_{u b} x \leq b_{u b} \\ & A_{e q} x=b_{e q} \\ & l \leq x \leq u \end{array} minx subject to cxAubxbubAeqx=beqlxu

原示例可转化为以下等同的标准形式:

min ⁡ x 1 , x 2 − ( 3 x 1 + 4 x 2 ) subject to  2 x 1 + 5 x 2 + s 1 = 30 4 x 1 + 2 x 2 + s 2 = 20 x 1 , x 2 , s 1 , s 2 ≥ 0 \begin{aligned} \min _{x_1, x_2} & -\left(3 x_1+4 x_2\right) \\ \text { subject to } & 2 x_1+5 x_2+s_1=30 \\ & 4 x_1+2 x_2+s_2=20 \\ & x_1, x_2, s_1, s_2 \geq 0 \end{aligned} x1,x2min subject to (3x1+4x2)2x1+5x2+s1=304x1+2x2+s2=20x1,x2,s1,s20

1.导入库

import numpy as np
from scipy.optimize import linprog
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

2.输入目标函数参数和约束条件

  • 对于每个不等式约束,生成一个松弛变量。
  • 松弛变量的向量是一个二维 NumPy 数组。
# 目标函数参数
c_ex1 = np.array([3, 4])# 约束条件
A_ex1 = np.array([[2, 5],[4, 2]])
b_ex1 = np.array([30,20])

3.求解

# 求解
res_ex1 = linprog(-c_ex1, A_ub=A_ex1, b_ub=b_ex1)res_ex1

输出结果如下:

        message: Optimization terminated successfully. (HiGHS Status 7: Optimal)success: Truestatus: 0fun: -27.5x: [ 2.500e+00  5.000e+00]nit: 2lower:  residual: [ 2.500e+00  5.000e+00]marginals: [ 0.000e+00  0.000e+00]upper:  residual: [       inf        inf]marginals: [ 0.000e+00  0.000e+00]eqlin:  residual: []marginals: []ineqlin:  residual: [ 0.000e+00  0.000e+00]marginals: [-6.250e-01 -4.375e-01]mip_node_count: 0mip_dual_bound: 0.0mip_gap: 0.0

最优方案为:药厂生产 2.5 个单位的药品A 和 5 个单位的药品B,这产生了 27.5 的最大收入值。


参考文献

  1. https://scipy.org/
  2. J. N. Bertsimas, D. & Tsitsiklis. Introduction to linear optimization. Athena Scientific, 1997.

这篇关于【优化数学模型】1. 基于Python的线性规划问题求解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/710847

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财