Составление MIP с помощью FICO xpress с использованием Pyomo

Вся документация по использованию смешанного целочисленного программирования с Xpress предназначена для формулирования проблемы на чистом питоне, но я ничего не смог найти для таких пакетов, как Pyomo.

Во-первых, как настроить Pyomo для запуска модели MIP? Несмотря на то, что моя задача решаема, бинарные переменные оказываются небинарными.

Во-вторых, я хочу установить такие параметры, как miptol и miprelstop для xpress в Pyomo. Используя чистый Python, я бы сделал p.setControl('miprelstop', 1e-9). Но непонятно, как бы я задал эти параметры с помощью Pyomo.


person Tina    schedule 04.12.2020    source источник


Ответы (1)


Чтобы пометить переменную как двоичную, вы должны определить ее как within ограничение Binary:

model.z = pyo.Var(bounds=(0, 1)), within=pyo.Binary)

Настройка элементов управления выполняется с помощью атрибута options решателя. Вот краткий пример, который создает простую модель, устанавливает параметры и решает.

import pyomo.environ as pyo

model = pyo.ConcreteModel()
model.x = pyo.Var(bounds=(0, 1))
model.y = pyo.Var(bounds=(0, 1))
model.z = pyo.Var(bounds=(0, 1), within=pyo.Binary)
model.c = pyo.Constraint(expr = model.z >= 0.5)
model.obj = pyo.Objective(expr = model.x - 2 * model.y + 3 * model.z,
                          sense = pyo.minimize)

opt = pyo.SolverFactory('xpress_direct')

opt.options['miprelstop'] = 1e-9
opt.options['miptol'] = 0.5

results = opt.solve(model)

print('x =', pyo.value(model.x))
print('y =', pyo.value(model.y))
print('z =', pyo.value(model.z))

Это выводит (среди прочего)

x = 0.0
y = 1.0
z = 1.0

что показывает, что бинарное условие для z было соблюдено (иначе оптимальное значение для z было бы равно 0,5). Он также показывает измененные значения параметров в выходном журнале.

person Daniel Junglas    schedule 04.02.2021