Главная » 2 Распространение » Класс NP полных задач. Примеры

Класс NP полных задач. Примеры

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

Формальное определение

Гипотеза P ≠ NP

Вопрос о совпадении классов P и NP уже более 30 лет является открытой проблемой . Научное сообщество склоняется к отрицательному ответу на этот вопрос - в этом случае решать NP-полные задачи за полиномиальное время не удастся.

Примеры NP-полных задач

См. также

  • Список NP-полных задач (англ.) русск.

Напишите отзыв о статье "NP-полная задача"

Примечания

Литература

  • Томас Х. Кормен и др. Глава 34. NP-полнота // Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. - 2-е изд. - М .: «Вильямс» , 2006. - С. 1296. - ISBN 0-07-013151-1 .

Ссылки

  • (англ.)
  • (англ.)

Отрывок, характеризующий NP-полная задача

Курьер, подскакавший к замку на потной тройке, впереди государя, прокричал: «Едет!» Коновницын бросился в сени доложить Кутузову, дожидавшемуся в маленькой швейцарской комнатке.
Через минуту толстая большая фигура старика, в полной парадной форме, со всеми регалиями, покрывавшими грудь, и подтянутым шарфом брюхом, перекачиваясь, вышла на крыльцо. Кутузов надел шляпу по фронту, взял в руки перчатки и бочком, с трудом переступая вниз ступеней, сошел с них и взял в руку приготовленный для подачи государю рапорт.
Беготня, шепот, еще отчаянно пролетевшая тройка, и все глаза устремились на подскакивающие сани, в которых уже видны были фигуры государя и Волконского.
Все это по пятидесятилетней привычке физически тревожно подействовало на старого генерала; он озабоченно торопливо ощупал себя, поправил шляпу и враз, в ту минуту как государь, выйдя из саней, поднял к нему глаза, подбодрившись и вытянувшись, подал рапорт и стал говорить своим мерным, заискивающим голосом.
Государь быстрым взглядом окинул Кутузова с головы до ног, на мгновенье нахмурился, но тотчас же, преодолев себя, подошел и, расставив руки, обнял старого генерала. Опять по старому, привычному впечатлению и по отношению к задушевной мысли его, объятие это, как и обыкновенно, подействовало на Кутузова: он всхлипнул.
Государь поздоровался с офицерами, с Семеновским караулом и, пожав еще раз за руку старика, пошел с ним в замок.
Оставшись наедине с фельдмаршалом, государь высказал ему свое неудовольствие за медленность преследования, за ошибки в Красном и на Березине и сообщил свои соображения о будущем походе за границу. Кутузов не делал ни возражений, ни замечаний. То самое покорное и бессмысленное выражение, с которым он, семь лет тому назад, выслушивал приказания государя на Аустерлицком поле, установилось теперь на его лице.
Когда Кутузов вышел из кабинета и своей тяжелой, ныряющей походкой, опустив голову, пошел по зале, чей то голос остановил его.
– Ваша светлость, – сказал кто то.
Кутузов поднял голову и долго смотрел в глаза графу Толстому, который, с какой то маленькою вещицей на серебряном блюде, стоял перед ним. Кутузов, казалось, не понимал, чего от него хотели.
Вдруг он как будто вспомнил: чуть заметная улыбка мелькнула на его пухлом лице, и он, низко, почтительно наклонившись, взял предмет, лежавший на блюде. Это был Георгий 1 й степени.

На другой день были у фельдмаршала обед и бал, которые государь удостоил своим присутствием. Кутузову пожалован Георгий 1 й степени; государь оказывал ему высочайшие почести; но неудовольствие государя против фельдмаршала было известно каждому. Соблюдалось приличие, и государь показывал первый пример этого; но все знали, что старик виноват и никуда не годится. Когда на бале Кутузов, по старой екатерининской привычке, при входе государя в бальную залу велел к ногам его повергнуть взятые знамена, государь неприятно поморщился и проговорил слова, в которых некоторые слышали: «старый комедиант».
Неудовольствие государя против Кутузова усилилось в Вильне в особенности потому, что Кутузов, очевидно, не хотел или не мог понимать значение предстоящей кампании.
Когда на другой день утром государь сказал собравшимся у него офицерам: «Вы спасли не одну Россию; вы спасли Европу», – все уже тогда поняли, что война не кончена.
Один Кутузов не хотел понимать этого и открыто говорил свое мнение о том, что новая война не может улучшить положение и увеличить славу России, а только может ухудшить ее положение и уменьшить ту высшую степень славы, на которой, по его мнению, теперь стояла Россия. Он старался доказать государю невозможность набрания новых войск; говорил о тяжелом положении населений, о возможности неудач и т. п.
При таком настроении фельдмаршал, естественно, представлялся только помехой и тормозом предстоящей войны.

– множество задач

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

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

Если P не совпадает с NP , то различие между P и NP-P очень существенно. Все задачи из P могут быть решены (детерминированными) полиномиальными алгоритмами, а все задачи из NP-P труднорешаемы, и математическим уточнением понятия переборная задача распознавания служит задача из NP-P .

В исследованиях проблемы P ¹NP важное положение занимает понятие полиномиальная сводимость , используя ранее введенное понятие (и обозначение) сводимости - задача A полиномиально сводима к задаче B , если A μp(n)B для некоторого полинома p(n). Задача A называется C025A>_____NP-полной , если A Î NP и для любой другой задачи B Î NP имеет место полиномиальная сводимость B к A. Честь быть «первой» NP-полной задачей выпала на долю задачи распознавания выполнимости формул булевой логики. Кук С.А. показал как формулами булевой логики можно описать работу любой программы недетерминированного вычислителя и на этой основе доказал полиномиальную сводимость любой NP-задачи к задаче о выполнимости. Методом (полиномиального) сведения на сегодняшний день доказана NP-полнота обширнейшего семейства задач в различных областях: в булевой логике, в теории графов, в арифметике, при разработке сетей, в теории множеств и разбиений, при хранении поиске информации, при планировании вычислительных процессов, в математическом программировании, в алгебре и теории чисел, при создании игр и головоломок, в теории автоматов и языков, при оптимизации программ, в биологии, в химии, физике и т.п.

Оригинальные идеи Кука оказались удивительно плодотворными. Они позволили свести много разнообразных вопросов о сложности в единый вопрос: «Верно ли, что NP- полные задачи труднорешаемы?»

15.Абстрактные типы данных: последовательность, множество, отображение

Абстрактным принято называть тип данных, в явном виде не имеющийся в языке программирования, в этом смысле это понятие относительное - тип данных, отсутствующий в одном языке программирования, может присутствовать в другом. Абстрактный тип данных (АТД) определяется независимо от способа его реализации:

§ множеством возможных значений этого типа,

§ и набором операций со значениями этого типа.

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

§ способ представления значений этого типа,

§ и реализацию операций со значениями этого типа.

АТД не является предопределенным в языке программирования, и даже более того – операции конструирования таких типов, предопределенные в языке, перекладывают на разработчика программиста вопрос о способе представления значений такого типа и реализации операций со значениями этого типа. А потому, для таких типов данных вопрос о выборе определений и способов реализации операций вида конструктор (значений и хранилищ данных) такого типа, селектор и модификатор компонентов (значений и хранилищ данных) такого типа возлагается на разработчика-программиста.

В концепции АТД особый статус имеют понятия интерфейс , открытый пользователю, и реализация , скрытая от него. Особая роль этих понятий в концепции АТД связана с основополагающим положениемо независимости понятия АТД от способа его реализации.

В современных «практических языках программирования» для конструирования АТД обычно используется предопределенная операция конструирования типов class , которая дает разработчику программисту не только средства группировки данных и операций (с этими данными) в единое целое, но и средства инкапсуляции, наследования и полиморфизма для управления способами конструирования и доступа к таким данным.

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

В исследованиях по абстрактным типам данных уже на раннем этапе была осознана важная роль понятия «параметризация типа ». Действительно, например АТД «Стек» не зависит от типа элементов стека, но реализовать этот АТД указанием на «элементы какого-то одинакового типа» невозможно. В язык программирования Ada соответствующие средства конструирования параметризованных типов данных были включены изначально, а в современных «практических языках программирования» какие средства появились только со времен появления разработки по STL-библиотеке . На сегодня понятие «обобщенное программирование» занимает значимое положение в практическом программировании благодаря включению в «практические языки программирования» средств конструирования параметризованных типов данных (шаблоны, template, generic) . 37

Всё вышесказанное означает, что с методологической и теоретической точки зрения необходимо более детальное точное определение понятия «абстрактный тип данных». В теории понятие «абстрактный _____・8тип данных» обычно определяется как многосортная (многоосновная) алгебраическая система , в которой дополнительно к множеству возможных значений (носителю) и набору операций над такими значениями выделены понятия:

§ Сорт и сигнатура – эти понятия позволяют расклассифицировать и элементы носителя и операции с ними по их типам (для операций - по типам их аргументов и возвращаемого значения).

§ Предикаты – отношения на элементах носителя. Это позволяет определять область возможных значений наложением ограничений (требований) на допустимые значения, а также в естественной трактовке работать с произвольными логическими выражениями, не принуждая интерпретировать их как функции принадлежности для множеств или как многозначные операции. На такой основе можно рассматривать абстрактные типы данных с единой целостной логико-алгебраической точки зрения, включая вопросы о конструкторах (типов и значений), селекторах и модификаторах свойств для объектов такого типа .

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

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

§ Структура данных - скорее некоторая схема организации данных и управления ими, которая предполагает соответствующие конкретизации при ее использовании в конкретных ситуациях при решении конкретных задач. К абстрактным типам данных прежде всего естественно относятся математические базовые алгебраические системы – последовательности, множества, отношения и отображения (функциональные отношения, функции) . Но в программировании на переднем плане не исследование общих свойств этих математических понятий, а возможности их использования в разработке моделей решения задач предметной области, алгоритмов решения этих задач и эффективной реализации разработанных алгоритмов. А потому в программировании в виде АТД обычно оформляются с одной стороны ограниченные варианты этих базовых алгебраических систем, а с другой стороны – расширенные варианты, использующие специализированные наборы операций, представляющие прагматический интерес с точки зрения области применения. 38

2.1. Последовательность (Sequence).

Множество возможных значений – конечные последовательности элементов

одинакового типа.

Набор операций:

§ Вставить элемент в последовательность.

§ Удалить элемент из последовательности.

§ Посмотреть – функция, возвращающая значение элемента последовательности. Разновидности этого вида АТД различаются способом доступа к элементам последовательности и ограничениями на место вставки и удаления элементов. Для АТД этого вида стек (stack) , очередь (queue) и дек (deque от Double Ended Queue - двусторонняя очередь) характерно разрушающее чтение , т.к. доступ к элементам (для всех трех операций) ограничен одним из концов последовательности и операцию «посмотреть другой элемент» можно выполнить, только удалив мешающие этому элементы. Для АТД файл (file) и линейный список (linear list) ограничения на доступ обеспечивают неразрушающее чтение , поэтому особое значение имеет (производная) операция просмотра последовательности . Ограничения на доступ к элементам последовательности естественно отражаются на семантике основных операций. Последовательный доступ основан на понятии текущая позиция и допускает перемещение (навигацию) к одному (или к обоим) из концов последовательности и к соседней позиции (слева, справа или к обеим) относительно текущей. Место применения основных операций в этом случае обычно привязывается к текущей позиции. Прямой (позиционный, произвольный) доступ основанна глобальном Понятии позиция элемента в последовательности и обеспечивает непосредственный доступ к элементу, если известна его позиция. Например, в АТД динамический вектор (dynamic array, vector) , позиция – это индекс элемента. Но в других реализациях других видов последовательностей идентификатор позиции может быть реализован иначе.

Понятия «номер» и «позиция» элемента – близкие, но могут не совпадать:

§ Номер - это собственно порядковый номер элемента в последовательности. Но

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

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

Для АТД «Последовательность» представляют интерес дополнительные операции вида:

сцепить две последовательности, расцепить на две последовательности. Например, в АТД строка (string) такого вида операции фактически являются основными. Для различных видов АТД «Последовательность» достижима различающаяся эффективность реализации различных операций. Например, если реализация предлагает эффективный прямой доступ к элементам последовательности, то скорее всего – время 39 выполнения операции вставки в середине последовательности оставляет желать лучшего.

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

2.2. Множество (Set).

¨ Множество возможных значений – конечные множества элементов одинакового типа.

¨ Набор операций:

§ Вставить элемент во множество.

§ Удалить элемент из множества.

§ Принадлежать – функция, возвращающая значение true, если элемент

принадлежит множеству.

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

2.3. Словарь (Dictionary, Map), другое название – ассоциативный массив

.

¨ Множество возможных значений – конечные множества элементов одинакового типа, вида , где Key – уникальный ключ элемента, Value - собственно значение.

¨ Набор операций:

§ Вставить элемент (с ключом) во множество.

§ Удалить элемент (заданный ключом) из множества.

§ Найти элемент – функция, возвращающая по ключу значение элемента или «пустое» значение, если элемента с таким ключом нет во множестве. АТД «Словарь» - это специализированный вариант понятия (хранимое) отображение (ключей в значения), широко используемый в практическом программировании. Но для некоторых предметных областей возможно более удобным окажется оформление АТД «Отображение» (Mapping) , более близкое классическому математическому определению


Похожая информация.


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

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

Задачи тысячелетия

Чтобы грамотно подступиться к задаче равенства классов P и NP, сперва необходимо сделать небольшое отступление касательно института Клэя и списка из 7 задач тысячелетия.

Это частная некоммерческая организация, которая занимается спонсированием многообещающих математиков и в целом распространением математических знаний. Этот институт известен благодаря публикации списка из 7 задач тысячелетия , каждая из которых представляет собой классическую математическую задачу, которая не решена на протяжении очень долгого времени. Помимо этого, за верное решение любой из 7 проблем объявлено вознаграждение в виде 1 000 000 долларов США. На сегодняшний момент из всего списка решена лишь 1 задача - гипотеза Пуанкаре , решение которой принадлежит российскому математику Григорию Перельману.

Как нетрудно догадаться, равенство классов P и NP является одной из 7 задач в данном списке, что подчеркивает её колоссальную сложность и фундаментальность.

Начнём с алгоритмов

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

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

Другими словами, чем больше объём входных данных, тем больше времени потребуется алгоритму, чтобы завершить свою работу. Именно поэтому в рамках теории алгоритмов мы анализируем время работы алгоритма и количество потребляемой им памяти в зависимости от объёма входных данных. Эту зависимость мы выражаем в виде математической функции. Разумеется, данные зависимости описываются двумя разными функциями: одна для времени работы, другая для количества потребляемой памяти.

Сейчас мне придётся прибегнуть к некоторым упрощениям, чтобы объяснить различные зависимости. Например, время работы программы описывается линейной функцией. Это будет означать, что если вы увеличите объём входных данных в 3 раза, время работы программы также возрастет в 3 раза. Если же, к примеру, зависимость времени работы от размера входных данных описывается квадратичной функцией, то при увеличении объёма входных данных в 3 раза время работы алгоритма возрастает в 9 раз.

Если зависимость времени работы программы от объёма входных данных описывается линейной, квадратичной, кубической и другими функциями, мы говорим о полиномиальном времени работы. Причина довольно-таки простая: линейная, квадратичная, кубическая и так далее функции являются полиномами, то есть многочленами от некоторого числа переменных. Понятие полиномиального времени работы довольно скоро нам пригодится.

Стоит отметить, что время работы программы может иметь не только полиномиальную зависимость от объема входных данных. Характер роста может быть куда более взрывным. Классический пример: экспоненциальная зависимость, при которой увеличение входных данных всего на 1 единицу измерения повлечёт увеличение времени работы алгоритма в некоторое константное количество раз.

Опять же упрощая, можно сказать, что полиномиальные алгоритмы - это быстрые алгоритмы, а те же экспоненциальные - нет.

Переходим к классам задач P, NP и NP-complete

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

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

Ещё более сложные задачи - это задачи из класса NP-complete. Если вам удаётся свести решение задачи А к решению задачи Б, то последняя задача как минимум настолько же сложная, как и первая. Суть NP-complete класса в том, что к любой задаче из данного класса можно свести абсолютно все задачи из класса NP, то есть каждая задача из данного класса настолько же сложна, как и любая задача из NP. Примеры задач из класса NP-complete: задача о ранце или та же задача коммивояжёра.

Равенство классов P и NP

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

Зачем мы вводили класс NP-complete?

Это связано с одним очень интересным моментом касательно доказательства «P против NP». В классе P содержится огромное количество задач, равно как и в классе NP. Помимо этого, умнейшие учёные компьютерных наук на протяжении десятилетий пытались построить быстрый (полиномиальный) алгоритм хотя бы для одной из многих сотен задач из класса NP. Тем не менее, учитывая, что любая NP-complete задача настолько же сложная, как и все задачи из NP, если хотя бы для одной NP-complete задачи нам удастся доказать, что её можно быстро решить, мы автоматически докажем то же самое для всех задач из класса NP.

Почему это важно?

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

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

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

Почему это особенно важно для криптографии?

Стоит понимать, что солидная часть криптографии (например, криптографические системы с открытым ключом) строится на предположении, что некоторые вещи нельзя выполнить быстро (чуть более точно: нельзя построить быстрый алгоритм для некоторых задач). Например, быстро разложить число на простые множители. Если выяснится, что P = NP, и мы способны построить быстрые алгоритмы для задач из класса NP (вроде разложения числа на простые множители), то многие методы защиты сразу же устареют, поскольку у каждого желающего будет быстрый алгоритм, способный обойти защиту.

Так P равно NP или нет?

Большинство современных специалистов сходится во мнении, что P не равно NP. Некоторое интуитивное объяснение этому мы уже давали: на протяжении десятилетий лучшие умы компьютерных наук пытались построить быстрые алгоритмы для задач из классов NP и NP-complete, но это ни разу не увенчалось успехом. Кроме того, в и годах было проведено голосование «равны ли P и NP» с четырьмя вариантами ответов: нет, да, не уверен, вопрос независим с современной системой аксиом и поэтому теорему невозможно доказать или опровергнуть. Результаты были следующими (в процентах): 61/83, 9/9, 22/5, 8/3. Другими словами, в рамках последнего голосования 83 процента опрошенных верят, что P не равно NP.

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

NP-полные задачи

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

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

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

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

Гамильтоновым путем в графе называется путь, проходящий через каждую вершину в точности один раз. Если при этом путь возвраща­ется в исходную вершину, то он называется гамильтоновым циклом. Граф, в котором есть гамильтонов путь или цикл, не обязательно явля­ется полным. Задача о поиске гамильтонова цикла следующим образом сводится к задаче о коммивояжере. Каждая вершина графа - это го­род. Стоимость пути вдоль каждого ребра графа положим равной 1. Стоимость пути между двумя городами, не соединенными ребром, по­ложим равной 2. А теперь решим соответствующую задачу о комми­вояжере. Если в графе есть гамильтонов цикл, то алгоритм решения задачи о коммивояжере найдет циклический путь, состоящий из ребер веса 1. Если же гамильтонова цикла нет, то в найденном пути будет по крайней мере одно ребро веса 2. Если в графе N вершин, то в нем есть гамильтонов цикл, если длина найденного пути равна N, и такого цикла нет, если длина найденного пути больше N.

В 1971 году Кук доказал NP-полноту обсуждаемой в следующем пара­графе задачи о конъюнктивной нормальной форме. NP-полнота большого числа задач была доказана путем редукции к ним задачи о конъюнктив­ной нормальной форме. В книге Гэри и Джонсона, опубликованной в 1979 году, приведены сотни задач, NP-полнота которых доказана.

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

Типичные NP задачи

Каждая из задач, которые мы будем обсуждать, является либо опти­мизационной, либо задачей о принятии решения. Целью оптимизацион­ной задачи обычно является конкретный результат, представляющий собой минимальное или максимальное значение. В задаче о принятии решения обычно задается некоторое пограничное значение, и нас ин­тересует, существует ли решение, большее (и задачах максимизации) или меньшее (в задачах минимизации) указанной границы. Ответом в задачах оптимизации служит полученный конкретный результат, а в задачах о принятии решений - «да» или «нет».

Ранее мы занимались оптимизационным вариантом задачи о комми­вояжере. Это задача минимизации, и нас интересовал путь минималь­ной стоимости. В варианте принятия решения мы могли бы спросить, существует ли путь коммивояжера со стоимостью, меньшей заданной константы С. Ясно, что ответ в задаче о принятии решения зависит от выбранной границы. Если эта граница очень велика (например, она превышает суммарную стоимость всех дорог), то ответ «да» получить несложно. Если эта граница чересчур мала (например, она меньше сто­имости дороги между любыми двумя городами), то ответ «нет» также дается легко. В остальных промежуточных случаях время поиска от­вета очень велико и сравнимо со временем решения оптимизационной задачи. Поэтому мы будем говорить вперемешку о задачах оптимиза­ции и принятия решений, используя ту из них, которая точнее отвечает нашим текущим целям.

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

Раскраска графа

Как мы уже говорили, граф G= (V, Е) представляет собой набор вершин, или узлов, V и набор ребер Е соединяющих вершины по­парно. Здесь мы будем заниматься только неориентированными графа­ми. Вершины графа можно раскрасить в разные цвета, которые обычно обозначаются целыми числами. Нас интересуют такие раскраски, в ко­торых концы каждого ребра окрашены разными цветами. Очевидно, что в графе с N вершинами можно покрасить вершины в N различных цветов, но можно ли обойтись меньшим количеством цветов? В задаче оптимизации нас интересует минимальное число цветов, необходимых для раскраски вершин графа. В задаче принятия решения нас интере­сует, можно ли раскрасить вершины в С или менее цветов.

У задачи о раскраске графа есть практические приложения. Если каждая вершина графа обозначает читаемый в колледже курс, и вер­шины соединяются ребром, если есть студент, слушающий оба курса, то получается весьма сложный граф. Если предположить, что каждый студент слушает 5 курсов, то на студента приходится 10 ребер. Пред­положим, что на 3500 студентов приходится 500 курсов. Тогда у полу­чившегося графа будет 500 вершин и 35 000 ребер. Если на экзамены отведено 20 дней, то это означает, что вершины графа нужно раскра­сить в 20 цветов, чтобы ни у одного студента не приходилось по два экзамена в день.

Разработка бесконфликтного расписания экзаменов эквивалентна раскраске графов. Однако задача раскраски графов принадлежит к классу NP, поэтому разработка бесконфликтного расписания за разум­ное время невозможна. Кроме того при планировании экзаменов обыч­но требуется, чтобы у студента было не больше двух экзаменов в день, а экзамены по различным частям курсам назначаются в один день. Оче­видно, что разработка «совершенного» плана экзаменов невозможна, и поэтому необходима другая техника для получения по крайней мере неплохих планов.

Раскладка по ящикам

Пусть у нас есть несколько ящиков единичной емкости и набор объ­ектов различных размеров . В задаче оптимизации нас ин­тересует наименьшее количество ящиков, необходимое для раскладки всех объектов, а в задаче принятия решения - можно ли упаковать все объекты в В или менее ящиков.

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

Упаковка рюкзака

У нас имеется набор объектов объемом
стоимости
. В задаче оптимизации мы хотим упаковать рюкзак объемом К так, чтобы его стоимость была максимальной. В задаче принятия решения нас интересует, можно ли добиться, чтобы суммарная стоимость упа­кованных объектов была по меньшей мереW.

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

Задача о суммах элементов подмножеств

Пусть у нас есть множество объектов различных размеров
и некоторая положительная верхняя границаL. В задаче оптимиза­ции нам необходимо найти набор объектов, сумма размеров которых наиболее близка к L и не превышает этой верхней границы. В задаче принятия решения нужно установить, существует ли набор объектов с суммой размеров L. Это упрощенная версия задачи об упаковке рюк­зака.

Задача об истинности КНФ-выражения

Конъюнктивная нормальная форма (КНФ) представляет собой по­следовательность булевских выражений, связанных между собой опера­торами AND(обозначаемыми), причем каждое выражение является мономом от булевских переменных или их отрицаний, связанных опе­раторамиOR(которые обозначаются через). Вот пример булевского выражения в конъюнктивной нормальной форме (отрицание обознача­ется чертой над именем переменной):

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

Задача планирования работ

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

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

Чтобы проиллюстрировать центральную роль этого понятия, можно вообразить пять различных возможных миров (возможных - потому что еще не доказано, что они нереальны, и наш может оказаться любым из них) и посмотреть как условия в них будут влиять на информатику и жизнь вообще.
В частности, для демонстрации с точки зрения человека, будем использовать печальную историю Профессора Гроуса, того самого преподавателя математики, который задал классу задачку - сосчитать сумму чисел от 1 до 100. Всем известно, что на его беду в классе оказался маленький Гаусс, который быстро заметил закономерности арифметической прогрессии и почти моментально посчитал эту сумму. Но мало кто знает, что после этого Профессором овладела навязчивая идея отомстить Гауссу и унизить его перед всем классом, придумывая задачи, которые Гаусс не мог решить. Это привело Профессора в сумасшедший дом (не самый приятный конец, особенно в 19 веке), а у Гаусса развило интерес к теоретико-числовым алгоритмам. Попробуем представить что было бы в различных мирах, которые будем рассматривать.

Алгоритмика
Алгоритмика - это мир, в котором P = NP. В этом мире Профессору везло бы еще меньше, чем в реальности. Так как Профессору нужно поставить в тупик Гаусса задачей, на которую он (Профессор) затем должен сам показать классу верный ответ, он ограничен в выборе задач теми, которые имеют легко проверяемое решение (то есть задачи из NP). Гаусс может использовать метод проверки, чтобы автоматически решить эту задачу.
Метод автоматического получения алгоритма решения проблем из алгоритма проверки верного решения произведет революцию в информатике того мира. Задачи, которые казались неподдающимися, окажутся тривиальными. Почти все задачи оптимизации будут простыми и автоматическими. Например, в проектировании СБИС больше не будут использоваться эвристики, вместо этого будет генерироваться оптимальная проводка, если задан критерий оптимальности. Языки программирования больше не будут содержать инструкции, описывающие как выполнять вычисления. Вместо этого они только будут описывать свойства, которыми должны обладать выходные данные по отношению к входным данным. Компилятор будет самостоятельно переводить язык спецификаций в алгоритм решения.
Менее очевидно, что P=NP сделает тривиальными многие аспекты программ искусственного интеллекта. Можно будет использовать обучающиеся системы, основывающиеся на принципе «бритвы Оккама», чтобы автоматически обучать компьютер выполнять действия, которые могут делать люди. Достаточно будет обеспечить обучающую выборку входных данных и выходных данных, произведенных человеком-экспертом, и компьютер выведет простейший алгоритм, которые будет выдавать те же ответы, что и эксперт. Так, компьютер можно будет научить распознавать и разбирать предложения на естественном языке, нужно только обеспечить достаточное количество примеров верных и неверных предложений (здесь предполагается, что существует некий простой алгоритм, который люди используют для разбора естественных языков).
С другой стороны, в Алгоритмике не будет возможности различить людей и компьютеры с информационной точки зрения. Упомянутые обучающиеся алгоритмы смогут легко научиться имитировать поведение других машин и даже людей. Любой код, который может быть разработан, так же легко может быть взломан. Мало пользы будет от попыток скрыть алгоритм, на котором основан код, так как такой же алгоритм можно будет легко получить, имея небольшое количество пар шифротекст - плейнтекст. Не будет возможности обеспечить доступ к информации нескольких людям, не делая ее таким образом доступной для всех. Поэтому любые способы идентификации должны будут быть основаны на физических измерениях. И безопасность идентификации будет базироваться на неизменности физических параметров и устойчивости к внешним воздействиям каналов передачи данных от измерителя к идентификационному устройству.
Эвристика
Эвристика - это мир, в котором задачи из NP не имеют эффективных решений в худшем случае, но легко решаемы в среднем (для некоторого распределения вероятностей на множестве входов).
Эвристика, в некотором роде, парадоксальный мир. Здесь существуют сложные экземпляры задач из NP, но найти такой сложный экземпляр - сама по себе сложно решаемая задача. В этом мире Профессор будет иметь возможность найти задачи, которые окажутся не по зубам Гауссу. Но ему придется потратить неделю на поиск задачи, которую Гаусс не сможет решить в течение дня, и год, чтобы найти задачу, на которую Гаусс потратит месяц (в данном случае предполагается, что Гаусс имеет некоторое полиномиальное преимущество над профессором, ведь Гаусс, в конце концов, гений). Скорее всего, жизнь не настолько сурова, чтобы предоставлять нам сложные задачи, лишь бы жизнь малиной не казалась. Поэтому для практических целей этот мир почти неотличим от Алгоритмики.
Или все же отличим? В Эвристике среднее время решения задачи из NP зависит от среднего времени «обдумывания» этой задачи. Это несколько усложняет ситуацию. Допустим, в среднем, вычисление решения задачи в два раза дольше придумывания решения. Если мы тратим время T на обдумывание задачи №1, то мы потратим 2T единиц времени на вычисление решения. Решение этой задачи влияет на решение задачи №2, т.е. на обдумывание решения задачи №2 мы потратили 3Т единиц времени. Поэтому на решение задачи №2 будет потрачено 6Т единиц времени. Что приводит к задаче №3, на обдумывание которой мы уже потратили 10Т единиц времени, следовательно 20Т будет потрачено на решение. Так как эта рекурсия экспоненциально растет, уже через несколько шагов мы пересечем границу между «осуществимым» и «нереальным».
В случае дизайна СБИС здесь уже не обязательно будут эффективные решения, так как в данном случае нас мало интересует большинство возможных подходящих под спецификации схем, а важны минимальные варианты, удовлетворяющие спецификациям. Такие схемы могут не иметь хорошего распределения, и, так как, скорее всего, понадобится экспоненциальное время для их поиска, нет никаких гарантий, что они не являются теми самыми «худшими случаями», на которых плохо работают алгоритмы в Эвристике.
В криптографии и сетевой безопасности не будет принципиальных различий с Алгоритмикой. Мало толку будет, если добросовестные пользователи будут тратить много времени на поиск экземпляра задачи, которая могла бы однозначно их идентифицировать, когда злоумышленник может решить этот экземпляр за сравнимое количество времени (предполагается, что злоумышленник, который хочет взломать систему, использует значительно больше ресурсов, чем добросовестный пользователь).
Пессиландия
Пессиландия - это худший из возможных случаев - в ней есть задачи, решаемые сложно даже в среднем, но нет односторонних функций. Под отсутствием односторонних функций понимается следующее: для любой задачи, которую легко вычислить, также легко найти решение обратной задачи, в том смысле, что для почти всех значений x, если дано F(x), то можно найти некоторый x", такой, что F(x") = F(x), причем примерно за то же время, что тратится на вычисление F(x).
В Пессиландии Профессор смог бы задать Гауссу задачки, которые даже молодой гений не смог бы решить. Но и сам Профессор не смог бы продемонстрировать решение, так что унижение Гаусса было бы неполным.
В этом мире во многих областях задачи не имели бы легких решений. Прогресс был бы как и в нашем мире: медленно продвигался бы за счет более глубокого понимания мира и за счет использования не совсем удовлетворительных эвристик. Общие методы решения задач не работали бы в большинстве областей. Однако несколько полезных алгоритмов были бы возможны, базируясь на отсутствии односторонних функций. Например, метод сжатия данных, в котором, зная распределение входных данных, в пределе можно было бы их сжимать до ожидаемой длины в соответствии с энтропией распределения.
В этом мире не будет возможности использовать сложные задачи в криптографии. Задача, на которую никто не знает ответ, не может быть использована для отличия добросовестного пользователя от злоумышленника.
Миникрипт
В Миникрипте есть односторонние функции, но невозможна криптография с открытым ключом. Здесь мы понимаем под криптографией с открытым ключом задачу засекреченного общения через публичные каналы связи, хотя, строго говоря, криптография с открытым ключом - лишь один из способов решения этой задачи.
Односторонние функции могут использоваться для генерации сложных, но решенных задач, а именно: генератор будет выбирать х, вычислять y = F(x) и ставить задачу поиска «найти такой x", что F(x") = y». Таким образом, в Миникрипте Профессор, наконец, сможет одержать верх над Гауссом перед всем классом.
В сети участники смогут идентифицировать себя перед другими пользователями, а также удостоверять сообщения с использованием цифровой электронной подписи. Будет возможно доказывать факты о секрете, не открывая другую секретную информацию, содержащуюся в нем. Если небольшое количество информации заранее передано между участниками, то можно установить надежный секретный код между двумя участниками сети, который позволит им общаться в закрытом порядке, используя открытые каналы связи. Однако, невозможно будет провести тайное голосование через открытые каналы, или обеспечить безопасные переговоры, не пересылая заранее некоторую информацию через защищенные каналы. Не будет возможности создать анонимные цифровые деньги.
Криптомания
В Криптомании криптография с открытым ключом существует. В Криптомании Гаусс будет унижен еще больше; Профессор и его ученик-любимчик смогут совместно выбрать задачу, на которую они оба будут знать ответ, а Гаусс ее решить не сможет. Более того, в этом мире Профессор сможет сделать так, что все в классе будут знать как решить заданную задачу, кроме Гаусса.
Из существования протоколов с открытым ключом следует существование односторонних функций, поэтому в этом мире все еще существуют псевдо-случайность, цифровые подписи, идентицикация, протоколы с нулевым знанием и прочее. Также, если засекреченный обмен производится с помощью односторонних функций с секретом (а все известные протоколы явно или косвенно используют именно такие функции), можно решить любые вообразимые криптографические задачи. В отличие от других миров, где создание конфиденциальности - это технологическая задача, технологии в Криптомании наоборот будут ограничивать возможности пользователей к уменьшению конфиденциальности. Большинство решений по тому, сколько конфиденциальности позволено гражданам, будут приниматься в результате политических и социальных процессов, а не из-за технических возможностей.
Этот мир больше всего похож на наш с вами., по крайней мере до тех пор, пока считается, что известные протоколы с открытым ключом надежны.

Предыдущая статья: Следующая статья:

© 2015 .
О сайте | Контакты
| Карта сайта