【问题标题】:How to prevent infeasible error with pulp and python?如何防止纸浆和python出现不可行的错误?
【发布时间】:2016-01-03 20:35:11
【问题描述】:

我有一个优化问题,我编写了一个 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':
    ...

【问题讨论】:

    标签: python cplex pulp


    【解决方案1】:

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

    因此,与其添加类似的硬约束

    sum(x) <= K
    

    你可以试试

    sum(x) <= K + penaltyVar 
    

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

    在模型的不同位置添加这些松弛/惩罚变量有助于确定哪些地方的约束过于严格,从而使您的模型不可行。

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

    【讨论】:

      【解决方案2】:

      我认为您可以通过将语句限制在 try-exception 子句中来解决此问题。

      例如:

      # ...
      try:
          status = prob.solve(pulp.CPLEX(msg = 0))
      except PulpSolverError:
          # infeasible
          return 0
      
      return status
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多