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