Недавно я прошел через мучительный забавный опыт неформального объяснения концепции вычислительной сложности молодому талантливому программисту-самоучке, который никогда раньше не проходил формальный курс по алгоритмам или сложности. Неудивительно, что многие понятия поначалу казались странными, но они имели смысл на некоторых примерах (PTIME, труднопреодолимость, невычислимость) , в то время как другие кажутся более естественными (классификация проблем с помощью сокращений, времени и пространства как ресурсов, асимптотический анализ) . Все шло отлично, пока я случайно не признался, что САТможет быть эффективно решено * на практике ... И просто так я их потерял. Это не имеет значения , насколько убедительно я пытался спорить теории, ребенок был убежден , что все это было искусственное дерьмо математики , что он не должен заботиться. Что ж...
¯ \ _ (ツ) _ / ¯
Нет, у меня не было разбитого сердца, и мне не было дела до того, что он думал, это не главное в этом вопросе. Наш разговор заставил меня задуматься над другим вопросом,
Насколько я действительно знаю о задачах, которые теоретически неразрешимы (суперполиномиальная сложность времени), но практически решаемы (с помощью эвристики, приближений, SAT-решателей и т. Д.)?
Я понял, не так много. Я знаю, что есть несколько очень эффективных SAT-решателей, которые эффективно решают огромные случаи, что Simplex прекрасно работает на практике, и, возможно, еще несколько проблем или алгоритмов. Можете ли вы помочь мне нарисовать более полную картину? Какие известные проблемы или даже классы проблем находятся в этой категории?
TL; DR: Какие проблемы на практике интуитивно разрешимы? Есть ли (обновленный) ресурс, чтобы читать больше? У нас есть характеристика для них? И, наконец, как вопрос общего обсуждения, не так ли?
РЕДАКТИРОВАТЬ # 1: пытаясь ответить на мой последний вопрос о такой характеристике , я познакомился с сглаженным анализом алгоритмов, концепцией, введенной Даниэлем Спилманом и Шанг-Хуа Тенгом в [1], которая непрерывно интерполирует между наихудшим и среднестатистический анализ алгоритмов. Это не совсем та характеристика, которая обсуждалась выше, но она отражает ту же концепцию, и я нашел ее интересной.
[1] Спилман, Даниэль А. и Шан-Хуа Тенг. «Сглаженный анализ алгоритмов: почему симплексный алгоритм обычно занимает полиномиальное время». Журнал ACM (JACM) 51, нет. 3 (2004): 385-463.
источник
Ответы:
Сильно структурированные экземпляры SAT (даже по миллионам переменных) часто могут быть решены на практике. Однако случайные экземпляры SAT, близкие к порогу выполнимости даже с несколькими сотнями переменных, все еще открыты (то есть даже на практике, если вы генерируете такую вещь, вы можете никогда не узнать за время существования вселенной, является ли созданная вами вещь выполнимой или нет используя текущие SAT решатели). Возможно, вас заинтересует этот связанный вопрос и его ответы.
Клик-искатели также потрясающе хороши "на практике"
Что касается поиска кликов, (часть) объяснение дается анализом среднего случая рассматриваемых алгоритмов.
См. Https://www.sciencedirect.com/science/article/pii/S0166218X18300167?via%3Dihub.
Целочисленное программирование и смешанное целочисленное линейное программирование (с некоторыми рациональными и некоторыми целочисленными переменными) находятся в центре внимания целых отделов исследования операций и часто (но не всегда) могут быть решены на практике.
Из того, что я понимаю, многие -полные проблемы, возникающие при проверке, часто могут быть решены на практике, но «на практике» обычно подразумевает «в высоко структурированных случаях». (В отличии от этого , мы еще не знаем , кто победит на довольно небольшие экземпляры игры Го, который является еще P S P C E -полной проблемой.)P S P A C E P S P A C E
Как уже указывалось в комментариях DW, изоморфизм графов в значительной степени можно решить на практике. Очень сложно поставить в тупик современное программное обеспечение GI, такое как красавица, блаженство, дерзость и т. Д.
источник
Система типов Хиндли-Милнера используется в функциональных языках программирования (Haskell, SML, OCaml). Алгоритм вывода типов на практике практически линейный и работает на удивление хорошо, но известно, что он является DEXPTIME-полным!
Общий комментарий: неудивительно, что сложность наихудшего времени не обязательно является очень хорошим показателем практической эффективности алгоритма. Однако говорить о том, что несоответствие между теорией и практикой делает теорию сложности бесполезной, все равно, что говорить, что натуральные числа - это пустая трата, потому что мы используем только минимальное количество всех доступных чисел. Известный философ однажды сказал, что «опыт без теории слеп, а теория без опыта - просто интеллектуальная игра».
источник
Еще примеры, в основном из языков программирования:
Ссылки:
[1] Дэвид Ван Хорн и Гарри Дж. Марсон. 2008. Решение kCFA завершено для EXPTIME. В материалах 13-й Международной конференции ACM SIGPLAN по функциональному программированию (ICFP '08). ACM, Нью-Йорк, Нью-Йорк, США, 275-282.
[2] http://web.cs.ucla.edu/~palsberg/paper/dedicated-to-kozen12.pdf
[3] М. Дж. Фишер и М. О. Рабин. 1974. СУПЕР-ЭКСПОНЕНЦИАЛЬНАЯ СЛОЖНОСТЬ ПРЕСБУРГЕРСКОЙ АРИФМЕТИКИ. Технический отчет. Массачусетский технологический институт, Кембридж, Массачусетс, США.
[4] Уильям Пью. 1991. Тест Omega: быстрый и практичный алгоритм целочисленного программирования для анализа зависимостей. В материалах конференции ACM / IEEE 1991 года по суперкомпьютингу (Supercomputing '91). ACM, Нью-Йорк, Нью-Йорк, США, 4-13.
источник
Тренировка нейронных сетей с использованием методов градиентного спуска также оказалась очень сложной задачей. https://www.cs.utexas.edu/~klivans/crypto-hs.pdf, но, как правило, разрешима на практике.
источник