Инициализировать целочисленные переменные в CyLP - PullRequest
1 голос
/ 05 августа 2020

В настоящее время я использую пакет CyLP в Python для смешанно-целочисленного линейного программирования. Однако я не могу инициализировать целочисленные переменные. Согласно документации , я передал isInt = True метод addVariable, но он ничего не делает.

Минимальный пример моей программы показан ниже. Оптимальное значение должно быть 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().

Заранее спасибо.

1 Ответ

1 голос
/ 05 августа 2020

Это немного среднее значение.

Clp - это решающая программа Linear-Programming , пока вы пытаетесь выполнить Mixed-Integer-Programming .

Вам нужно будет использовать Cb c, который построен поверх Clp (тот же человек / те же люди). Я думаю, что можно понять, что большая часть этого проекта - это работа одного человека на протяжении десятилетий (неинтуитивный дизайн; возможно).

Да, CyLp основан на Cb c, но использование все еще необходимо Care!

Предполагая, что ваши определения переменных в порядке (не проверял), вам нужно будет сделать что-то например :

# 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()

Я писал эти вещи много времени go, поэтому я не могу дать вам точных деталей (предыстория этих вызовов и комментариев).

Но в целом: трудно понять asp, что именно происходит внутри Cb c (хотя я думаю, что была некоторая работа по улучшению API; вероятно, НЕ отражено в Cylp хотя). Например: нетривиально использовать Cb c из кода так же, как ведет себя исполняемый файл Cb c.

Кстати, мне интересно, что означает проблема Clp3002W Empty в выводе of s.primal ().

Clp3002W Пустая проблема - 0 строк, 2 столбца и 0 элементов

Моя интерпретация:

Ваша (преобразованная) модель не имеет ограничений. Вы добавили ограничения для применения переменных , но Clp / Cb c достаточно продвинут (он очень продвинутый), чтобы преобразовать эти ограничения в переменные (больше никаких ограничений!), Которые обрабатываются специальными лечение в Simplex-Routine.

0 rows = 0 constraints

0 elements = 0 non-zero elements in your constraint-matrix of size
        rows * cols = 0 * 2 = 0
    
...