Предлагая нижнюю оценку для решателя ILP
У меня есть целочисленная задача линейного программирования, которую решатели, которых я пробовал (CPLEX, CBC), очень долго решали, хотя они и находили оптимальное решение на ранней стадии. Они просто берут навсегда, чтобы полностью доказать это.
Легко вычислить тривиальную нижнюю границу для объективного значения моей проблемы минимизации, но в выводе CPLEX (столбец Best Bound) я вижу, что он даже близко не подходит в течение долгого и долгого времени. Он находит действительно хорошие решения почти сразу, но ошибочно полагает, что оптимальное решение может быть намного лучше.
Теперь я должен признать, что на самом деле не знаю, как работают эти решатели, но похоже, что они тратят время, пытаясь улучшить смехотворно слабые нижние границы, охотясь за невероятно оптимистичными решениями. Итак, мои вопросы:
Может ли указание решателю приличной нижней границы цели помочь ему быстрее пройти?
Если да, то какие решатели могут принять известную нижнюю границу, предоставленную в качестве дополнительного ввода?
В качестве иллюстрации я вставляю первые несколько строк вывода CPLEX из примера выполнения (который продолжается гораздо дольше, без дальнейшего улучшения цели и мучительно медленного улучшения наилучшей границы):
Nodes Cuts/
Node Left Objective IInf Best Integer Best Bound ItCnt Gap
0 0 -388.6997 178 -388.6997 9
* 0+ 0 297.0000 -388.6997 9 230.88%
* 0+ 0 275.0000 -388.6997 9 241.35%
0 2 -388.6997 178 275.0000 -387.8106 9 241.02%
* 20+ 20 185.0000 -307.6363 80 266.29%
* 30+ 30 135.0000 -307.6363 90 327.88%
* 30+ 30 94.0000 -307.6363 90 427.27%
* 60+ 60 90.0000 -307.6363 120 441.82%
* 160+ 126 77.0000 -307.6363 272 499.53%
* 200+ 93 12.0000 -307.4836 325 ---
300 182 -135.2988 107 12.0000 -268.6638 466 ---
1200 934 -50.6022 85 12.0000 -206.2938 1480 ---
2197 1755 -96.9612 93 12.0000 -189.8013 2470 ---
3226 2600 -2.8316 87 12.0000 -179.9669 3480 ---
4374 3521 -156.2442 110 12.0000 -170.4183 4567 ---
5490 4421 -128.0871 97 12.0000 -167.3696 5623 ---
6971 5603 -147.5022 108 12.0000 -162.4180 7055 ---
8739 6997 -103.5374 113 12.0000 -156.3532 8673 ---
Хотелось бы сказать, чтобы решатель не потрудился искать решения с целью ниже 10 (потому что я могу доказать это гораздо более простым методом) и особенно не с отрицательным объективным значением (потому что это даже невозможно в моей модели).
1 ответ
Если у вас есть хорошая нижняя граница из возможного решения, вы можете предоставить это как начало MIP для CPLEX.
Затем CPLEX попытается улучшить это решение и проигнорировать все ветви в своем алгоритме ветвления и границ, у которых граница ниже этой.
Более подробную информацию вы можете найти здесь: https://www.ibm.com/support/knowledgecenter/SS9UKU_12.5.0/com.ibm.cplex.zos.help/UsrMan/topics/discr_optim/mip/para/49_mipStarts.html