SAT - это проблема определения того, можно ли сделать булево выражение истинным. Например, (A) можно сделать истинным, установив A = TRUE, но (A &&! A) никогда не может быть истинным. Эта проблема, как известно, является NP-полной. См. Булево соответствие .
Ваша задача - написать программу для SAT, которая выполняется за полиномиальное время, но может решить не все случаи.
Для некоторых примеров, причина не очень Полином может быть:
- Существует крайний случай, который не очевиден, но имеет плохое время выполнения
- Алгоритм фактически не может решить проблему в каком-то неожиданном случае
- Некоторые функции используемого вами языка программирования на самом деле имеют более длительное время выполнения, чем можно было бы ожидать
- Ваш код на самом деле делает что-то совершенно отличное от того, что он делает
Вы можете использовать любой язык программирования (или комбинацию языков), который пожелаете. Вам не нужно предоставлять формальное доказательство сложности вашего алгоритма, но вы должны хотя бы предоставить объяснение.
Основным критерием оценки должно быть то, насколько убедительным является код.
Это конкурс популярности, поэтому победитель получает самый высокий рейтинг за неделю.
источник
Ответы:
C #
«Появляется» не нужно. Я могу написать программу, которая действительно выполняется за полиномиальное время для решения проблем SAT. Это довольно просто на самом деле.
Потрясающие. Пожалуйста, пришлите мне миллион долларов. Серьезно, у меня здесь есть программа, которая решает SAT с полиномиальным временем выполнения.
Позвольте мне начать с заявления о том, что я собираюсь решить вариацию проблемы SAT. Я собираюсь продемонстрировать, как написать программу, которая демонстрирует уникальное решение любой проблемы 3-SAT . Оценка каждой логической переменной должна быть уникальной, чтобы мой решатель работал.
Мы начнем с объявления нескольких простых вспомогательных методов и типов:
Теперь давайте выберем проблему 3-SAT для решения. Скажем
Давайте заключим это в скобки немного больше.
Мы кодируем это так:
И, конечно же, когда мы запускаем программу, мы получаем решение 3-SAT за полиномиальное время. На самом деле время выполнения является линейным по размеру проблемы !
источник
Многоязычность (1 байт)
Следующая программа, действительная на многих языках, в основном функциональная и эзотерическая, даст правильный ответ для большого числа проблем SAT и имеет постоянную сложность (!!!):
Удивительно, но следующая программа даст правильный ответ на все оставшиеся проблемы, и имеет такую же сложность. Так что вам просто нужно выбрать правильную программу, и вы получите правильный ответ во всех случаях!
источник
JavaScript
Используя повторный недетерминизм, SAT может быть решена за полиномиальное время!
Пример использования:
Кстати, я горжусь тем, что у меня была возможность использовать две наиболее недоиспользуемые функции JavaScript прямо рядом друг с другом:
eval
иwith
.источник
1000
в for должен каким-то образом масштабироваться с учетом размера входных данных (некоторое полиномиальное не-O (1) масштабирование).Mathematica + Quantum Computing
Вы можете не знать, что Mathematica поставляется с квантовым компьютером на борту
Квантовая адиабатическая коммутация кодирует задачу, которая должна быть решена в гамильтониане (оператор энергии) таким образом, что ее состояние минимальной энергии («основное состояние») представляет решение. Поэтому адиабатическая эволюция квантовой системы до основного состояния гамильтониана и последующее измерение дает решение задачи.
Определим субгамильтониан, соответствующий
||
частям выражения, с соответствующей комбинацией операторов Паули для переменных и его отрицаниемГде для выражения, как это
аргумент должен выглядеть так
Вот код для построения такого аргумента из выражения bool:
Теперь построим полный гамильтониан, суммируя субгамильтонианы (суммирование соответствует
&&
частям выражения)И искать самое низкое энергетическое состояние
Если мы получили собственное значение ноль, то собственный вектор является решением
источник
Здесь три подхода, каждый из которых включает в себя сокращение SAT до его двумерного геометрического языка: неграммы логические головоломки. Ячейки в логической головоломке соответствуют переменным SAT, ограничениям на предложения.
Для полного объяснения (и, пожалуйста, просмотрите мой код на предмет ошибок!), Я уже опубликовал некоторое представление о шаблонах в пространстве решений неграммы. См. Https://codereview.stackexchange.com/questions/43770/nonogram-puzzle-solution-space, Перечисление> 4 миллиардов решений головоломок и их кодирование, чтобы они поместились в таблицу истинности, показывает фрактальные паттерны - самоподобие и, особенно, родство. Эта аффинная избыточность демонстрирует структуру проблемы, которую можно использовать для уменьшения вычислительных ресурсов, необходимых для генерации решений. Это также показывает необходимость хаотической обратной связи в любом успешном алгоритме. Существует объяснительная сила в поведении фазового перехода, где «легкие» экземпляры - это те, которые лежат вдоль грубой структуры, в то время как «жесткие» экземпляры требуют дальнейшей итерации в мелкие детали, совершенно скрытые от обычной эвристики. Если вы хотите увеличить угол этого бесконечного изображения (все <= 4x4 закодированные экземпляры головоломки), см. Http://re-curse.github.io/visualizing-intractability/nonograms_zoom/nonograms.html.
Метод 1. Экстраполируйте тень пространства решения неограммы, используя хаотические карты и машинное обучение (продумайте функции подбора, аналогичные тем, которые генерируют множество Мандельброта).
Вот наглядное доказательство индукции. Если вы можете отсканировать эти четыре изображения слева направо и подумать, что у вас есть хорошая идея сгенерировать недостающие 5-е ... 6-е ... и т. Д. Изображения, то я только что запрограммировал вас как своего оракула NP для решения проблемы неграмового решения. существование. Пожалуйста, сделайте шаг вперед, чтобы получить свой приз как самый мощный суперкомпьютер в мире. Время от времени я буду кормить вас электричеством, пока мир благодарит вас за ваш вычислительный вклад.
Способ 2. Используйте преобразования Фурье на булевой версии изображения входов. БПФ предоставляют глобальную информацию о частоте и положении в экземпляре. В то время как часть величины должна быть одинаковой между входной парой, их фазовая информация совершенно другая - содержащая направленную информацию о проекции решения вдоль конкретной оси. Если вы достаточно умны, вы можете восстановить фазовое изображение решения с помощью некоторой специальной суперпозиции входных фазовых изображений. Затем обратное преобразование фазы и общей величины обратно во временную область решения.
Что может объяснить этот метод? Существует много перестановок булевых изображений с гибким заполнением между непрерывными сериями. Это позволяет сопоставлять решение input ->, заботясь о множественности, при этом сохраняя свойство FFT двунаправленных, уникальных отображений между временной областью <-> (частота, фаза). Это также означает, что нет такого понятия, как «нет решения». То, что он сказал бы, - то, что в непрерывном случае есть решения в градациях серого, которые Вы не рассматриваете, смотря на двухуровневое изображение традиционного решения головоломки неграммы.
Почему бы тебе не сделать это? Это ужасный способ на самом деле вычислить, так как БПФ в современном мире с плавающей запятой было бы очень неточно с большими экземплярами. Точность является огромной проблемой, и реконструкция изображений по квантованным величинам и фазовым изображениям обычно создает очень приблизительные решения, хотя, возможно, не визуально для порогов человеческого глаза. Также очень сложно придумать этот суперпозиционный бизнес, так как тип функции, фактически выполняющей его, в настоящее время неизвестен. Будет ли это простая схема усреднения? Наверное, нет, и нет особого метода поиска, кроме интуиции.
Метод 3. Найти правило клеточных автоматов (из возможных ~ 4 миллиардов таблиц правил для правил двух состояний фон Неймана), которое решает симметричную версию головоломки неграммы. Вы используете прямое встраивание проблемы в ячейки, показанные здесь.
Это, вероятно, самый элегантный метод с точки зрения простоты и хороших эффектов для будущего вычислительной техники. Существование этого правила не доказано, но я догадываюсь, что оно существует. Вот почему:
Nonograms требуют много хаотической обратной связи в алгоритме, чтобы быть точно решенным. Это установлено кодом перебора, связанным с Обзором кода. CA - почти самый способный язык для программирования хаотической обратной связи.
Это выглядит правильно, визуально. Правило будет развиваться путем встраивания, распространять информацию по горизонтали и вертикали, вмешиваться, а затем стабилизироваться до решения, которое сохранит количество заданных ячеек. Этот путь распространения идет по пути (назад), о котором вы обычно думаете, проецируя тень физического объекта в исходную конфигурацию. Nonograms происходит из особого случая дискретной томографии, так что представьте себе, что вы сидите одновременно в двух сканерах компьютерной томографии в углах котла ... именно так рентгеновские лучи будут распространяться для создания медицинских изображений. Конечно, существуют пограничные проблемы - границы вселенной CA не могут продолжать распространять информацию за пределами границ, если вы не разрешите использование тороидальной вселенной. Это также создает загадку как периодическую краевую задачу.
Это объясняет множественные решения как переходные состояния в непрерывно колеблющемся эффекте между заменой выходов в качестве входов и наоборот. Это объясняет случаи, которые не имеют решения, как оригинальные конфигурации, которые не сохраняют количество установленных ячеек. В зависимости от фактического результата нахождения такого правила, он может даже приблизительно неразрешимые случаи с близким решением , где клеточные состояния являются законсервированными.
источник
C ++
Вот решение, которое гарантированно будет работать за полиномиальное время: оно работает
O(n^k)
там, гдеn
находится число логических значений иk
является константой по вашему выбору.источник
bitfield
, может быть, я бы предпочел этоstd::vector
.рубин / гнуплот 3d поверхность
(о, жесткая конкуренция!) ... в любом случае ... стоит ли картина тысячи слов? это 3 отдельных поверхностных графика, выполненных в gnuplot точки перехода SAT. оси (x, y) - это разделы и переменные, а высота z - это общее количество рекурсивных вызовов в решателе. код написан на ruby. это образцы 10x10 пунктов в 100 образцах каждый. он демонстрирует / использует основные принципы статистики и представляет собой симуляцию Монте-Карло .
в основном это алгоритм Дэвиса Патнама , работающий на случайных экземплярах, сгенерированных в формате DIMACS. это тот тип упражнений, который в идеале должен выполняться на уроках CS по всему миру, чтобы ученики могли изучать основы, но почти совсем не учат ... может быть, почему так много поддельных P? = NP доказательств ? нет даже хорошей статьи в Википедии, описывающей феномен точки перехода (кто-нибудь?), которая является очень важной темой в статистической физике и является ключевой также в CS. [a] [b] Есть много статей в CS о точке перехода однако очень немногие, кажется, показывают поверхностные участки! (вместо этого, как правило, показаны 2d срезы.)
экспоненциальное увеличение времени выполнения ясно видно на 1- м графике. седло, проходящее через середину 1- го сюжета, является точкой перехода. 2- й и 3- й графики показывают% выполнимого перехода.
[a] фазовый переход поведения в CS ppt Тоби Уолша
[b] эмпирическая вероятность выполнимости k-SAT tcs.se
[c] большие моменты в эмпирической / экспериментальной математике / (T) CS / SAT , блог TMachine
источник