【问题标题】:CPLEX quadratic objective CPLEX Error 1017: Not available for mixed-integer problemsCPLEX 二次目标 CPLEX 错误 1017:不适用于混合整数问题
【发布时间】:2019-01-15 03:55:21
【问题描述】:

我正在尝试使用 cplex 解决以下线性程序:

def generate_linear_program(self):
    problem = cplex.Cplex()
    problem.objective.set_sense(problem.objective.sense.minimize)
    for index, track in enumerate(self.tracks):
        tokens = track['track'].split('_')
        problem.variables.add(names = ['c' + str(tokens[1])], ub = [1.0], types = ['C'])
    problem.variables.add(names = ['e' + str(index) for index, param in enumerate(self.params)],
        types = ['C'] * len(self.params),
        ub = [param['c'] - param['u'] * param['r'] for param in self.params],
        lb = [param['c'] - param['u'] * param['r'] - param['c'] * sum(param['tracks'][track] for track in param['tracks']) for param in self.params])
    problem.variables.add(names = ['l' + str(index) for index, param in enumerate(self.params)],
        #obj = [1.0] * len(self.params),
        types = ['C'] * len(self.params))
    problem.objective.set_quadratic([0.0] * len(self.tracks) + [1.0] * len(self.params) + [0.0] * len(self.params))
    # add some linear constraints here
    problem.solve()

当我调用solve() 时,Cplex 抱怨错误消息CPLEX Error 1017: Not available for mixed-integer problems。如果我删除上面的二次目标,而是通过取消注释上面的代码行 (obj = [1.0] * len(self.params),) 添加一个线性目标,它可以正常工作。

堆栈跟踪:

File "/share/src/python/kmer/programming.py", line 373, in solve
    problem.solve()
File "/home/user/local/cplex/lib/python/cplex/__init__.py", line 998, in solve
    _proc.qpopt(self._env._e, self._lp)
File "/home/user/local/cplex/lib/python/cplex/_internal/_procedural.py", line 499, in qpopt
    check_status(env, status)
File "/home/user/local/cplex/lib/python/cplex/_internal/_procedural.py", line 171, in __call__
    raise CplexSolverError(error_string, env, status)
cplex.exceptions.errors.CplexSolverError: CPLEX Error  1017: Not available for mixed-integer problems.

为了更好地了解这里发生的情况,当目标是二次方时,我试图最小化一些误差项的平方和。当目标变为线性时,我将最小化这些项的绝对值之和。名称以e 开头的变量是错误项,ls 将通过这些约束成为它们的绝对值:

    for index, params in enumerate(self.params):
        problem.linear_constraints.add(
            lin_expr = [cplex.SparsePair(
                ind = [len(self.tracks) + len(self.params) + index, len(self.tracks) + index],
                val = [1.0, 1.0],
            )],
            rhs = [0],
            senses = ['G']
        )
        problem.linear_constraints.add(
            lin_expr = [cplex.SparsePair(
                ind = [len(self.tracks) + len(self.params) + index, len(self.tracks) + index],
                val = [1.0, -1.0],
            )],
            rhs = [0],
            senses = ['G']
        )

在存在二次目标时,l<index> 变量实际上是无用的。

还有其他线性约束,我不能在这里包括,但它们绝对不是问题的原因,因为以下两个原因:

  1. 线性物镜在存在时可以正常工作
  2. 当我使用二次目标将它们注释掉时,我仍然得到同样的错误。

我在这里错过了什么?

【问题讨论】:

  • 你能告诉我们完整的追溯吗?这可能包括一些重要的线索。

标签: python cplex quadratic-programming


【解决方案1】:

Cplex.variables.add 的文档中很容易忽略以下注释:

如果指定了类型,则问题类型将是 MIP,即使所有 变量被指定为连续的。

如果您从对Cplex.variables.add 的调用中删除可选的types 参数,问题应该会消失。例如,而不是:

problem.variables.add(names = ['c' + str(tokens[1])], ub = [1.0], types = ['C'])

使用:

problem.variables.add(names = ['c' + str(tokens[1])], ub = [1.0])

当你有一个线性目标时它起作用的原因是它被传递到CPXmipopt,为了方便,在CPXlpopt 失败后CPXERR_NOT_FOR_MIP(错误1017)。然而,当我们调用CPXqpopt 时,并没有应用这个逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多