Могу ли я получить способ изменить CPLEX на решатель CBC?

У меня есть программа MIP, основанная на решателе CPLEX (выполнимость pump2.0).

Моя задача - заставить эту программу работать на решателе CBC.

Поэтому я попытался изменить коды с соответствующими функциями, но размер программы слишком велик для изменения каждого кода CPLEX (размер исходного кода составляет почти 2 МБ).

Знаете ли вы эффективный способ или полезную ссылку?


person Shiny-Sneakers    schedule 23.07.2020    source источник
comment
Зависит от того, что происходит в этом коде и других деталях. Но если этот код основан на его проприетарном API (а не на обертке, как CoinOR OSI) и задача обусловлена ​​вопросами, подобными лицензии (цель = вообще не использовать CPLEX), то кроме портирования всего этого не так уж много: либо из с нуля или путем обертывания проприетарного API (более структурированного). Это будет болезненно. Если речь идет о том, чтобы попробовать второй решатель: запишите LP-файлы и заполните ими Cbc.   -  person sascha    schedule 24.07.2020
comment
Как говорит Саша, это зависит от того, какой API вы используете. Например, если вы использовали API-интерфейс Concert из C#, существует оболочка вокруг интерфейса CoinOR OSI под названием Sonnet, которая имеет API, аналогичный Concert, и может помочь упростить перевод/перенос на другой решатель. У нас также есть версия этой оболочки для C++, но она не поддерживается и тщательно не тестировалась.   -  person TimChippingtonDerrick    schedule 24.07.2020
comment
Спасибо за совет! Я никогда не думал об этом.   -  person Shiny-Sneakers    schedule 25.07.2020


Ответы (1)


Все может быть сложнее, чем вы себе представляете на данный момент: я сомневаюсь, что существует эквивалентная функция CBC для каждой функции CPLEX. Даже если функция имеет одинаковую сигнатуру, она может иметь несколько иную семантику. Так что все равно придется проверять их по одному. Некоторые функции CPLEX могут даже не иметь эквивалента в CBC, а некоторые используемые функции могут не поддерживаться CBC.

Лучшим подходом было бы (как предложено в некоторых комментариях) адаптировать код так, чтобы он использовал какой-то абстрактный и общий интерфейс, для которого у вас есть реализация CBC и CPLEX. Затем вы можете в любое время поменять базовый решатель.

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

  1. Найдите все функции CPLEX, используемые кодом.
  2. Найдите эквивалентную функцию в CBC. Если точного эквивалента не существует, создайте свою собственную функцию с точно такой же сигнатурой и семантикой, которая основана только на функциях CBC.
  3. Выполните поиск/замену по коду.

Трудным здесь является шаг 2. Он сильно зависит от того, какие функции CPLEX используются в вашем коде, и от того, насколько легко их сопоставить с функциями CBC.

person Daniel Junglas    schedule 24.07.2020
comment
Спасибо. Это будет полезно, когда я установлю стратегию модификации. - person Shiny-Sneakers; 25.07.2020