Алгоритм минимизации в целочисленном программировании

Я понимаю, что минимизация в целочисленном программировании - очень сложная проблема. Но что делает эту проблему такой сложной?

Если бы мне пришлось (попытаться) написать алгоритм для ее решения, что мне нужно было бы принять во внимание? Я знаком только с техникой ветвей и границ для ее решения, и мне интересно, с какими препятствиями я столкнусь при попытке применить эту технику программно.


person jmnwong    schedule 05.09.2011    source источник


Ответы (4)


Как и другие, эти проблемы очень сложны, и не существует простого решения или простого алгоритма, применимых ко всем классам проблем.

«Классический» способ решения этой проблемы - выполнить ветвление и привязать и применить симплексный алгоритм к каждому узлу, как вы говорите в своем вопросе. Однако я бы не рекомендовал реализовывать это самостоятельно, если вы не являетесь экспертом.

Что касается многих численных методов, очень сложно сделать это правильно (хорошие значения параметров, хорошая оптимизация), и многое было сделано (см. CPLEX, COIN_OR и т. Д.).

Дело не в том, что вы не можете этого сделать: часть ветвления и привязки довольно проста, но без всех уловок ваша программа будет действительно медленной.

Кроме того, вам понадобится симплексная реализация, и это не то, что вы хотите делать самостоятельно: вам все равно придется использовать стороннюю библиотеку.

Скорее всего,

  • если ваш набор данных не такой большой (попробуйте!), и вы не заинтересованы в быстром его решении: используйте что-то вроде COIN-OR или lp_solve с методом по умолчанию, это сработает;
  • если ваш набор данных действительно велик (и / или вам каждый раз нужно быстро находить решение), вам нужно работать с экспертом в этой области.

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

Если вас интересуют эти задачи, я бы порекомендовал эту книгу для введения в математику, лежащую в основе всего этого (с большим количеством примеров). Он невероятно обширен, поэтому вы можете пойти в библиотеку, а не покупать ее: Немхаузер и Вулси.

person Nicolas Grebille    schedule 06.09.2011
comment
В чем проблема с симплексной реализацией? Это должно быть довольно просто, если вы поймете лежащую в основе математику (которая проста). - person Konrad Rudolph; 06.09.2011
comment
@Konrad Избегать циклов на вырожденных узлах - это немного сложно (не действительно трудная мысль). Часто люди хотят реализовать его с полными массивами в памяти вместо пересмотренного симплексного метода. Плюс много оптимизаций ... Я не говорю, что вы не можете этого сделать, но я не вижу в этом смысла, так как это много очень хороших (и бесплатных) реализаций, и это, безусловно, много Работа. - person Nicolas Grebille; 06.09.2011

Мне интересно, с какими препятствиями я столкнусь, пытаясь применить эту технику программно.

В частности, нет (при условии довольно простой реализации без множества уловок). Алгоритмы не сложные - они сложные, и это фундаментальное отличие.

Такие методы, как «ветвление и привязка» или «ветвление и разрез», пытаются сократить дерево поиска и, таким образом, сократить время выполнения. Но все дерево проблем, тем не менее, экспоненциально велико, отсюда и проблема.

person Konrad Rudolph    schedule 05.09.2011
comment
Итак, какие методы оптимизации существуют для обработки все больших и больших наборов данных? - person jmnwong; 05.09.2011
comment
@canistr Проблема не столько в оптимизации, сколько в поиске лучших алгоритмов. Я не знаю современного состояния дел, так как это очень активное исследование, но один алгоритм, который может помочь, - это метод внутренней точки. Если вам действительно интересно, посмотрите, как профессиональные программы, такие как CPLEX (с закрытым исходным кодом) или SCIP или lp_solve (оба Открытый исходный код) сделайте это. - person Konrad Rudolph; 05.09.2011
comment
@canistr Всего два примера: en.wikipedia.org/wiki/Cutting-plane_method и en.wikipedia.org/wiki/Dantzig-Wolfe_decomposition. Надеюсь это поможет! - person Nicolas Grebille; 06.09.2011

Целочисленное программирование NP-сложно. Вот почему это так сложно.

Возможно, вас заинтересует учебник.

person Mu Qiao    schedule 05.09.2011

Прежде чем решать любую задачу математической оптимизации, вы в первую очередь классифицируете ее. За исключением особых случаев, в большинстве случаев задачи целочисленного программирования будут непростыми. Поэтому вместо использования «алгоритма» вы будете использовать «эвристику». Окончательное решение, которое вы найдете, не будет гарантированно оптимальным, но это будет довольно хорошее решение реальных проблем.

Вашим главным препятствием будут ваши навыки программирования. Эвристическое программирование требует хорошего уровня понимания программирования. Поэтому вместо программирования собственной эвристики лучше использовать хорошо известный пакет (например, COIN-OR, бесплатно). Таким образом, вы можете сосредоточиться на своей проблеме, а не на эвристике.

person Haluk    schedule 05.09.2011