Почему нет алгоритмов аппроксимации для SAT и других задач решения?


18

У меня NP-полное решение проблемы. Учитывая пример проблемы, я хотел бы разработать алгоритм, который выводит ДА, если проблема выполнима, и НЕТ, в противном случае. (Конечно, если алгоритм не является оптимальным, он будет делать ошибки.)

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

Почему, например, мы не определяем коэффициент аппроксимации как нечто пропорциональное количеству ошибок, которые допускает алгоритм? Как мы на самом деле решаем проблемы решения жадным и неоптимальным образом?


5
Для MAX-SAT существуют алгоритмы аппроксимации.
Юваль Фильмус

2
MAX-SAT - это не решение проблемы, нет?
Рибз

15
Аппроксимационные алгоритмы всегда для задач оптимизации.
Юваль Фильмус

4
Таким образом, вы в основном хотите иметь алгоритм, который быстро завершается, но иногда может давать неправильный ответ. Я думаю, что вы сильно путаете вопросы, используя здесь четко определенные термины, такие как «алгоритм приближения» и «оптимальный». У них есть очень определенные значения. Я думаю, что вы ищете эвристику вместо этого - если вы обновите свой вопрос с этим термином (или начните с нуля с нового вопроса, чтобы избежать еще большей путаницы), у вас могут быть лучшие результаты.
AnoE

Хотя это не полный ответ, он объясняет одну из причин: существуют важные проблемы SAT, для которых неправильный только младший бит не лучше, чем неправильный полбита.
Джошуа

Ответы:


33

Алгоритмы аппроксимации предназначены только для задач оптимизации, а не для решения задач.

Почему мы не определяем отношение аппроксимации как долю ошибок, которые допускает алгоритм при попытке решить какую-то проблему решения? Потому что «коэффициент аппроксимации» - это термин с четко определенным стандартным значением, который означает что-то другое, и было бы неправильно использовать один и тот же термин для двух разных вещей.

Хорошо, можем ли мы определить какое-то другое отношение (давайте назовем это как-то иначе - например, «коэффициент det»), которое количественно определяет количество ошибок, которые допускает алгоритм, для некоторой проблемы решения? Ну, не понятно, как это сделать. Что будет знаменателем для этой фракции? Или, иначе говоря, проблемных экземпляров будет бесконечное число, и для некоторых из них алгоритм даст правильный ответ, а для других он даст неправильный ответ, так что вы получите соотношение, которое «что-то разделенное на бесконечность», и это в конечном итоге становится бессмысленным или не определенным.

В качестве альтернативы, мы можем определить как долю ошибок, допущенных ошибками алгоритма, на проблемных экземплярах размера n . Тогда мы могли бы вычислить предел r n при n , если такой предел существует. Это будетрNNрNNбыть четко определенным (если предел существует). Однако в большинстве случаев это может быть не очень полезно. В частности, оно неявно предполагает равномерное распределение по проблемным экземплярам. Однако в реальном мире фактическое распределение по проблемным экземплярам может быть неоднородным - часто оно очень далеко от однородного. Следовательно, число, которое вы получаете таким образом, часто не так полезно, как вы могли бы надеяться: оно часто дает ложное представление о том, насколько хорош алгоритм.

Чтобы узнать больше о том, как люди справляются с труднопреодолимостью (NP-твердость), взгляните на « Борьба с труднопреодолимостью: проблемы с NP-полнотой» .


3
+1. Но последняя точка не является твердой, можно утверждать, что вы можете определить коэффициент аппроксимации в качестве предела, когда n стремится к бесконечности числа ошибок, которые программа делает при вводе длины n по числу строк длины n. Это, конечно, оказывается бесполезным, так как часто простая программа, которая просто выводит «ДА» (или «НЕТ»), достигает хорошего отношения (иногда даже 1!).
Aelguindy

1
@det, это отдельный вопрос, который вы должны задать отдельно (после прочтения об этом в стандартных учебниках или онлайн-ресурсах). Мы предпочитаем, чтобы вы задавали только один вопрос на пост.
DW

1
@aelguindy, хорошая мысль. Я обновил свой ответ соответственно.
DW

2
@det Почему жадный? Что значит «почти» решить проблему решения?
Рафаэль

2
@ Mehrdad: Обычно вы оцениваете алгоритм аппроксимации по его наихудшей ошибке: верхняя граница того, насколько он неоптимален. Так, например, вы можете сказать, что данный алгоритм аппроксимации всегда находит результат, который составляет не менее пяти шестых оптимального результата. Нет реального способа перевести это на решение проблемы; если ваш алгоритм иногда испускает (скажем) 0,1, то либо он иногда отключается на 0,9 (в этом случае вы бы лучше, в худшем случае всегда испускали 0,5), либо «приблизительный» - это обман, а «0,1» «на самом деле просто означает« 0 ».
Руах

14

Причина, по которой вы не видите таких вещей, как отношения аппроксимации в задачах принятия решений, заключается в том, что они обычно не имеют смысла в контексте вопросов, которые обычно задают о проблемах принятия решений. В настройках оптимизации это имеет смысл, потому что полезно быть «близко». Во многих средах это не имеет смысла. Не имеет смысла видеть, как часто вы «близки» к проблеме дискретного логарифма. Нет смысла видеть, как часто вы «близки» к поиску изомера графа. И точно так же, в большинстве проблем с принятием решений не имеет смысла быть «близким» к правильному решению.

Теперь, в практических реализациях, во многих случаях полезно знать, какую часть проблем можно решить «быстро», а какую - нет. Тем не менее, в отличие от оптимизации, не существует единого подхода для количественной оценки этого. Вы можете сделать это статистически, как вы предлагаете, но только если вы знаете статистическое распределение ваших входных данных. Большую часть времени людям, которые заинтересованы в решении проблем, не очень повезло с такими дистрибутивами.

В качестве примера рассмотрим проблему остановки. Известно, что проблема остановки неразрешима. Это позор, потому что это действительно полезная проблема, которую можно решить, если вы создаете компилятор. На практике, однако, мы обнаруживаем, что большинство программ на самом деле очень легко анализировать с точки зрения остановки проблемы. Компиляторы используют это для генерации оптимального кода в этих условиях. Однако компилятор должен признать, что существует вероятность того, что определенный блок кода не будет разрешимым. Любая программа, которая полагается на то, что код «вероятно разрешима», может столкнуться с проблемами

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


Итак, насколько я понимаю, единственный способ решить проблему решения - это разработать оптимальный алгоритм, который может быть очень неэффективным? Потому что у меня есть проблема решения (NP-полная), и меня попросили придумать жадный (быстрый) алгоритм, чтобы найти решение. Как я могу решить это? Знаете ли вы о какой-либо бумаге, которая фокусируется на такого рода проблемы?
Рибз

1
@det Отодвинься и получи проблему заново. Если у вас есть NP-полная проблема, вы довольно застряли, но весьма вероятно, что вам на самом деле не нужно ее решать. Например, вам не всегда нужен идеальный ответ. Может быть, близко это достаточно хорошо. Или, может быть, вы можете решить эту проблему для подмножества дел, которые легки, и решаются на трудных. Например, алгоритмы упаковки часто являются NP-полными, но распространены алгоритмы, которые надежно достигают 5% от оптимального с использованием вероятностных подходов.
Cort Ammon - Восстановить Монику

2
Честно говоря, то, что нам предложили придумать жадный алгоритм для решения NP-полной программы, буквально то же самое, что поручить единолично охватить все сообщество информатики и математики. Если вы нашли алгоритм для NP-полной программе в P время, по очень мере , вы бы заработать Clay приз $ 1 млн для решения P = NP. На самом деле, последствия вашего открытия изменили бы вычислительные возможности, какими мы их знаем, и полностью взорвали бы всю индустрию безопасности / криптографии в одночасье. Лучше изменить формулировку задачи, чтобы она не была доказуемо NP-полной.
Корт Аммон - Восстановить Монику

Я использовал жадный точный алгоритм для NP-полной задачи. Мне нужно было только решить небольшой случай, и я мог получить 64-процессорный сервер на выходные.
Патриция Шанахан

8

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

С этими алгоритмами, только один из двух результатов определен с уверенностью, в то время как другой может быть неправильным. Возьмите тест Миллера-Рабина для простых чисел , например: если тест определяет, что число не простое, этот результат наверняка. Но в другом случае это только означает, что число, вероятно, простое. В зависимости от того, сколько вычислительного времени вы готовы потратить, вы можете повысить свою уверенность в результате, но это не будет 100%, как в случае не первоклассного случая.

Это особенно полезно при решении неразрешимых проблем: вы можете написать инструмент, который пытается решить проблему остановки для определенного фрагмента кода. Если он может найти доказательство того, что программа не будет зацикливаться бесконечно, вы можете заявить об этом со 100% уверенностью. Если вы не можете найти такое доказательство, это может быть просто потому, что поток управления программой слишком сложен для анализа вашего инструмента, но это не является доказательством того, что он будет работать бесконечно. Упрощая управляющие структуры, вы можете создать эквивалентную программу, достаточно простую для того, чтобы инструмент мог доказать, что он наверняка остановится.


Существует большая разница между вероятностным (ваш ответ) и приближенным (вопрос) алгоритмами. В частности, сочетание обоих - это особая порода.
Рафаэль

Кроме того, мы знаем, что вероятностных алгоритмов для проблемы остановки не существует, при условии разумной интерпретации термина в этом контексте.
Рафаэль

@ Рафаэль Я не хотел, чтобы мой ответ был конкретным для вероятностных алгоритмов. Конечно, для Миллера-Рабина это так, но, как вы упомянули сами, это больше не относится к примеру с проблемой остановки, и я думаю, что это также не будет верно в большинстве случаев, когда вы обнаруживаете такое поведение. Суть, которую я хотел донести, заключается в том, что вы получите уверенность только в одном результате, но не в другом.
ComicSansMS

Если вы не говорите больше, чем некоторые проблемы, которые можно вычислить только частично, я не думаю, что вы отвечаете на вопрос.
Рафаэль

@Raphael Мой ответ также не относится к полувычислимым задачам. На самом деле, я не думаю, что описанный мной подход применим даже к полувычислимым задачам. Теперь вы точно будете знать, попали ли вы в неопределенную ветку функции, так что вы можете с уверенностью утверждать, что результата нет. То, что я описал, сводится к следующему: ответ может быть, но алгоритм может показаться недостаточно сложным, чтобы наткнуться на него.
ComicSansMS
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.