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

Если у кого-то есть следующая проблема двоичного целочисленного программирования

Minimize      ax_1 + bx_2 + cx_3
Subject to    x_1 + x_2 <= 2
              3x_1 + 3x_2 >= 6
              x_2 + 2x_3 = 2

С представлением решения

[x_1, x_2, x_3]

Где x_i = 0 или 1.

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

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

0
user308225 7 Янв 2017 в 16:35

1 ответ

Лучший ответ

Проблема поиска допустимого решения некоторой проблемы двоичного целочисленного программирования уже NP-завершена . Это одна из 21 популярных NP-полных задач Карпа -> wiki: Целочисленное программирование 0–1 !

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

  • Решатели для целочисленного программирования (симплекс + переход и граница + плоскости разреза)
    • например Gurobi, CPLEX (коммерческий) или CBC / GLPK (с открытым исходным кодом)
  • Решатели программирования ограничений
    • например Gecode (с открытым исходным кодом)
  • SAT решатели
    • например MiniSat (с открытым исходным кодом)

Они также используют эвристику внутри (на самом деле они должны: потому что проблема NP-полная).

Если вы не хотите использовать общие алгоритмы / программное обеспечение, вам нужно настроить эвристику специально для какой-либо проблемы. Но эти проблемы, о которых вы говорите, немного отличаются, и может потребоваться другая эвристика. Также важно проанализировать специальную структуру в ваших экземплярах (случайные экземпляры ведут себя очень иначе, чем большинство реальных проблем)! При разработке этой специальной эвристики вы можете реализовать некоторый неполный подход, который может лучше работать в вашем случае.

Проблема, с которой вы сталкиваетесь, - поиск начального возможного решения - также очень распространена во многих метаэвристиках!

Это сложная тема!

2
sascha 8 Янв 2017 в 15:58
Спасибо, что немного прояснилось. Я думаю, что сравнивал эту проблему с поиском начального решения TSP, где я мог бы использовать случайную перестановку или алгоритм ближайшего соседа. Однако здесь я не могу использовать случайное начальное решение, так как это, вероятно, было бы недопустимым решением.
 – 
user308225
7 Янв 2017 в 17:33
Ты прав. TSP - очень хороший пример сложной проблемы, выполнимость которой не является проблемой.
 – 
sascha
7 Янв 2017 в 17:56
1
Хорошие комментарии. Я также использовал простую жадную эвристику в других задачах, чтобы получить начальное решение, основанное на знании структуры проблемы и вероятных хороших выборах на каждом этапе. Некоторые проблемы делают это относительно легко, но другие действительно сложно даже найти какое-либо возможное решение. Даже в этом случае некоторые коммерческие решатели могут использовать частичное начальное решение в качестве отправной точки.
 – 
TimChippingtonDerrick
8 Янв 2017 в 09:33