Припустимо, що я програміст і у мене є проблема, що завершується NP, що мені потрібно вирішити. Які методи доступні для вирішення проблем NPC? Чи є опитування чи щось подібне на цю тему?
Припустимо, що я програміст і у мене є проблема, що завершується NP, що мені потрібно вирішити. Які методи доступні для вирішення проблем NPC? Чи є опитування чи щось подібне на цю тему?
Відповіді:
Існує ряд добре вивчених стратегій; що найкраще у вашій заявці залежить від обставин.
Поліпшення найгіршого випадку виконання
Використовуючи конкретну проблему, ви можете часто вдосконалити наївний алгоритм. Наприклад, існуютьалгоритмидля вершинного покриття з[1]; це величезне поліпшення в порівнянні з наївнимі може зробити розміри екземплярів релевантними для вас.
Покращення очікуваного часу виконання
Використовуючи евристику, ви часто можете розробити швидкі алгоритми у багатьох випадках. Якщо до них належить більшість, яких ви зустрічаєте на практиці, ви золоті. Прикладами є SAT, для якого існують досить задіяні розв’язувачі, та алгоритм Simplex (який вирішує поліноміальну задачу, але все ж). Однією з основних прийомів, яка часто корисна, є гілка і зв'язана .
Обмежте проблему
Якщо ви можете зробити більше припущень щодо своїх входів, проблема може стати легкою.
Ослаблення результату
Це означає, що ви терпите помилкові або неповні результати. Є два основних аромати:
Щоб отримати ретельне звернення, зверніться до Алгоритміки важких проблем Громковича.
Інші відповіді вирішили це з більш теоретичної точки зору. Ось більш практичний підхід.
Що стосується "типових" проблем, що стосуються повного вирішення NP ( "чи існує річ, яка задовольняє всі ці обмеження?" ), Я завжди намагаюся спершу:
Напишіть просту програму, що кодує ваш проблемний екземпляр як екземпляр SAT .
Потім візьміть хороший розвідник SAT , запустіть його (використовуючи найшвидший багатоядерний комп'ютер, який у вас трапляється), і подивіться, що відбувається.
Спробуйте спочатку з меншими екземплярами, щоб зрозуміти, скільки часу це може зайняти.
Дивно, але цей підхід набагато кращий, ніж намагатися реалізувати власний вирішувач спеціально для вашої поточної проблеми:
SAT вирішувачі дуже розумні та добре оптимізовані. Вони легко перевершують вашу власну реалізацію пошукового пошуку (незалежно від того, скільки часу ви витрачаєте на оптимізацію коду). Вони також легко перевершують багато альтернативних варіантів, таких як цілі лінійки розв'язувачів лінійного програмування.
Для цього потрібно дуже мало програмування. Крок 1 є відносно простим і не є критичним для продуктивності; ви можете використовувати мови сценаріїв, такі як Python. Хтось ще подбав про те, щоб реалізувати все, що вам потрібно для кроку 2.
Для типових проблем з оптимізацією жорсткої NP ( "знайти найменше, що задовольняє всім цим обмеженням" ) такий підхід може чи не може працювати.
Якщо ви можете легко перетворити її на проблему рішення ( "чи існує річ розміру 4, яка задовольняє всім цим обмеженням?" , "Як щодо розміру 3?" ), Чудово, дотримуйтесь того ж підходу, що і вище, і з проблемами вирішення.
В іншому випадку ви можете скористатися евристичним вирішувачем, який намагається знайти невелике рішення (не обов'язково найменше рішення). Наприклад:
Кодуйте свою проблему як (зважений) екземпляр MAX-SAT .
Використовуйте евристичні вирішувачі з пакету UBCSAT . Евристичні розв'язувачі тривіально паралелізуються; спробуйте знайти комп’ютерний кластер із сотнями комп’ютерів. Ви можете запускати розв’язувачі скільки завгодно, а потім приймати найкраще рішення, яке ви знайшли досі.
Одним із способів атакувати непридатність є думка про проблему в контексті параметризованої складності.
У параметризованій складності ми вирішуємо задачу, фіксуючи деякий параметр (скажімо, ). Якщо нам вдасться вирішити якусь задачу за час, ми кажемо, що проблема є фіксованим параметром, який можна простежити в . Тут - лише якась обчислювана функція. Є безліч важких проблем з NP, які є FPT, однак, існує багато проблем в NP, які, як вважають, не мають фіксованого параметра.
Якщо, виправивши якийсь параметр, ми зможемо вирішити задачу за час , ця проблема, як кажуть, є в XP. Ми вважаємо, що XP не дорівнює FPT (так само, як ми вважаємо, P NP). Але існує також багато проблем між цими двома (FPT та XP), і ми визначили ієрархію (насправді декілька), однією з яких є W-ієрархія. У ієрархії W у вас є скорочення на зразок скорочення NP-повних класів, за винятком того, що ми не шукаємо політомічних скорочень, нам просто потрібно FPT скорочення. Клас W [0] - клас FPT.
Ось кілька зразків у різних класах ієрархії W:
Це ще один рівень складностей, щоб класифікувати задачі NP більш точним способом, і якщо ви хочете більше, ви можете подивитися на параметризовану складність ланцюга та ієрархію W від Downey et al (1998).
А якщо ви хочете ще більше, добре прочитати Теорію параметризованої складності Флума та Грое .
І, нарешті:
Відомо, що якщо проблема має FPTAS (повністю поліноміально-часову схему наближення ), то це також FPT (що очевидно) Але в зворотному напрямку нічого невідомого, також є деякі роботи щодо відношення PTAS та XP, але є не дуже тісний зв’язок між PTAS та W ієрархією (принаймні, я не знаю на даний момент).
Також в деяких випадках ми можемо зафіксувати різні параметри, наприклад: довжина найдовшого шляху у графі обмежена, а розмір рішення обмежений (наприклад, у вершині зворотного зв’язку), ...
Можливо, деякі люди вважають, що параметризована складність на практиці марна. Але це неправильно. Багато параметризованих алгоритмів виявлено в реальних програмах, коли ви можете виправити деякі параметри, ось приклад:
Одна з основних теорем параметризованої складності - це зробити Courcell, він надає алгоритм часу роботи для деяких класів задач, що параметризуються. Кількість веж становить , що означає , неможливо. Але одна група реалізувала його алгоритм з деякими модифікаціями на більш спеціальному випадку, і вони отримали надзвичайно швидкий алгоритм для вершинного покриття, який зараз використовується на деяких станціях метро в Німеччині.
Одним з найшвидших і найточніших евристичних алгоритмів для TSP є: об'єднання турів та розкладання гілок , в яких використовується параметризація задачі (не безпосередньо, а декомпозиція гілки та застосовуваний динамічний програмування, заснований на деяких хороших припущеннях).
Повнота NP - це найгірший варіант внутрішньопрофільної здатності. Залежно від того, над якою проблемою ви працюєте, багато класів екземплярів можуть бути вирішеними у розумний час на практиці (хоча вам може знадобитися більш спеціалізований алгоритм, щоб отримати хороші умови виконання).
Поміркуйте, чи існує ефективне скорочення від вашої проблеми до проблеми з хорошими доступними рішеннями, такими як булева задоволеність або цілісне лінійне програмування.
Загалом у вас є три варіанти: Перший - це розглянути особливі випадки вашої проблеми . У деяких особливих випадках ваша проблема може бути вирішеною поліноміально, наприклад, визначення того, чи існує простий шлях від до до у довільному спрямованому графіку є NP-Complete, але він буде поліноміальним (лінійним), коли зменшимо. Другий варіант - використовувати хороший алгоритм оцінки для вирішення вашої проблеми. Алгоритми оцінки дають майже оптимальні відповіді на вашу проблему. Якщо ви не можете скористатися попередніми параметрами, єдиним залишився спосіб: використовувати алгоритм, який можна допустити, щоб вирішити вашу проблему в експоненціальний часv j v k G G. Серед експоненціальних алгоритмів час роботи деяких з них може бути допустимим, коли розмір вводу вашої проблеми менший за конкретне значення.
Хоча я коротко торкався в деяких відповідях, дозвольте підкреслити, що на практиці проблеми, повні з NP, постійно вирішуються (або наближаються). Основна причина того, що ви можете вирішити неповні завдання на практиці, це:
Випадки, що трапляються на практиці, не є «гіршим випадком».
Ще одна причина розбіжності:
Важко проаналізувати евристичні алгоритми формально.
На практиці ви використовуєте евристичні алгоритми для вирішення ваших NP-повних проблем і сподіваєтесь на найкраще. Результати часто приголомшливі.
Ще одне питання, яке стосується інших відповідей:
Іноді експоненціальні алгоритми досить швидкі.
Це, звичайно, залежить від проблеми. Коли задіяні великі дані, ми маємо протилежну максимуму:
Іноді єдиними можливими алгоритмами є квазілінійні.
Боюся, що натовп тут досить теоретично схильний. Ви можете отримати кращі відповіді на головному сайті stackexchange.