Получение суффикса .rc от cplex при использовании Pyomo с интерфейсом решателя NL / ASL

Я хотел бы получить суффиксы .rc или .urc для моих переменных из решателя cplex, используя Pyomo с интерфейсом NL / ASL. Этот интерфейс обычно быстрее, чем интерфейс cplex по умолчанию для моих моделей. Однако я не могу заставить интерфейс NL возвращать эти суффиксы. Если я использую решатель cplex с параметрами по умолчанию, я получаю значения для суффикса rc. Однако, если я использую solver_io = 'nl' или устанавливаю для решателя значение 'cplexamp' (что, как мне кажется, делает то же самое), я не получаю значений rc. (Я могу получить двойные, но не rc.)

Вот пример кода:

from pyomo.environ import *
from pyomo.opt import SolverFactory

def show_rc(m, *args, **kwargs):
    opt = SolverFactory(*args, **kwargs)
    results = opt.solve(m, suffixes=['rc'])
    m.solutions.load_from(results)
    m.rc.pprint()

m = ConcreteModel()
m.X = Var(bounds=(0, 1))
m.obj = Objective(rule=lambda m: 3.14 * m.X, sense=maximize)
m.rc = Suffix(direction=Suffix.IMPORT, datatype=Suffix.FLOAT)

show_rc(m, "cplex")                  # has value 3.14
show_rc(m, "cplex", solver_io="nl")  # no value returned
show_rc(m, "cplexamp")               # no value returned

В документации конкретно упоминается снижение затрат с помощью суффикса, а Суффикс .rc кажется стандартным местом для этого в AMPL, но мне не удалось прочитать это через интерфейс Pyomo NL. Может кто-то указать мне верное направление?


person Matthias Fripp    schedule 07.10.2016    source источник


Ответы (1)


К сожалению, исполняемый файл cplexamp не возвращает снижение затрат в файле решения (я только что проверил). Я полагаю, что AMPL вычисляет их, используя возвращаемое двойное решение. Я бы открыл заявку на GitHub. Возможно, мы сможем добавить эту функциональность в наш интерфейс ASL.

Что касается скорости, вам следует опробовать основанный на Python интерфейс Pyomo для Cplex (solver_io = "python"). Обычно это намного быстрее, так как не требует ввода-вывода файлов. Вам нужно будет установить привязки Cplex-Python, прежде чем вы сможете использовать этот интерфейс через Pyomo. Если вы можете «импортировать cplex», тогда все будет в порядке.

Изменить: я забыл упомянуть, что solver_io = "python" действительно возвращает снижение затрат для Cplex.

person Gabe Hackebeil    schedule 07.10.2016
comment
Большое спасибо за вашу помощь с этим. Я попробовал интерфейс Python, но обнаружил, что он работает намного медленнее. Для небольшой версии моей реальной модели шаг opt.solve() занимает 5,0 секунды с solver_io="nl", 5,3 секунды без указания solver_io или 22 секунды с solver_io = python. Думаю, я отправлю запрос об интерфейсе ASL и пока оставлю solver_io неуказанным. - person Matthias Fripp; 08.10.2016
comment
В интерфейс Pyomo Cplex-Python версии 4.3.11323 было внесено исправление, которое должно было иметь довольно большое влияние на производительность (в хорошем смысле). Можете ли вы подтвердить, что вы не используете более раннюю версию, чем этот выпуск? - person Gabe Hackebeil; 08.10.2016
comment
Только что проверил, а я уже пользовался Pyomo 4.3.11377. Я обновился до 4.4.1, и времена стали лучше, но привязки python все еще медленные. Я только что разместил сообщение о проблеме на странице github.com/Pyomo/pyomo/issues/51. Все еще нужно опубликовать сообщение о проблеме ASL / rc. - person Matthias Fripp; 12.10.2016