3

我目前正在使用CyLPPython 中的包进行混合整数线性编程。但是,我无法初始化整数变量。根据文档,我已经传递isInt = TrueaddVariable方法,但它什么也没做。

我的程序的一个最小示例如下所示。时的最佳值应该是 2 x = y = 1,但结果却不如预期。

import cylp
from cylp.cy import CyClpSimplex
print(cylp.__version__) # 0.91.0

s = CyClpSimplex()
x = s.addVariable('x', 1, isInt = True)
y = s.addVariable('y', 1, isInt = True)
s += x >= 0.5
s += y >= 0.7

s.objective = x + y
s.optimizationDirection = 'min'

s.primal()
# Clp3002W Empty problem - 0 rows, 2 columns and 0 elements
# Clp0000I Optimal - objective value 1.2

x_opt = s.primalVariableSolution['x'][0]
y_opt = s.primalVariableSolution['y'][0]
print(x_opt, y_opt) # 0.5, 0.7

有没有其他方法来初始化整数变量CyLP?或者我错过了一些关于addVariable方法的东西?

顺便说一句,我想Clp3002W Empty problem知道s.primal().

提前致谢。

4

1 回答 1

4

这有点意思。

当您尝试进行混合整数规划时, Clp是一个线性规划求解器。

您将需要使用建立在 Clp(同一个人/同一个人)之上的Cbc 。我认为,人们可以认识到这大部分是几十年来的一个人的项目(不直观的设计;也许)。

是的,CyLp 是基于 Cbc,但使用仍然需要注意!

假设您的变量定义没问题(未检查),您将需要执行以下操作:

# model = CyClpSimplex()                                           
# ...

cbcModel = model.getCbcModel()  # Clp -> Cbc model / LP -> MIP

status = cbcModel.solve()           #-> "Call CbcMain. Solve the problem
                                    #   "using the same parameters used
                                    #   "by CbcSolver."
                                    # This deviates from cylp's docs which are sparse!
                                    # -> preprocessing will be used and is very important!

另请参阅此包装器

if data[s.BOOL_IDX] or data[s.INT_IDX]:
    # MIP
    # Convert model
    cbcModel = model.getCbcModel()

    # cylp: /cylp/cy/CyCbcModel.pyx#L134
    # Call CbcMain. Solve the problem using the same parameters used by
    # CbcSolver. Equivalent to solving the model from the command line
    # using cbc's binary.
    cbcModel.solve()
    status = cbcModel.status
else:
    # LP
    # cylp: /cylp/cy/CyClpSimplex.pyx
    # Run CLP's initialSolve. It does a presolve and uses primal or dual
    # Simplex to solve a problem.
    status = model.initialSolve()

我很久以前写过这些东西,因此我无法给你确切的细节(这些电话和评论背后的背景)。

但总的来说:很难掌握 Cbc 内部到底发生了什么(尽管我认为在改进 API 方面做了一些工作;但可能没有反映在 Cylp 中)。例如:以与 Cbc 可执行文件相同的方式从代码中使用 Cbc 并非易事。

顺便说一句,我想知道 Clp3002W Empty 问题在 s.primal() 的输出中意味着什么。

Clp3002W 空问题 - 0 行、2 列和 0 个元素

我的解释:

您的(转换后的)模型没有约束。您添加了约束来强制执行变量界限,但 Clp/Cbc 已经足够先进(它非常先进),可以将这些约束转换为变量界限(不再有约束!),这些界限通过 Simplex-Routine 中的特殊处理来处理。

0 rows = 0 constraints

0 elements = 0 non-zero elements in your constraint-matrix of size
        rows * cols = 0 * 2 = 0
    
于 2020-08-05T14:10:38.343 回答