Как написать простой файл MPS для отправки на серверы NEOS

Я пытаюсь найти решатель lp с открытым исходным кодом, который достаточно быстр для моей проблемы. Я пытаюсь создать файл MPS, чтобы отправить его на серверы NEOS и сравнить производительность разных решателей.

Моя проблема включает, в самых сложных случаях, что-то около 150 целочисленных переменных, но я начну с простого случая, чтобы помочь мне понять, как работает формат файла MPS.

Это проблема:

minimize  : 330.3 * M1 + 1132.88 * M2 + 955.86 * M3
subject to:
         20 <= 60 * M2 <= 20.9
         20 <= 34 * M3 <= 20.9
         M1 + M2 + M3 = 1

и я написал следующий файл MPS:

NAME problema1
ROWS
 L  K
 L  N
 E  ONE
 N  CUSTO
COLUMNS
    M1        ONE       1              CUSTO     330.3
    M2        K         60
    M2        ONE       1              CUSTO     1132.88
    M3        N         34
    M3        ONE       1              CUSTO     955.86
RHS
    KLESS     K         20.9
    NLESS     N         20.9
    ONEREST   ONE       1
RANGES
    RANGE1    K         0.9
    RANGE2    N         0.9
ENDATA

Использование линейных решателей, доступных на NEOS (https://neos-server.org/neos/solvers/index.html), только Gurobi может решить эту проблему. Другие считают, что проблема невыполнима (а это не так).

Я почти уверен, что это проблема с моим файлом MPS, но я просто не могу понять, что это такое. Что я делаю неправильно?


person Fausto Richetti Blanco    schedule 29.01.2017    source источник
comment
Может быть, добавить еще немного фона. Если вы ищете только какой-нибудь решатель с открытым исходным кодом для MIP-проблем, то кандидатов не так много: Coin CBC, GLPK и lpsolve (в таком порядке для меня) как бесплатное программное обеспечение и SCIP (с открытым исходным кодом, но несвободный; даже побить CBC). Примечание: существует большой разрыв между открытым исходным кодом и коммерческими решателями (такими как Gurobi, CPLEX и Mosek). Также проверьте эти тесты. Если вы действительно хотите выполнить все эти тесты, почему бы не использовать один из них для создания этих стандартизированных MPS-файлов (у GLPK может быть лучшая документация)?   -  person sascha    schedule 30.01.2017
comment
NEOS для некоторых решателей также принимает формат .lp, который более удобочитаем, чем .mps.   -  person Rich L    schedule 30.01.2017
comment
Спасибо за ваш вклад @sascha Я знаю о разрыве между открытым исходным кодом и коммерческими решателями. Однако коммерческие решатели очень дороги, когда вам нужно масштабировать решение для большого количества пользователей, как в моем случае. Я думаю, что для размера моей проблемы решатель с открытым исходным кодом, подобный тем, которые вы процитировали, может помочь.   -  person Fausto Richetti Blanco    schedule 31.01.2017
comment
Спасибо @RichL Однако меня интересует решатель Cbc, для которого сервер NEOS не принимает формат .lp в качестве входных данных.   -  person Fausto Richetti Blanco    schedule 31.01.2017


Ответы (1)


Действительно, в вашем файле MPS есть проблема. Строки в разделе RHS должны иметь одно имя, например.

RHS
    RHS1      K         20.9
    RHS1      N         20.9
    RHS1      ONE       1

В основном решатель выбирает один набор RHS. Аналогично для раздела ДИАПАЗОНЫ. Я не уверен, что вы имели в виду, используя строки в разделе ДИАПАЗОНЫ.

person Erwin Kalvelagen    schedule 30.01.2017
comment
Спасибо Эрвин! Это решило мою проблему =) Раздел RANGES должен указать ограничение ›= для указанных строк. Таким образом, строка K будет между 20,9 и 20 (20,9 указано в разделе RHS - 0,9 указано в разделе RANGES). То же самое для строки N - person Fausto Richetti Blanco; 30.01.2017
comment
Да, я пропустил эту часть ‹= (было поздно) - person Erwin Kalvelagen; 30.01.2017
comment
Как бы вы добавили целочисленные ограничения на переменные M1, M2 и M3? - person Fausto Richetti Blanco; 31.01.2017
comment
Целочисленные переменные можно указать через пользовательский интерфейс в разделе BOUNDS или с помощью INTORG/INTEND. Проверьте документацию для вашего решателя. - person Erwin Kalvelagen; 31.01.2017
comment
Кажется, что у разных решателей для этого разное поведение. Но я смог решить свою проблему, используя ограничения LI. Спасибо! - person Fausto Richetti Blanco; 17.02.2017