Оптимизация — Преобразование векторных массивов в файлы .MPS с переполнением стека

Я пытаюсь использовать программное обеспечение линейного программирования (LP) Coin-OR для решения ряда линейных программ. Большая часть данных для каждой программы содержится в нескольких файлах .csv, но некоторые данные необходимо пересматривать каждый раз, когда я запускаю линейную оптимизацию.

Похоже, что я могу только попросить, чтобы программа-решатель Coin-OR считала файлы .MPS, и можно создать файл .MPS отдельно, используя такую ​​программу, как AMPL. Но, учитывая, что я пытаюсь запустить автоматизированную серию этих итераций оптимизации, не представляется возможным просто создать один экземпляр проблемы с AMPL или Gurobi, а затем вызвать решатель для получившегося файла .MPS; Мне нужно, чтобы файл менялся при каждой проблеме, возможно, тысячи или миллионы раз.

Так кто-нибудь знает, существует ли библиотека C ++, которая может преобразовывать векторные массивы или другие стандартные структуры данных C ++ в файлы .MPS? В качестве альтернативы, есть ли способ, которым я могу указать эти структуры данных в качестве входных данных для решателя LP Coin-OR?

2

Решение

Разве не лучше вызывать CLP Coin-OR через его API? Для чистых пластинок запись и чтение файлов MPS могут стать дорогими. В противном случае CLP имеет свой собственный MPSWriter, который вы можете позаимствовать: CoinMpsIO :: writeMps. Если вы используете много похожих моделей, возможно, вы захотите запустить солвер. Также AMPL имеет прямой интерфейс COIN-OR CLP (https://github.com/ampl/coin) поэтому не нужно проходить через файл MPS.

2

Другие решения

Как сказал Эрвин. Используйте API. Использование файлов MPS или аналогичных полезно для опробования данной модели на разных решателях. Формат LP хорош для понимания того, реализует ли ваша модель то, что вы ожидали. Может быть, даже использовать файлы MPS для архивации конкретных случаев для регрессионного тестирования или аналогичных. Но НИКТО не должен создавать файлы для подачи в решатель. Если это вообще возможно, используйте API.

0