Как экспортировать решение cplex?

У меня есть файл quadratic_obj.lp со следующим содержанием:

Minimize
obj: a + b + [ a^2 + 4 a * b + 7 b^2 ]/2
Subject To
c1: a + b >= 10
End

В интерактивном сеансе cplex я читаю файл с помощью read, оптимизирую с помощью optimize. Затем я могу отобразить решение, используя

display solution variables -

что дает мне

Variable Name           Solution Value
a                            10.000000
b                             0.000000

Есть ли способ конвейеризации этого вывода? Итак, в идеальном мире было бы что-то вроде:

display solution variables - -> myoutput.csv

Я использовал write, но варианты типов файлов там не те, что я ищу. Например. sol возвращается как xml, который мне пришлось бы снова проанализировать.

Есть ли способ просто экспортировать переменные и их значения, например, в файл, разделенный табуляцией или запятыми?


person Cleb    schedule 15.04.2016    source источник


Ответы (2)


Нет автоматического способа сделать это из интерактивного. Если вы сделаете что-то вроде следующего, это приблизит вас:

./cplex -c "read quadratic_obj.lp" "opt" "set logfile tmp.log" "display solution variables -" "quit"

Результат будет помещен в файл с именем tmp.log, но там все еще есть некоторые дополнительные вещи, которые вам нужно будет обработать с помощью сценария (или чего-то подобного). См. в этом ссылка (для версии 12.6.3) для получения дополнительной информации об этой технике.

Другой альтернативой было бы использование API. Тогда у вас будет полный контроль над выводом. Например, используя Python API, вы можете сделать что-то вроде следующего:

import cplex

cpx = cplex.Cplex()
cpx.read('quadratic_obj.lp')
cpx.solve()
# Check solution status here via cpx.solution.get_status()
for name, value in zip(cpx.variables.get_names(),
                       cpx.solution.get_values()):
    print name, value
person rkersh    schedule 15.04.2016
comment
Это работает хорошо (версия Python API; другую не пробовал) - спасибо! Я поддерживаю его сейчас и, возможно, приму его позже, в зависимости от качества других ответов. - person Cleb; 16.04.2016
comment
Поддержка Python 3.6 была добавлена ​​в CPLEX 12.8. Подробные системные требования см. здесь. - person rkersh; 27.05.2018

вы можете сделать это в CPLEX с OPL:

dvar float+ a;
dvar float+ b;

minimize a + b + ( a*a + 4 *a * b + 7 *b*b )/2;
subject to
{
c1: a + b >= 10;
}

execute
{
var f=new IloOplOutputFile("res.csv");
f.writeln(a);
f.writeln(b);
f.close();
}

и это создаст файл csv res.csv с уважением

person Alex Fleischer    schedule 15.04.2016
comment
У меня, к сожалению, не работает. Он либо жалуется на умножение (CPLEX Error 1607: Line 4: Expected '+' or '-', found '*'.), если я вернусь к своему исходному определению, он жалуется на фигурные скобки (CPLEX Error 1608: Line 10: Expected '+','-' or sense, found '{'.), и без них я получаю CPLEX Error 1608: Line 10: Expected '+','-' or sense, found 'v'.Любые идеи? - person Cleb; 15.04.2016
comment
Вы должны использовать то, что я написал в файле model.mod, а затем в командной строке выполните oplrun model.mod - person Alex Fleischer; 15.04.2016
comment
Тогда я получаю: Command 'oplrun' does not exist. Type 'help' for a list of commands. - person Cleb; 15.04.2016
comment
какую версию cplex вы используете? какая платформа ? - person Alex Fleischer; 15.04.2016
comment
Пробовал с 12.2. и 12.6 в Ubuntu 14.04 и 15.10. - person Cleb; 16.04.2016
comment
comment
Эта ссылка помогла. Так что я тоже поддерживаю ваш ответ, спасибо! - person Cleb; 18.04.2016