【优化数学模型】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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CAN通讯协议学习

介绍 它是一种异步通讯,can_high和can_low两条线利用的是电位差传输信号,抗干扰能力强,但是必须要有can控制器如TJA1050(我的开发板) 当 CAN 节点需要发送数据时,控制器把要发送的二进制编码通过 CAN_Tx 线…

数仓建模—数据网格

数据网格 随着数字化时代的到来,近几年数据领域的新技术概念不断涌现,无论是数据湖、湖仓一体、流批一体、存算一体、数据编织抑或数据网格,很多还爬上了Gartner曲线,其中数据网格备受关注,数据网格从字面意思来看挺抽象的,会劝退很多人,但当你深入去理解这个概念时,才…

wordpress好的网站主题

有什么好的网站主题,都分享在这里了。 蓝色风格的wordpress模板,好的wordpress网站主题,需要既好看,又好用。 https://www.zhanyes.com/qiye/6305.html 血红色的好看的wordpress主题,布局经典,设计好的&am…

基于laravel开发的开源交易所源码|BTC交易所/ETH交易所/交易所/交易平台/撮合交易引擎

开源交易所,基于Laravel开发的交易所 | BTC交易所 | ETH交易所 | 交易所 | 交易平台 | 撮合交易引擎。本项目有完整的撮合交易引擎源码、后台管理(后端前端)、前台(交易页面、活动页面、个人中心等)、安卓APP源码、苹果…

宝宝起名神器小程序源码/支持多种流量主模式

还不知道怎么给虎宝宝取名字么?那么这款小程序源码就可以帮到你了,这款小程序支持输入姓氏自动起名。 不满意还可以点击换一换来找到满意的,支持起两个字或者三个字的名字。另外也给该款小程序添加了几个流量主位置!!…

react渲染流程是怎样的

整体流程: react的核心可以用uifn(state)来表示,更详细可以用: const state reconcile(update); const UI commit(state);上面的fn可以分为如下一个部分: Scheduler(调度器): 调度任务&…

【教程】Kotlin语言学习笔记(二)——数据类型(持续更新)

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 文章目录 【Kotlin语言学习】系列文章一、基本数据…

Python算法题集_二叉树的中序遍历

Python算法题集_二叉树的中序遍历 题94:1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【直接递归】2) 改进版一【函数递归】3) 改进版二【迭代遍历】 4. 最优算法 本文为Python算法题集之一的代码示例 题94: 1. 示例说…

【使用IDEA总结】01——新增作者信息、方法参数返回值

[TOC](目录) 1.类新增作者信息 打开IDEA的Settings,Editor->Code Style->File and Code Templates->Includes->File Header,输入以下作者信息,作者名更换为自己的即可,操作如下图所示 /*** Author Linhaipeng* Date…

MySQL 基础知识(三)之数据库操作

目录 1 显示当前时间、用户名、数据库版本 2 查看已有数据库 3 创建数据库 4 使用数据库 5 查看当前使用的数据库 6 查看当前数据库信息 7 查看数据库编码 8 修改数据库信息 9 删除数据库 10 查看最大连接数 11 查看数据库当前连接数,并发数 12 查看数据…

C++类和对象-C++对象模型和this指针->成员变量和成员函数分开存储、this指针概念、空指针访问成员函数、const修饰成员函数

#include<iostream> using namespace std; //成员变量 和 成员函数 分开储存的 class Person { public: Person() { mA 0; } //非静态成员变量占对象空间 int mA; //静态成员变量不占对象空间 static int mB; //函数也不占对象空间…

抽象的前端

问题背景&#xff1a;vue3&#xff0c;axios 直接导致问题&#xff1a;路由渲染失败 问题报错&#xff1a;Uncaught SyntaxError: The requested module /node_modules/.vite/deps/axios.js?v7bee3286 does not provide an export named post (at LoginIn.vue:16:9) 引入组…

C++ //练习 7.3 修改7.1.1节(第229页)的交易处理程序,令其使用这些成员。

C Primer&#xff08;第5版&#xff09; 练习 7.3 练习 7.3 修改7.1.1节&#xff08;第229页&#xff09;的交易处理程序&#xff0c;令其使用这些成员。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********************…

淘宝项目实战相关知识点

淘宝各个方面的布局大部分都是常规操作&#xff0c;在这里我就简单记录一下练习过程中的相关知识点&#xff0c;比较简短。相关知识点如下&#xff1a; 行高的取值 假设font-size为16px line-height:normal; line-height:1.5;24px&#xff0c;先继承后计算 line-height:200%;3…

Java并发基础:Exchanger全面解析!

内容概要 Exchanger类的优点在于能够简洁高效地实现两个线程间的数据交换&#xff0c;通过Exchanger&#xff0c;开发者可以避免复杂的锁和同步机制&#xff0c;降低并发编程的难度&#xff0c;同时&#xff0c;它还提供了线程安全的数据交换保障&#xff0c;使得多线程协作更…

android 控制台输出 缺失

问题 android 控制台输出内容缺失 详细问题 笔者进行android开发&#xff0c;期望控制台打印Log日志或是输出内容 Log.i("tag","content");或 System.out.println("content")但是实际上&#xff0c;上述内容并没有按照笔者期望打印 解决方…

2024 年 7 款最佳电脑录屏软件 [免费和付费]

录屏是捕获桌面上活动的软件应用程序。用户可以根据自己的要求创建视频记录。免费屏幕录像机广泛用于演示、演示、教程、游戏等。 录音机还有助于内容创建、远程协作和员工培训。这些录音机具有多种特性和功能。它提供了音频录制、网络摄像头集成和快速编辑工具的选项。您可以根…

跟廖雪峰老师学习Git(持续更新)

Git简介 创建版本库 第一步&#xff0c;创建一个新目录 第二步&#xff0c;通过git init变成Git可以管理的仓库 把文件添加到文本库&#xff0c;不要使用Windows自带的记事本&#xff01; 我用的是VS code 创建readme.txt 放入库中 commit可以一次提交很多文件&#xff0…

点云旋转处理

实现代码为&#xff1a; //以中心化点进行旋转double theta atan(maindirection.a);//计算的是弧度单位for (int i 0; i < origipts.size(); i){pcl::PointXYZ tempone;tempone.x aftercenerlizepts[i].x*cos(theta) aftercenerlizepts[i].y*sin(theta) center.x;temp…

专业140+总分420+东北大学841通信专业基础考研经验东大电子信息与通信工程,真题,大纲,参考书。

今年考研顺利上岸&#xff0c;被东北大学通信工程录取&#xff0c;其中专业课841通信专业基础140&#xff0c;数二140&#xff0c;总分420&#xff0c;整体每门课都还是比较均衡&#xff0c;刚开始考研前也和大家一样&#xff0c;焦虑&#xff0c;紧张&#xff0c;面对考研怕失…