【问题标题】:Python/CPLEX "inconsistent arguments" errorPython/CPLEX“参数不一致”错误
【发布时间】:2019-12-26 02:43:47
【问题描述】:

我正在尝试在基于 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()

【问题讨论】:

  • 我的猜测:my_sensemy_rhs
  • 是的,我在发帖后注意到了这一点。谢谢!!
  • 太糟糕了 Cplex 没有给出更好的错误信息。我想看看哪些论点不一致以及为什么。那将完全阻止这个问题。程序员没有足够注意编写信息丰富的错误消息。
  • 同意。看起来 CPLEX 只会在调用的任何向量的大小不一致时创建一个非常通用的“不一致参数”。用户必须自己检查向量的长度才能弄清楚...

标签: python jupyter-notebook constraints linear-programming cplex


【解决方案1】:

看起来这个问题已经在 cmets 中得到了回答。总之,my_sensemy_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、sense、rhs、range_values、names”。那会有帮助吗?

【讨论】:

  • 我想会的。谢谢你的解释!
  • @Sam:感谢您的反馈。我将为此错误消息改进创建一个新问题。
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2020-09-29
  • 2018-04-27
  • 2018-12-01
相关资源
最近更新 更多