Как и другие, эти проблемы очень сложны, и не существует простого решения или простого алгоритма, применимых ко всем классам проблем.
«Классический» способ решения этой проблемы - выполнить ветвление и привязать и применить симплексный алгоритм к каждому узлу, как вы говорите в своем вопросе. Однако я бы не рекомендовал реализовывать это самостоятельно, если вы не являетесь экспертом.
Что касается многих численных методов, очень сложно сделать это правильно (хорошие значения параметров, хорошая оптимизация), и многое было сделано (см. CPLEX, COIN_OR и т. Д.).
Дело не в том, что вы не можете этого сделать: часть ветвления и привязки довольно проста, но без всех уловок ваша программа будет действительно медленной.
Кроме того, вам понадобится симплексная реализация, и это не то, что вы хотите делать самостоятельно: вам все равно придется использовать стороннюю библиотеку.
Скорее всего,
- если ваш набор данных не такой большой (попробуйте!), и вы не заинтересованы в быстром его решении: используйте что-то вроде COIN-OR или lp_solve с методом по умолчанию, это сработает;
- если ваш набор данных действительно велик (и / или вам каждый раз нужно быстро находить решение), вам нужно работать с экспертом в этой области.
Я хочу сказать, что только опытные люди будут знать, какой алгоритм лучше справится с вашей проблемой, какую форму модели будет легче всего решить, какой метод применить и какие оптимизации вы можете попробовать. .
Если вас интересуют эти задачи, я бы порекомендовал эту книгу для введения в математику, лежащую в основе всего этого (с большим количеством примеров). Он невероятно обширен, поэтому вы можете пойти в библиотеку, а не покупать ее: Немхаузер и Вулси.
person
Nicolas Grebille
schedule
06.09.2011