Вершина переборных алгоритмов.

Oct 29, 2012 02:12

Вершиной переборных алгоритмов я считаю решение проблемы выполнимости булевой формулы.

Ибо переборный алгоритм по сути своей доказательство теоремы.

Вот здесь находится краткое описание, как работают современные системы.

Интересных вещей там три: обучение конфликтам, периодические перезапуски и ускоренный откат (backjumping, он же откат с учётом конфликта).

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

Периодические перезапуски позволяют избежать перебора в локальном минимуме, так сказать. Они выполняются после некоторого числа конфликтов (которое возрастает после каждого рестарта, гарантируя определение решения, если оно есть) и начинает назначение переменных заново - желательно, в другом порядке.

Ускоренный откат ещё интересней. Для доказательства отсутствия решения нам надо перебрать все возможные варианты назначений переменных. Если у нас проблема всего лишь в одном узком месте, а пространство перебора велико, то мы можем безуспешно перебирать очень долго. По ссылке выше приведён пример с 4-мя переменными, которые надо присвоить в определённые значения, а есть ещё 100 переменных, которые практически неважно, как присвоить. И вот представьте себе, что у вас противоречие в этих нескольких переменных, а все остальные не столь важны. Без ускоренного отката не получится сократить время перебора всех значений.

Так что, если вы решаете переборную задачу, то просто необходимо знать о SAT. Переборные задачи чаще всего встречаются в компиляторах. Поэтому... ;)

алгоритмы, sat

Previous post Next post
Up