python - 如何防止 PuLP 和 python 出现不可行错误?

标签 python cplex pulp

我有一个优化问题,我写了一个 python 程序来解决它。我将 Pulp 与 CPLEX 求解器结合使用:

import pulp

prob = LpProblem("myProblem", LpMinimize)
x = pulp.LpVariable.dicts("p", range( K ), 0, 1, pulp.LpContinuous)
prob += pulp.lpSum( x[k] for k in range( K ) )
...
# Rest of the constraints

status = prob.solve( pulp.CPLEX( msg = 0 ) )

我得到错误:

  File "C:\Anaconda\lib\site-packages\pulp\solvers.py", line 468, in readsol
    raise PulpSolverError, "Unknown status returned by CPLEX: "+statusString
pulp.solvers.PulpSolverError: Unknown status returned by CPLEX: infeasible

我的问题是:如何测试问题是否不可行?我想阻止这个事件,比如如果问题不可行则返回 0。

我试过了:

if prob.status == 'infeasible':
    ...

我试过了

if pulp.LpStatusInfeasible == 'infeasible':
    ...

最佳答案

您的“问题”是确定给定的问题实例是否可行,或者您是否真的对可行的解决方案感兴趣。我不会仅仅在模型不可行时捕获错误,而是会检查您的问题并尝试添加一些松弛变量和惩罚成本,以便在问题不可行时为您提供更多信息。

所以与其添加像

这样的硬约束
sum(x) <= K

你可以尝试类似的东西

sum(x) <= K + penaltyVar 

并在您的目标中添加一个术语,例如 1000000 * penaltyVar,这样求解器就真的不想将该惩罚变量用作非零值。

在模型的不同位置添加这些松弛/惩罚变量可以帮助确定约束太紧以及使模型不可行的地方。

不过,不要只是忽略上面的答案,因为捕获错误仍然很有值(value)。

关于python - 如何防止 PuLP 和 python 出现不可行错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34581299/

相关文章:

python - 使用 OpenCV 的 VideoCapture 方法进行高效链接处理? {编辑}

Python:对多个字典使用相同的键TypeError: 'str'对象不支持项目分配

python - 搜索包含回车符和换行符的子字符串

python - 提取细胞状态 LSTM Keras

cplex - GAMS CPLEX 了解 IIS 报告

python - CPLEX 和 Python 3.7

python - 使用 PuLP 最小化目标函数

c++ - 如何使用 IloCplex::readSolution() 并在查询 cplex 类实例后获取 var。值(value)观和其他值(value)观?

python - 将所有组合存储在列表中时如何避免内存错误

python - 如何在 PuLP Python 中指定两个变量相乘的约束?