【问题标题】:scipy.optimize.linprog - difficulty understanding the parametersscipy.optimize.linprog - 难以理解参数
【发布时间】:2018-03-21 22:09:20
【问题描述】:

我想最小化以下 LPP: c=60x+40y+50z 受制于 20x+10y+10z>=350 , 10x+10y+20z>=400, x,y,z>=0

我的代码 sn-p 如下(我是第一次使用 scipy 包)

from scipy.optimize import linprog
c = [60, 40, 50]
A = [[20,10], [10,10],[10,20]]
b = [350,400]
res = linprog(c, A, b)
print(res)

输出为:screenshot of the output in Pycharm

1.谁能详细解释一下linprog函数的参数,特别是bound是怎么计算的?

2.我写的参数对吗?

我对 LPP 基础知识很幼稚,我认为我对参数的理解有误。

【问题讨论】:

  • 您尝试过什么解决方法?文档说参数应该是什么?根据错误消息,我的第一个猜测是传入 A.T 而不是 A。
  • “如何计算界限”是什么意思?
  • 错误信息非常好恕我直言。
  • 文档说 linprog() 的第 6 个参数是“x 中每个元素的 bounds=(min, max) 对,定义了该参数的边界。”我不确定如何计算这个值。
  • @ProteetiProva 这是一个可选参数,您可以将其作为算法的输入来指定变量值必须在特定范围内(默认情况下,范围为 [0, +∞))。如果您的问题不需要特定的界限,那么您不需要给出它。

标签: python numpy scipy linear-programming


【解决方案1】:

linprog 期望A 每个不等式有一行,每个变量有一个列,而不是相反。试试这个:

from scipy.optimize import linprog
c = [60, 40, 50]
A = [[20, 10, 10], [10, 10, 20]]
b = [350, 400]
res = linprog(c, A, b)
print(res)

输出:

     fun: -0.0
 message: 'Optimization terminated successfully.'
     nit: 0
   slack: array([ 350.,  400.])
  status: 0
 success: True
       x: array([ 0.,  0.,  0.])

【讨论】:

  • 感谢您这么精确..真的很有帮助!
【解决方案2】:

消息告诉您A_ub 矩阵的维度不正确。它目前是一个 3x2 矩阵,无法左乘您的 3x1 优化变量 x。你需要写:

A = [[20,10, 10], [10,10,20]]

这是一个 2x3 矩阵,可以左乘x

【讨论】:

  • 我真的很担心为什么尺寸不匹配。谢谢,现在我明白了!
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2017-01-21
  • 2011-06-22
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多