python模块:Scipy.optimize.linprog线性规划求解
目录
一、模块介绍
二、模块源分析与参数解释
三、实例求解
四、参考
一、模块介绍
1.1模块功能
Scipy.optimize是Scipy中一个用于解决数学模型中优化类模型的子包,该子包中又包含了多个子功能模块见下表,不同方法不同条件求解最优化模型。本节介绍linprog对线性规划问题的模型建立与求解。
问题类型 | 模块 |
多元标量函数的有/无约束最小化 | minimize |
最小二乘法最小化 | least_squares |
单变量函数最小化器 | minimize_scalar |
线性规划 | linprog |
1.2模型介绍
线性规划模型是指一种特殊形式的数学规划模型,即目标函数和约束条件是待求变量的线性函数、线性等式或线性不等式的数学规划模型。根据问题背景,经过对问题的分析,通过三个步骤建立数学模型:1.确定决策变量,2.建立目标函数,3.指定约束条件。
由于目标函数和约束条件都是由决策变量组成的线性函数表达式,由此可以表示为下图所示形式。
x为决策变量形成的列向量,c是决策变量的系数列向量。首行给出目标函数,min 或 max,为了与linprog格式一致,我们转换为 。s.t.括号中的则表示约束条件。我们将约束分为等式和不等式的约束,以及对于决策变量的约束。
由于线性规划模型约束为线性函数,每个约束式都是决策变量一次式,每个约束式决策变量的系数可以表示为向量形式,假设不等式约束有m1个,决策向量维度为n,则可将所有不等式约束可综合表示为系数矩阵A与决策向量乘积形式,b则是约束阈值的列向量。
对于约束中≥阈值的约束可以与目标函数一样取负值转换。同样可以得到等式约束的矩阵形式和决策变量定义域范围上下限向量表示。
二、模块源分析与参数解释
2.1linprog模块分析
我们找到Scipy.optimize.linprog模块的完整输入参数列表
def linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None,bounds=None, method='interior-point', callback=None,options=None, x0=None)
参数对应的意义可由表2.1详细表示,对应于1.2中建立的线性规划模型,linprog可以看出是一个很直观简单的方法(对于矩阵和向量用numpy数组表示)
参数 | 意义 |
c | 目标函数的决策变量对应的系数向量(行列向量都可以,下同) |
A_ub | 不等式约束组成的决策变量系数矩阵 |
b_ub | 由A_ub对应不等式顺序的阈值向量 |
A_eq | 等式约束组成的决策变量系数矩阵 |
b_eq | 由A_ub对应等式顺序的阈值向量 |
bounds | 表示决策变量x连续的定义域的n×2维矩阵,None表示无穷 |
method | 调用的求解方法,2.2节给出详细解释 |
callback | 选择的回调函数 |
options | 求解器选择的字典 |
x0 | 初始假设的决策变量向量,若可行linprog会对方法优化 |
2.2参数解释
对于method参数是选择linprog的求解器方法,可选参数由一个字典包括
LINPROG_METHODS = ['simplex', 'revised simplex', 'interior-point', 'highs', 'highs-ds', 'highs-ipm']
在 osgeo.cn 的scipy文档中对method的方法给出以下解释:
方法 'highs-ds' 是C++高性能双重修订单工实现(HSOL)的包装器 [13], [14]. 方法 'highs-ipm' 是C++实现的 i n前面-p oint m 方法 [13]; 它的特点是交叉例程,因此它与单纯形求解器一样精确。方法 'highs' 自动在两者之间进行选择。有关涉及以下内容的新代码 linprog ,我们建议显式选择这三个方法值中的一个,而不是 'interior-point' (默认), 'revised simplex' ,以及 'simplex' (旧版)。
即建议用户选择highs的三个方法,这在速度和精度上都更加优越,选择highs方法自动选择两个方法中的较好的一个。而在实例中我们会得到method为highs和默认的interior-point方法的区别。
三、实例求解
3.1求解实例
我们给出一个简单的线性规划模型实例:
按照模型得到决策变量,目标函数,两个不等式约束,一个等式约束,以及给出定义域。将对应linprog参数由numpy处理过后的数据赋值传入参数即可求解出最优值与对应的决策变量取值。
注意:
(1)linprog目标函数此时为最大化,要按上述方法转为最小化。
(2)同时对于仅有一个约束的矩阵不能直接传入一维的数组,而应该表示为一个只有一
个向量的二维矩阵形式。
3.2求解代码
python的求解代码给出为:
"""
数学规划模型
scppy.optimize.linprog
"""
from scipy.optimize import linprog
import numpy as np
c=np.array([-2,-3,5]).transpose() #行列向量不影响求解
A=np.array([[-2,5,-1],[1,3,1]])
b=np.array([-10,12])
Aeq=np.array([[1,1,1]]) # 单个约束也要表示为矩阵形式
beq=np.array([7])
x=linprog(c,A,b,Aeq,beq,method='highs',bounds=np.array([[0,None],[0,None],[0,None]]))
print(x)
3.3结果分析与比较
我们得到上述method='highs'求解的结果:
con: array([0.])
crossover_nit: 0
eqlin: marginals: array([-2.28571429])
residual: array([0.])
fun: -14.571428571428573
ineqlin: marginals: array([-0.14285714, -0. ])
residual: array([0. , 3.85714286])
lower: marginals: array([0. , 0. , 7.14285714])
residual: array([6.42857143, 0.57142857, 0. ])
message: 'Optimization terminated successfully.'
nit: 3
slack: array([0. , 3.85714286])
status: 0
success: True
upper: marginals: array([0., 0., 0.])
residual: array([inf, inf, inf])
x: array([6.42857143, 0.57142857, 0. ])
与默认方法结果比较:
con: array([1.80714554e-09])
fun: -14.571428565645032
message: 'Optimization terminated successfully.'
nit: 5
slack: array([-2.24602559e-10, 3.85714286e+00])
status: 0
success: True
x: array([6.42857143e+00, 5.71428571e-01, 2.35900788e-10])
message给出模型求解成功提示,nit为迭代数,决策变量以x的数组形式返回,最优值为fun。
两个方法都能正确求解出结果,highs方法迭代次数更少,并且给出了边际和残余值。比较得出highs比默认方法更加高效,建议使用highs方法求解。
四、参考
[1] Scipy v1.9.0版用户指南SciPy User Guide — SciPy v1.9.0 Manual
[2] osego 指南 linprog(method=‘high’) — SciPy v1.8.0.dev0+1869.838cfbe Manual (osgeo.cn)
xx
python模块:Scipy.optimize.linprog线性规划求解相关推荐
- scipy.optimize.linprog()函数--求解线性规划问题
这里写目录标题 关于方程组的标准形式 参数 c A_ub b_ub A_eq b_eq bounds method callback options maxiter disp presolve 返回值 ...
- 使用python scipy.optimize linprog和lingo线性规划求解最大值,最小值(运筹学学习笔记)
1. 线性模型 2. 使用python scipy.optimize linprog求解模型最优解: 在这里我们用到scipy中的linprog进行求解,linprog的用法见https://docs ...
- python数学建模之用scipy.optimize.linprog实现线性规划
在做数学建模时,我们经常会遇到在约束条件下求解目标的最优解的情况,如:在如下约束条件下求解-x0+4x1的最小值. 在求解这个问题的过程中,我们可以使用不同的工具去解决,如MATLAB.Java等语言 ...
- 线性规划问题——scipy.optimize.linprog
文章目录 一.例题 二.线性规划问题 三.linprog 1.导入模板 2.参数解释 3.例 一.例题 以<数学建模算法与应用>中的题为例: 二.线性规划问题 数学建模旨在将复杂问题抽象为 ...
- scipy.optimize.linprog函数参数最全详解
scipy.optimize.linprog函数 1.线性规划概念 2.输入格式 3.参数设置: 4.输出格式: 5.例子 6.若有更多Python的问题,请挪步"佐佑思维"公众号 ...
- 【Python】用 Python 的 scipy 包实现线性规划(LP)
文章目录 一.线性规划(linear programming,LP) 二.用 python 实现线性规划 1. 方法:使用 scipy 包中的 optimize.linprog 2. 实例 参考链接 ...
- python网页优化公司_使用python优化scipy.optimize.minimize公司
我将逐行检查您的代码,并强调一些问题:from scipy.optimize import minimize import numpy as np prices=np.array([[1.5,50,3 ...
- (待完善)python模块scipy介绍(misc)
(待完善)python模块scipy介绍(misc) scipy模块简介 SciPy是建立在Python的NumPy扩展上的数学算法和高级函数的集合.它通过向用户提供高级命令和类来操作和可视化数据,为 ...
- python非线性规划scipy.optimize.minimize介绍
目录 0. 官方说明 1. Parameters 2. Returns 3. 案例 1)无约束求极值 2)有约束求极值 参考资料 0. 官方说明 在 python 里用非线性规划求极值,最常用的就是 ...
最新文章
- Android 属性动画(Property Animation) ValueAnimator 的介绍
- Jquery获取ckEditor的内容
- 项目中除了需求外还需要知道的问题
- redhat 9.0 mysql 配置_RedHat 9.0下Apache+PHP+MySQL服务器安装配置
- 不用POI技术,JAVA给Word文档中的数据区域赋值
- 徐州工程学院计算机报名,2019年3月江苏徐州工程学院计算机等级考试报名时间...
- 数字信号处理---模拟信号数字处理方法
- 全网目前最全python例子(附源码)
- 3097-小鑫爱数学
- Flask蓝本与子域名
- 逆反西游无法读取服务器信息,逆反西游
- Word控件Spire.Doc 【页面背景】教程(8) ;在 C# 中将文本水印和图像水印添加到 Word 文档
- html下划线输入框自动延伸,纯CSS实现从中间延展的下划线
- Excel多个Sheet排序
- 第三十四届广东金融科技交流会顺利举行,墨云分享风险验证技术新思路
- 团队作业2 需求分析与原型设计
- 线性反馈移位寄存器(LFSR)和 Berlekamp-Massey 算法
- 计算机桌面的文件拒绝访问,文件夹拒绝访问怎么办【解决方法】
- Windows API参考大全
- navicat 阿里云 服务器 mysql_阿里云服务器优惠券领取 可以便宜购买阿里云服务器...