Чарівної кулі немає; Доказів твердості NP є жорсткими. Однак для всіх таких доказів існує загальна основа. Багато студентів, які борються з доказами твердості NP, плутаються з приводу того, що вони повинні робити, що, очевидно, не дозволяє зрозуміти, як це зробити. Отже, ось що робити, щоб довести проблему NP-важко.
По-перше, якщо ви просто робите домашнє завдання, ви повинні вирішити, яку NP-важку проблему слід звести до вашої проблеми . Це багато в чому питання "запаху". Якщо число 3 з’являється де-небудь у заяві проблеми, спробуйте зменшити його з або або . (Так, я серйозно.) Якщо ваша проблема пов'язана з пошуком оптимальної послідовності, перестановки або шляху, спробуйте зменшити значення або . Якщо ваша проблема вимагає найменшого підмножини з певним властивістю, спробуйте ; якщо він запитує найбільшу підмножину з певним властивістю, спробуйте3 C o l o r 3 P a r t i t i o n H a m i l t o n i a n C y c l e H a m i l t o n i a n P a t h C l i q u e I n d e3 S A T3 C o l o r3 П а р т і т і о нН а м і л т о н і а н С у с л еН а м і л т о н я а н П а т чC l i q u eI n d e p e n d e n t S e t. Якщо ваша проблема пов'язана з тим, щоб зробити щось у площині, спробуйте або . І так далі. Якщо ваша проблема не «пахне» як що-небудь, або , мабуть, найкраща ставка.P l a n a r T S P 3 S A T C i r c u i t S A TП л а н а р С і р к у і т С А ТП л а н а р Т С П3 S A TC i r c u i t S A T
Очевидно, що вам потрібно вже точно знати, як визначені всі ці проблеми , і чим простіше проблема, яку ви зменшуєте, тим краще. Тому настільки ж крутим, як результат може виглядати в кінцевому підсумку, я не рекомендую скорочувати з або або або .М і н е с ш е в е р е рT e t r i sOneCheckersMoveSuperMarioBros
По-друге, фактичне скорочення. Щоб зменшити проблему X (ту, яку ви знаєте, є важкою для NP) до проблеми Y (той, який ви намагаєтеся довести, є NP-жорстким, вам потрібно описати алгоритм, який перетворює довільний екземпляр X в юридичний екземпляр Y Алгоритм скорочення повинен робити щось конкретне з кожною "особливістю" X-екземпляра; частина виводу для кожної "функції" зазвичай називається гаджетом .
Але в чому особливість? Це залежить від проблеми X. Наприклад:
Для перетворення примірника вам знадобиться гаджет для кожної змінної та для кожного пункту у формулі введення. Кожен гаджет змінної повинен мати два "стану", які відповідають "істинному" та "хибному". Кожен гаджет пункту також повинен мати декілька "станів", кожне з яких якимось чином змушує принаймні одного з буквальних даних цього пункту бути істинним. (Стани не є частиною виводу алгоритму скорочення.)3SAT
Щоб перетворити екземпляр , вам знадобиться гаджет для кожної вершини та кожного краю вхідного графіка, а також інший гаджет для визначення трьох кольорів.3Color
Щоб перетворити екземпляр , вам знадобиться гаджет для кожного вводу, для кожного проводу та для кожного входу в ланцюзі вводу.PlanarCircuitSat
Конкретний вид гаджет залежить від завдання Y, той , який ви відновлюють до . Наприклад, якщо ви зводиться до проблеми щодо графіків, вашими гаджетами стануть невеликі підграграфи; дивіться статтю у Вікіпедії. Якщо ви зводиться до проблеми щодо планування, кожен гаджет буде набором завдань, які планується запланувати. Якщо ви зводиться до проблеми з Маріо , кожен гаджет буде набором блоків та цеглин та Koopas.
Це може заплутатися, якщо обидві проблеми стосуються одного і того ж об’єкта. Наприклад, якщо і X, і Y є проблемами щодо графіків, ваш алгоритм перетворить один графік (екземпляр X) в інший графік (екземпляр Y). Вибирайте нотацію розумно, щоб ви не плутали ці два графіки. Я також настійно рекомендую використовувати кілька кольорів чорнила.
Нарешті, ваш алгоритм зменшення повинен задовольняти трьом властивостям:
Він працює в поліном час. (Зазвичай це легко.)
Якщо вашому алгоритму скорочення надається позитивний екземпляр X як вхід, він створює позитивний екземпляр Y як вихід.
Якщо ваш алгоритм скорочення дає позитивний екземпляр Y як вихід, йому, мабуть, був наданий позитивний екземпляр X як вхід.
Тут є важлива тонкість. Ваш алгоритм скорочення працює лише в одному напрямку, від екземплярів X до екземплярів Y, але для доведення правильності алгоритму потрібно міркувати про перетворення в обох напрямках. Ви також повинні пам’ятати, що ваш алгоритм скорочення не може визначити, чи є даний екземпляр X позитивним чи негативним, що вимагало б вирішення проблеми NP-hard у поліноміальний час!
Ось що . Як тільки приходить з практикою.