【问题标题】:Scipy.optimize.linprog : Value error - Invalid inputScipy.optimize.linprog:值错误 - 输入无效
【发布时间】:2019-03-15 10:07:45
【问题描述】:

我正在尝试解决一个小问题,只是为了优化游戏中的一些单位生产,其中 Alpha 是一个变化系数(它设置变量之间的差异):

import numpy as np
import scipy.optimize as opti
alpha = 0.05
C = np.array([-1,-1,-1,-1,-15,-3,-3,-4,0,0,0,0,0,0])
B = np.array([1600,0,0,0,0,0,0,0,0,0,0,0,0,0])
MatriceC = np.array([\
np.array([14-((1-alpha)*8),7-((1-alpha)*8),7-((1-alpha)*25),18-((1- 
alpha)*12),30-((1-alpha)*30),40-((1-alpha)*40),18-((1-alpha)*1),76-((1- 
alpha)*16),-1,0,0,0,0,0]),\
np.array([14-((1+alpha)*8),7-((1+alpha)*8),7-((1+alpha)*25),18- 
((1+alpha)*12),30-((1+alpha)*30),40-((1+alpha)*40),18-((1+alpha)*1),76- 
((1+alpha)*16),0,-1,0,0,0,0])*(-1),\
np.array([14-((1-alpha)*30),7-((1-alpha)*2),7-((1-alpha)*13),18-((1- 
alpha)*7),30-((1-alpha)*30),40-((1-alpha)*40),18-((1-alpha)*24),76-((1- 
alpha)*56),0,0,-1,0,0,0]),\
np.array([14-((1+alpha)*30),7-((1+alpha)*2),7-((1+alpha)*13),18- 
((1+alpha)*7),30-((1+alpha)*30),40-((1+alpha)*40),18-((1+alpha)*24),76- 
((1+alpha)*56),0,0,0,-1,0,0])*(-1),\
np.array([8-((1-alpha)*30),8-((1-alpha)*2),25-((1-alpha)*13),12-((1- 
alpha)*7),30-((1-alpha)*30),40-((1-alpha)*40),1-((1-alpha)*24),16-((1- 
alpha)*56),0,0,0,0,-1,0]),\
np.array([8-((1+alpha)*30),8-((1+alpha)*2),25-((1+alpha)*13),12- 
((1+alpha)*7),30-((1+alpha)*30),40-((1+alpha)*40),1-((1+alpha)*24),16- 
((1+alpha)*56),0,0,0,0,0,-1])*(-1)])
#print(help(opti.linprog))
print(np.shape(MatriceC))
print(np.shape(B))
opti.linprog(C,A_eq=MatriceC,b_eq=B) #This causes the error...

我得到一个输出:

(6, 14)
(14,)
ValueError: Invalid input for linprog with method = 'simplex'.  The number 
of rows in A_eq must be equal to the number of values in b_eq

考虑到我得到的矩阵的形状。我不明白我做错了什么。

PS:

我已经尝试添加

MatriceC = MatriceC.T

就在 linprog 调用之前,它仍然输出相同的错误。它确实将 (6, 14) 形状更改为 (14, 6)(这很合逻辑)

【问题讨论】:

  • A_eq.shape[0] 必须等于 b_eq.shape[0],在您的情况下为 False

标签: python optimization scipy


【解决方案1】:

在将MatriceC 传递给MatriceC.T 之前,先将其转发给linprog

linprog 根据他们的文档:

最小化:c^T * x

服从:A_ub * x

为了满足上述方程,矩阵的维数应该相互一致。阅读Matrix Multiplication

【讨论】:

  • 我添加了 MatriceC = MatriceC.T 现在 MatriceC.shape[0] = 14 和 B.shape[0] = 14 但 linprog 输出相同的错误
  • 您确定按照他们的文档所说的方式传递了正确的参数吗?
  • 函数的文档是:scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simplex', callback =无,选项=无)。因此,如果我使用 = opti.linprog(C,A_eq = MatriceC, b_eq = B) 我认为应该不会造成问题
  • 是的,在传递之前再次检查形状并确保矩阵相互符合。
  • 我发现了问题,当我以标准化形式翻译我的问题时,我在我的 b 向量中添加了相同数量的新变量。谢谢你的帮助:)
猜你喜欢
  • 1970-01-01
  • 2015-01-01
  • 2014-05-31
  • 2021-04-28
  • 2021-06-23
  • 1970-01-01
  • 2023-02-23
  • 2017-09-19
  • 2012-12-21
相关资源
最近更新 更多