- PVSM.RU - https://www.pvsm.ru -

Наверное, каждый сталкивался с тем, что приходилось столкнуться с какой-то сложной задачей, решение к которой не удавалось подобрать не то что сразу — а даже после долгих упорных часов работы или дней. Об одном из классов таких задач — NP-полных, мы сегодня и поговорим.
А вообще реально ли встретить такие задачи в обычной жизни? На самом деле, они возникают в огромном ряде случаев: комбинаторика, графы и сети, выполнение логических формул, работа с картами, оптимальные загрузки, отображения, задачи дискретной оптимизации, нахождение самых длинных последовательностей, поиск равных сумм и многие задачи на множества! И это далеко не полный список.
Под катом неформальный гайд — как понять, что перед вам может быть NP задача и что делать, если это именно она и оказалась. Сегодня мы атакуем этот вопрос с практической стороны.
Как понять, что перед вами оказалась NP-полная задача? Во-первых, самая простая эвристика на обнаружение — поиск по уже известным NP-полным задачам с целью определить что-то похожее, таких списков немало — например [1].
Второе, рассмотреть следующие свойства задач:
Подробнее про свойства NP-полных задач тут [2] и тут [3].
Приведем простой пример на задаче, которую недавно утвердили как NP-полную!
По материалам статьи. [4] Нужно расставить N ферзей на доске размера N на N, при условии, что уже K <= N расставлены на доске (картинка из оригинальной научной статьи)

Во-первых, заметим, что очень похожая задача [5] с частично заставленным латинским квадратов NP полна.
А далее идем по списку:
Заметьте, что один из пунктов списка не выполняется, если всегда известно, что доска чистая и задача становится тривиальной.
И более того, это условный практический подход — эвристика по обнаружению NP-полных задач (со всеми плюсами и минусами).

Источник [6]
Почему имея на руках аналогичные задачи бывает непросто понять формально, что перед нами NP-задача? По-настоящему мы должны свети NP задачу к нашей, тогда мы точно будет знать, что наша задача NP-трудная! И если мы смогли ее смоделировать, как в списке выше, то она полная — то есть по крайней мере NP и не более чем NP, фактически “самая трудная среди NP задач” (как и остальные NP-полные).
Окей, надо ли оно нам? Не совсем, если вы прям уверены, после всех проверок, что перед вами NP-задача, то вам не нужно ничего доказывать, если вы не пишите научную статью.
А нужно либо (об этом всем мы поговорим ниже):
Самое важное — это оценить размеры-параметры и реалистичные сценарии!

xkcd.com/287 [7]
Например, вы знаете, что несмотря на то, что значения параметров не фиксированы, но условный N < 100 на всех практических сценариях не реализуется — значит, что условный перебор может для вас быть реальным решением.
Вам нужно определить для себя: какие у меня реальные значения параметров возможные и реально приходят в систему, какое вообще распределение и особенности данных, что реально, а что нет? А нужно ли нам самое оптимальное решение? Пройдемся по этим пунктам.
Или несмотря на то, что в общем случае входные данные могут быть любыми, но опять же на примере ферзей — обычно фиксирован один ферзь или даже ни одного. Значит, что в 90% случаев вы можете использовать очень простое решение и вызывать сложное только в крайних случаях.
Пример, когда в среднем все обычные комбинации простые: задача о дополнении ферзей — мы знаем, что условный DFS + эвристики могут в большинстве случаев находить решения очень быстро, и только в очень нестандартных ситуациях быть крайней сложными.

Вот пример, того как оценивалось решение для очень специализированной задачи NP-полной tiling против общего метода моделирования целого класса таких задач с помощью методов логического программирования:

(из статьи Relational Data Factorization [8] (Paramonov, Sergey; van Leeuwen, Matthijs; De Raedt, Luc: Relational data factorization, Machine Learning, volume 106))
Во-первых, скорость у спец решения LTM-k и общего метода существенно отличаются. Таким образом решение для именно такого типа задач на эвристиках может полностью решать эту проблему.
Во-вторых, пожертвовав качеством решения, общий приближенный метод давал очень похожую скорость.

Последний и самый мощный инструмент — это использовать системы моделирования NP-полных задач, такие как например Answer Set Programming [9].

Подробнее про языки логического программирования. [10]
Например решение задачи о расстановке ферзей будет выглядеть вот так:
% domain
row(1..n).
column(1..n).
% alldifferent: guess a solution
1 { queen(X,Y) : column(Y) } 1 :- row(X).
1 { queen(X,Y) : row(X) } 1 :- column(Y).
% remove conflicting answers: check this solution
:- queen(X1,Y1), queen(X2,Y2), X1 < X2, Y1 == Y2.
:- queen(X1,Y1), queen(X2,Y2), X1 < X2, Y1 + X1 == Y2 + X2.
:- queen(X1,Y1), queen(X2,Y2), X1 < X2, Y1 - X1 == Y2 - X2.
Проведя простой эксперимент по поиску решений для разного количества ферзей N — мы получим следующее: по оси Х — ферзи, по Y — время в секунда по поиску решения:

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

Автор: paramonov_ruvds
Источник [19]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/analiz-danny-h/359160
Ссылки в тексте:
[1] например: https://en.wikipedia.org/wiki/List_of_NP-complete_problems
[2] тут: https://habr.com/ru/post/207112/
[3] тут: https://habr.com/ru/post/208774/
[4] По материалам статьи.: https://habr.com/ru/post/343738/
[5] очень похожая задача: https://www.sciencedirect.com/science/article/pii/0166218X84900751
[6] Источник: https://www.usna.edu/Users/cs/wcbrown/courses/S17SI335/lec/l33/lec.html
[7] xkcd.com/287: https://xkcd.com/287/
[8] Relational Data Factorization: https://lirias.kuleuven.be/retrieve/456408/paper.pdf
[9] Answer Set Programming: https://www.youtube.com/watch?v=kdcd7Je2glc
[10] Подробнее про языки логического программирования.: https://habr.com/ru/post/322900/
[11] Что может пойти не так с Data Science? Сбор данных: https://habr.com/ru/company/ruvds/blog/510944/
[12] Заметки Дата Сайентиста: как измерить время забега марафона лежа на диване: https://habr.com/ru/company/ruvds/blog/512884/
[13] Заметки Дата Сайентиста: маленькие утилиты — большая польза: https://habr.com/ru/company/ruvds/blog/514990/
[14] Заметки Дата Сайентиста: персональный обзор языков запросов к данным: https://habr.com/ru/company/ruvds/blog/515820/
[15] Заметки Дата Сайентиста: на что обратить внимание при выборе модели машинного обучения — персональный топ-10: https://habr.com/ru/company/ruvds/blog/517830/
[16] Заметки Дата Сайентиста: с чего начать и нужно ли оно?: https://habr.com/ru/company/ruvds/blog/519522/
[17] Заметки Дата Сатаниста: честность модели: https://habr.com/ru/company/ruvds/blog/524084/
[18] Image: http://ruvds.com/ru-rub?utm_source=habr&utm_medium=article&utm_campaign=Sergei&utm_content=zametki_datasatanista_chto_delat_esli_pered_vami_okazalas_np-polnaya_zadacha#order
[19] Источник: https://habr.com/ru/post/529780/?utm_source=habrahabr&utm_medium=rss&utm_campaign=529780
Нажмите здесь для печати.