侵权投诉
订阅
纠错
加入自媒体

scipy.optimize.linprog函数参数最全详解

2022-08-03 10:43
佐佑思维
关注

1 线性规划概念

定义:在线性等式和不等式约束下,最小化线性目标函数。

2 输入格式

scipy.optimize.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)

3 参数设置

'''

c:线性目标函数的系数;  数据类型:一维数组

A_ub(可选参数):不等式约束矩阵, A_{ub} 的每一行指定 x 上的线性不等式约束的系数;数据类型:二维数组

b_ub(可选参数):不等式约束向量,每个元素代表 A_{ub}x 的上限;数据类型:一维数组

A_eq(可选参数):等式约束矩阵, A_{eq}的每一行指定 x 上的线性等式约束的系数;数据类型:二维数组

b_eq(可选参数):等式约束向量,A_{eq}x 的每个元素必须等于 b_{eq} 的对应元素;数据类型:一维数组

bounds(可选参数):定义决策变量 x 的最小值和最大值;数据类型:(min, max)序列对

   None:使用None表示没有界限,默认情况下,界限为(0,None)(所有决策变量均为非负数)

   如果提供一个元组(min, max),则最小值和最大值将用作所有决策变量的界限。

method(可选参数):算法,{‘interior-point’, ‘revised simplex’, ‘simplex’}以上三种算法可选;数据类型:输入如上三种字符串

callback(可选参数):调用回调函数,我的理解是等待被调用的参数 ,如果提供了回调函数,则算法的每次迭代将至少调用一次。回调函数必须接受单个 scipy.optimize.OptimizeResult由以下字段组成:

  x:当前解向量; 数据类型:一维数组

 fun:目标函数的当前值(c^Tx); 数据类型:浮点数      

 success:当算法成功完成时为 True;数据类型:布尔值

 slack:不等式约束的松弛值(名义上为正值) b_{ub} ? A_{ub}x; 数据类型:一维数组
   

 con:等式约束的残差(名义上为零) b_{eq} ? A_{eq}x;数据类型:一维数组
 

 phase:正在执行算法的阶段; 数据类型:整数

 status:表示算法退出状态的整数; 数据类型:整数

      0 : 优化按名义进行

      1 : 达到了迭代限制

      2 : 问题似乎不可行

      3 : 问题似乎是不收敛

      4 : 遇到数值困难

 nit:当前的迭代次数; 数据类型:整数

 message:算法状态的字符串描述符; 数据类型:字符串

options(可选参数)——求解器选项字典,所有方法都接受以下选项:

  数据类型:字典

  maxiter:整数,要执行的最大迭代次数

  disp:布尔值,设置为True以打印收敛消息,默认值:False

  autoscale:布尔值,设置为True以自动执行平衡,如果约束中的数值分开几个数量级,请考虑使用此选项,默认值:False

  presolve:布尔值,设置为False可禁用自动预解析,默认值:True

  rr:布尔值,设置为False可禁用自动移除冗余,默认值:True

x0(可选参数):猜测决策变量的值,将通过优化算法进行优化。当前仅由’ revised simplex’ 方法使用此参数,并且仅当 x0 表示基本可行的解决方案时才可以使用此参数。  数据类型:一维数组

'''

4 输出格式

'''

x:在满足约束的情况下将目标函数最小化的决策变量的值;数据类型:一维数组

fun:目标函数的最佳值(c^Tx);数据类型:浮点数

slack:不等式约束的松弛值(名义上为正值) b_{ub}-A_{ub}x;数据类型:一维数组

con:等式约束的残差(名义上为零)b_{eq}-A_{eq}x;数据类型:一维数组

success:当算法成功找到最佳解决方案时为 True;数据类型:布尔值

status:表示算法退出状态的整数;数据类型:整数

   0 : 优化成功终止

   1 : 达到了迭代限制

   2 : 问题似乎不可行

   3 : 问题似乎是不收敛

   4 : 遇到数值困难

nit:在所有阶段中执行的迭代总数;数据类型:整数

message:算法退出状态的字符串描述符;数据类型:字符串    '''

5 例子

import scipy

from scipy import optimize

import numpy

c = numpy.array([2,3]) #最值等式未知数系数矩阵

A_ub = numpy.array([[-1,1],[2,-2]]) #<=不等式左侧未知数系数矩阵

B_ub = numpy.array([1,1]) #<=不等式右侧常数矩阵

#A_eq = numpy.array() 等式左侧未知数系数矩阵

#B_eq = numpy.array() 等式右侧常数矩阵

x = (None,1) #未知数取值范围

y = (None,None) #未知数取值范围

res = scipy.optimize.linprog(c,A_ub,B_ub,bounds = (x,y)) #默认求解最小值,求解最大值使用-c并取结果相反数

print(res)

#结果:无解情况

     con: array([], dtype=float64)

    fun: -8782091626.64441

message: 'The algorithm terminated successfully and determined that the problem is unbounded.'#算法成功终止,确定问题是无界的

    nit: 3

  slack: array([0.89897776, 1.20204449])

 status: 3

success: False

      x: array([-1.75641833e+09, -1.75641833e+09])

可以修改问题参数,从而达到有解,欢迎大家尝试!

       原文标题 : scipy.optimize.linprog函数参数最全详解

声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

电子工程 猎头职位 更多
扫码关注公众号
OFweek电子工程网
获取更多精彩内容
文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号