Какие практически неразрешимые проблемы в мире программирования? - PullRequest
6 голосов
/ 14 ноября 2009

Проблема коммивояжера называется практически "неразрешимой", когда число узлов увеличивается.

Какие еще проблемы программирования считаются неразрешимыми?

Ответы [ 16 ]

35 голосов
/ 14 ноября 2009

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

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

17 голосов
/ 04 декабря 2009

Internet Explorer 6

15 голосов
/ 14 ноября 2009

Проблема остановки . Доказано неразрешимым.

14 голосов
/ 29 ноября 2009

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

11 голосов
/ 02 декабря 2009

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

Следует сказать, что зачастую довольно просто найти решение проблемы NP, сложная задача - найти оптимальное решение.

Вот список других NP-полных задач:

  • Упаковка в бункер, как заполнить контейнер так, чтобы в него поместилось оптимальное количество вещей. Я знаю парня, который руководит компанией, которая помогает судоходным компаниям упаковывать свои суда наилучшим образом. Его программа не находит лучшего решения, но обычно может помочь упаковать корабли более умным способом, чем то, что можно сделать вручную.
  • SAT решение, показывающее, что пропозициональная формула выполнима. Это довольно теоретическая проблема, но она используется корпорацией Intel для автоматического подтверждения правильности схемотехники. SAT решатели становятся довольно хорошими в наши дни и могут довольно быстро решать довольно большие проблемы.
  • Планирование, учитывая количество заданий, которые необходимо выполнить, и количество ресурсов, необходимых для выполнения этих заданий, рассчитывают наиболее эффективный способ выполнения заданий. Авиалайнерам приходится много решать эту проблему, поскольку у них есть свои ресурсы, персонал и самолеты, которые они хотят использовать как можно более эффективно, при этом обслуживая все рейсы. Такие компании, как Jeppesen, имеют программы для оптимизации этого.
  • График раскраски. Возьмите неориентированный граф и попытайтесь раскрасить каждый узел так, чтобы никакие два смежных узла, соединенных ребром, не имели одинаковый цвет. Цель состоит в том, чтобы использовать как можно меньше цветов. Это используется компиляторами для назначения регистров локальным переменным. Чем лучше алгоритм раскраски графа, тем больше переменных помещается в регистры, а не в память.

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

10 голосов
/ 14 ноября 2009

Проблемы, которые неразрешимы, не могут быть решены ни одним алгоритмом.

http://en.wikipedia.org/wiki/Undecidable_problem

NP. Полные задачи могут быть решены за полиномиальное время недетерминированно. Так что они действительно разрешимы, особенно быстро на квантовом компьютере.

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

9 голосов
/ 03 декабря 2009

Попытка найти разработчика, который доволен написанным кодом!

6 голосов
/ 02 декабря 2009

Как уже многие люди ответили, проблема ур, которую невозможно решить, является проблемой остановки: напишите программу H, которая принимает программу P в качестве входных данных и отвечает, собирается ли программа ввода P Зацикливаться вечно или нет. Обратите внимание, что наша программа H может отвечать правильно для многих входных программ, задача состоит в том, чтобы написать программу, которая может ответить на это для всех программ.

Почему проблема остановки неразрешима? Доказательство довольно простое и довольно забавное: Предположим, что мы можем написать программу H, которая решает проблему остановки. (Цель состоит в том, чтобы показать, что, предполагая это, мы получим результаты, которые являются просто бессмысленными, следовательно, наше предположение неверно.) Теперь создайте программу EVIL, которая использует H в качестве подпрограммы. Мы можем написать EVIL так:

EVIL p = if H p then loop
                else false

Краткое пояснение приведено по порядку. EVIL берет программу, и если эта программа останавливается, то EVIL зацикливается. Если входная программа зацикливается вечно, EVIL возвращает false.

Следующий шаг действительно крут: примените EVIL к себе! Вопрос в том, каким будет ответ EVIL EVIL? Это явно зависит от того, будет ли EVIL зацикливаться вечно или нет. Давайте рассмотрим две альтернативы:

  • Предположим, что EVIL циклы навсегда. Но затем, когда мы передаем в качестве входной программы саму себя, она должна вернуть false, поскольку H обнаружил, что она будет зацикливаться вечно. Но возвращение false противоречит тому, что мы впервые сказали, что EVIL зацикливается навсегда, так что это явно не может быть.

  • Хорошо, так что EVIL не зацикливается. Что ж, когда мы передадим EVIL себе, он просто зациклится, потому что H вернул true. Таким образом, у нас есть противоречие и здесь.

Облом! Обе альтернативы (EVIL циклы или нет) приводят к противоречиям. Таким образом, наши предположения должны быть ошибочными. Не существует такой программы, как H, которая могла бы решить, останавливать функцию или нет.


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

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

5 голосов
/ 14 ноября 2009

Получение всех трех из: объем (функции), сроки (график), бюджет (ресурсы - разработчики); вместо "выбрать два".

5 голосов
/ 14 ноября 2009

Мне кажется, проблема с рюкзаком особенно интересна, поскольку она применима ко многим различным доменам.

...