我正在尝试在基于Jupyter的Python中使用CPLEX解决以下简单的LP问题,并收到以下错误。
任何人都可以帮助解释该错误。 LP问题有6个变量和3个约束。我检查了定义的列表的尺寸,它们与问题的大小一致。
Maximize {obj: - 28.44 x1 - 27.38 x2 - 26.44 x3 - 25.38 x4 - 26.44 x5
- 25.38 x6}
Subject To
c1: x1 + x2 = 0
c2: x3 + x4 = 0
c3: x5 + x6 = 0
Bounds
-2.1 <= x1 <= 2.1
-2.1 <= x2 <= 2.1
-2.1 <= x3 <= 2.1
-2.1 <= x4 <= 2.1
-2.1 <= x5 <= 2.1
-2.1 <= x6 <= 2.1
import cplex
from cplex.exceptions import CplexError
import sys
my_obj = [-28.44, -27.38, -26.44, -25.38, -26.44, -25.38]
my_ub = [2.1, 2.1, 2.1, 2.1, 2.1, 2.1]
my_lb = [-2.1, -2.1, -2.1, -2.1, -2.1, -2.1]
my_rhs = [0,0,0]
my_sense = "EE"
rows = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]
cols = [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]
vals = [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0]
my_prob = cplex.Cplex()
my_prob.objective.set_sense(my_prob.objective.sense.maximize)
my_prob.linear_constraints.add(rhs = my_rhs, senses = my_sense, names = [])
my_prob.variables.add(obj = my_obj, ub = my_ub, lb = my_lb, names = [])
my_prob.linear_constraints.set_coefficients(zip(rows, cols, vals))
my_prob.solve()
答案 0 :(得分:0)
看起来这个问题已经在评论中得到了回答。简而言之,my_sense
和my_rhs
的长度是不同的。长答案在下面。
运行脚本时,我们会看到这样的回溯:
Traceback (most recent call last):
File "20200106.py", line 16, in <module>
my_prob.linear_constraints.add(rhs = my_rhs, senses = my_sense, names = [])
File "/home/rkersh/virtualenv/3.6/cplex/lib64/python3.6/site-packages/cplex/_internal/_subinterfaces.py", line 1259, in add
lin_expr, senses, rhs, range_values, names)
File "/home/rkersh/virtualenv/3.6/cplex/lib64/python3.6/site-packages/cplex/_internal/_baseinterface.py", line 41, in _add_iter
addfun(*args, **kwargs)
File "/home/rkersh/virtualenv/3.6/cplex/lib64/python3.6/site-packages/cplex/_internal/_subinterfaces.py", line 1181, in _add
validate_arg_lengths(arg_list)
File "/home/rkersh/virtualenv/3.6/cplex/lib64/python3.6/site-packages/cplex/_internal/_aux_functions.py", line 99, in validate_arg_lengths
raise CplexError("inconsistent arguments" + extra_msg)
cplex.exceptions.errors.CplexError: inconsistent arguments
从第一行开始,我们知道问题所在的行:
my_prob.linear_constraints.add(rhs = my_rhs, senses = my_sense, names = [])
从最后一行开始,我们知道原因:
cplex.exceptions.errors.CplexError: inconsistent arguments
此外,此方法的documentation指出:
如果指定了多个参数,则所有参数都必须具有 相同的长度。
好吧,文档所说的并不完全正确。正如您在脚本中所做的那样,用户可以为某些参数提供空列表,并省略可选参数。
关于错误消息是否可以更好。 CPLEX无法轻易确定哪些参数本身是错误的(用户可以提供一个太长,太短或两者兼有的列表)。相反,它只能指出参数的长度是否不一致。也许可以通过说“不一致的参数长度”来改善错误消息。从Traceback已经很清楚哪些参数在考虑中,但是参数名称也可以包括在内,例如:“参数长度不一致:len_expr,senses,rhs,range_values,名称”。那会有所帮助吗?