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

1、线性规划概念

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

m i n x   c T x s . t .   A u b x ≤ b u b , A e q x = b e q , l ≤ x ≤ u \underset{x}{min}\ c^{T}x\\ s.t. \ A_{ub}x \le b_{ub},\\ A_{eq}x = b_{eq},\\ l \le x \le u xmin cTxs.t. Aubxbub,Aeqx=beq,lxu
其中 x 是决策变量的向量;cbubbeqlu是向量;和 A u b A_{ub} Aub A e q A_{eq} Aeq是矩阵。

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 u b A_{ub} Aub的每一行指定 x x x上的线性不等式约束的系数

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

    • 数据类型:一维数组
  • A_eq(可选参数):等式约束矩阵, A e q A_eq Aeq的每一行指定 x x x上的线性等式约束的系数

    • 数据类型:二维数组
  • b_eq(可选参数):等式约束向量, A e q x A_{eq}x Aeqx的每个元素必须等于 b e q b_{eq} beq的对应元素

    • 数据类型:一维数组
  • bounds(可选参数):定义决策变量 x x x的最小值和最大值

    • 数据类型: (min, max)序列对
    • None:使用None表示没有界限,默认情况下,界限为(0,None)(所有决策变量均为非负数)
    • 如果提供一个元组(min, max),则最小值和最大值将用作所有决策变量的界限。
  • method(可选参数):算法,{‘interior-point’, ‘revised simplex’, ‘simplex’}以上三种算法可选

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

    • x:当前解向量
      • 数据类型:一维数组
    • fun:目标函数的当前值( c T x c^Tx cTx
      • 数据类型:浮点数
    • success:当算法成功完成时为 True
      • 数据类型:布尔值
    • slack:不等式约束的松弛值(名义上为正值) b u b − A u b x b_{ub}-A_{ub}x bubAubx
    • 数据类型:一维数组
    • con:等式约束的残差(名义上为零) b e q − A e q x b_{eq}-A_{eq}x beqAeqx
    • 数据类型:一维数组
    • 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 T x c^Tx cTx

    • 数据类型:浮点数
  • slack:不等式约束的松弛值(名义上为正值) b u b − A u b x b_{ub}-A_{ub}x bubAubx

    • 数据类型:一维数组
  • con:等式约束的残差(名义上为零) b e q − A e q x b_{eq}-A_{eq}x beqAeqx

    • 数据类型:一维数组
  • 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])

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

6、若有更多Python的问题,请挪步“佐佑思维”公众号→回复免费

7、 ★佐佑思维二维码★

佐佑思维

  • 39
    点赞
  • 195
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值