Как работают алгоритмы
Chapter 10 Intractable Problems and Approximation Algorithms

Глава 10: Неразрешимые проблемы и алгоритмы приближения

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

Классы P и NP

Чтобы понять NP-полноту, нам сначала нужно определить два важных класса проблем: P и NP.

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

Класс NP (недетерминированное полиномиальное время) состоит из всех задач на принятие решений, для которых решение может быть проверено за полиномиальное время. Например, проблема гамильтонова цикла находится в классе NP, потому что, имея граф и предлагаемый гамильтонов цикл, мы можем легко проверить за полиномиальное время, является ли предложенный цикл действительно гамильтоновым.

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

NP-полнота

Задача на принятие решений X является NP-полной, если:

1Вот перевод на русский язык:

. X находится в NP, и 2. Любая проблема в NP может быть сведена к X за полиномиальное время.

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

Концепция NP-полноты была введена Стивеном Куком и Леонидом Левиным независимо в 1971 году. Первой проблемой, которая была показана NP-полной, была Проблема Булевой Выполнимости (SAT). С тех пор многие другие проблемы были показаны NP-полными путем сведения SAT или других известных NP-полных проблем к ним.

Некоторые широко известные NP-полные проблемы включают:

  • Задача Коммивояжера (TSP): Дан набор городов и расстояния между ними, найти кратчайший маршрут, который посещает каждый город ровно один раз.
  • Задача Рюкзака: Дан набор предметов с весами и ценностями, и рюкзак с ограничением по весу, найти подмножество предметов с максимальной общей ценностью, которое помещается в рюкзак.
  • Задача Раскраски Графа: Дан граф, найти минимальное число цветов, необходимых для раскраски вершин так, чтобы никакие две смежные вершины не имели одинакового цвета.

Значимость NP-полноты заключается в том, что если любая NP-полная проблема может быть решена за полиномиальное время, то все проблемы в NP могут быть решены за полиномиальное время (т.е. P = NP). Однако, несмотря на десятилетия усилий, не найден полиномиальный алгоритм для какой-либо NP-полной проблемы. Это предполагает (но не доказывает), что NP-полные проблемы являются inherently сложными и маловероятно, что для них существуют эффективные алгоритмы.

Приближенные Алгоритмы

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

Например, рассмотрим задачу Вершинного Покрытия: дан граф, найти минимальноеВот перевод на русский язык с сохранением оригинального кода:

Минимальное множество вершин, такое что каждое ребро инцидентно, по крайней мере, одной вершине в этом множестве. Эта задача является NP-полной. Тем не менее, существует простой алгоритм аппроксимации, который находит вершинное покрытие, размер которого не более чем в два раза превышает размер оптимального вершинного покрытия:

  1. Инициализируйте пустое множество C.
  2. Пока есть непокрытые ребра в графе:
    • Выберите произвольное непокрытое ребро (u, v).
    • Добавьте u и v в C.
    • Удалите все ребра, инцидентные u или v, из графа.
  3. Верните C.

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

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

Алгоритмы локального поиска

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

Например, рассмотрим задачу коммивояжера (TSP). Простой алгоритм локального поиска для TSP работает следующим образом:

  1. Начните с произвольного маршрута.
  2. Пока возможны улучшения:
    • Рассмотрите все возможные перестановки двух городов в текущем маршруте.
    • Если любая перестановка улучшает длину маршрута, выполните ее.
  3. Верните текущий маршрут.

Этот алгоритм начинает со случайного маршрута и повторно улучшает его, меняя пары городов, пока дальнейшие улучшения невозможны. Полученный маршрут является локальным оптимумом, что означает, что он не может быть улучшен путем перестановки пар городов.Локальные алгоритмы поиска часто могут быстро найти хорошие решения, но они не гарантируют нахождения глобального оптимума. Они могут застрять в локальных оптимумах, которые далеки от глобального оптимума. Чтобы смягчить это, можно использовать различные техники, такие как:

  • Запуск локального поиска несколько раз с разными начальными решениями.
  • Разрешение локальному поиску делать ходы, временно ухудшающие решение, чтобы помочь выйти из локальных оптимумов.
  • Использование более сложных структур окрестностей, которые рассматривают более крупные изменения текущего решения.

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

Заключение

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

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

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

По мере того, как размер и сложность решаемых нами задач продолжают расти, важность понимания и работы с NP-полнотой будет только увеличиваться. Овладев техниками, рассмотренными в этой главе, вы будете хорошо подготовлены к решению некоторых из самых сложных и важных задач в компьютерных науках.Here is the Russian translation of the provided Markdown file, with the code comments translated:

Наука и за её пределами

Введение

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

Основные области науки

Наука состоит из множества дисциплин, каждая из которых исследует различные аспекты нашего мира:

  1. Физика: Изучает фундаментальные законы природы, такие как движение, энергия и материя.
  2. Химия: Исследует свойства и взаимодействия различных веществ на атомном и молекулярном уровне.
  3. Биология: Изучает живые организмы, их структуру, функции, рост, происхождение и эволюцию.
  4. Астрономия: Исследует космические объекты, такие как звезды, планеты, галактики и Вселенную в целом.
  5. Математика: Предоставляет фундаментальные инструменты для описания, анализа и понимания закономерностей в природе и обществе.

Применение науки в повседневной жизни

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

# Функция, которая вычисляет площадь круга
def calculate_circle_area(radius):
    """
    Вычисляет площадь круга по заданному радиусу.
    
    Аргументы:
    radius -- радиус круга
    
    Возвращает:
    Площадь круга
    """
    return 3.14 * radius ** 2
  1. Медицина: Научные исследования привели к разработке новых лекарств, методов диагностики и лечения.
  2. Технологии: Научные открытия лежат в основе развития компьютеров, смартфонов, интернета и многих других технологий.
  3. Сельское хозяйство: Применение научных методов в сельском хозяйстве позволило повысить урожайность и качество продуктов.
  4. Энергетика: Научные исследования в области возобновляемых источников энергии, таких как солнечная и ветровая энергия, помогают решать проблемы энергетической безопасности и охраны окружающей среды.

Заключение

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