Як розділити набір на задану кількість роз'єднаних підмножин за певних умов?


11

Мені дають набір , ціле число s \ leqslant k і невід'ємні цілі числа a_ {ij} . Моя проблема полягає в знаходженні s непересічні підмножини S_j з \ {1, \ ldots, до \} такі , що:A{1,,k} s kskaijaijssSjSj{1,,k}{1,,k}

  1. sj=1Sj=Asj=1Sj=A ; і
  2. |Sj|aij|Sj|aij для всіх iSjiSj і j=1,,sj=1,,s .

Як вирішити цю проблему? Чи важко знайти можливе рішення?

Я думаю, що вирішити проблему непросто, тому що я спробував певну процедуру, яка починається деяким j{1,,n}j{1,,n} і призначає i{1,,k}i { 1 , , k } до числа з ii призначених jj , більше aijаi j для деяких ii призначений. Але це невірно, тому що я міг залишитися від деяких ii які не можна було призначити жодному jj (через їх aijаi j який не міг бути задоволений).

Метод грубої сили, коли мені доводиться генерувати всі підмножини AА і перевіряти кожну, працює для мене ( k = 8 , n = 3k = 8 , n = 3 ), але дуже неефективний.


Перевірте, чи відповідає редагування питання, яке ви хочете задати. Також звідки береться ? Це фіксована константа (не частина вводу, але фіксована на весь час), чи це частина вводу? Нарешті, ви шукаєте практичне рішення? чи ви шукаєте теоретичну складність цієї проблеми? Якщо перший, ви спробували використовувати цілісне лінійне програмування? максамакс
DW

Відповіді:


10

Ця проблема є важкою для NP завдяки скороченню від Vertex Cover.

У задачі про вершинні кришки нам дають графік та число , і наше завдання - визначити, чи є підмножина максимум вершин від такою, що кожне ребро в є інцидентним принаймні з однією вершиною з . (Рівнозначно: Чи можна вбити кожен край у , видаливши не більше вершин?)G = ( V , E ) r U rG = ( V, Е)rUrV E U G rVЕUГr

По- перше, розбиття у підмножин непересічних еквівалентно присвоєння кожному елементу в саме один з можливих міток. Основна ідея скорочення полягає у створенні мітки для кожної вершини у , а також "дозволити" кожному ребру присвоїти лише одну з двох міток, що відповідають його кінцевим точкам, у такому значенні: призначення краю відповідному label не встановлює (справжнього) обмеження щодо того, яким іншим ребрам можна присвоїти ту саму мітку, в той час як присвоєння краю невідповідній мітці запобігає призначенню будь-якого іншого краю тієї ж мітки - що, звичайно, призводить до збільшення числа необхідних чітких етикеток.A s A s S j v j VАсАсSjvjV

Щоб побудувати екземпляр вашої проблеми з екземпляра покриття Vertex:( A , a , s ) ( G , r )( A , a , s )( G , r )

  1. Встановіть доІ створити елемент в для кожного ребра в . (Ці пари можна розглядати як цілі числа ; будь-яке біекція між ними буде робити.)k | Е | ( i , j ) A v i v j Eк| Е|( i , j )АvivjЕ1 , , к1 , , к
  2. Встановіть наякщо або ; в іншому випадку встановіть на 1.a ( b , c ) , d | Е | d = b d = c a ( b , c ) , dа( б , в ) , д| Е|г= bг= cа( б , в ) , д
  3. Встановити .s = rs = r

Якщо - це екземпляр YES Vertex Cover, то легко зрозуміти, що щойно створений екземпляр вашої проблеми є також інстанцією YES: просто виберіть мітки відповідні вершинам у будь-якому рішенні , і для кожного краю присвоюйте відповідний елемент залежно від того, була обрана одна з міток або (виберіть довільно, якщо обидві мітки були вибрані). Це рішення використовує підмножини і є дійсним, оскільки єдиними чинними є відповідні( G , r ) S j v j U v b v cE ( b , c ) A S b S c s a i j | Е |( G , r )SjvjUvбvcE( b , c ) ASбScсаi jетикетки, які мають (не) ефектом запобігання більше, ніжкраям присвоюється однакова мітка.| Е|

Залишається показати, що YES-примірник вашої проблеми передбачає, що оригінал - це екземпляр YES-вершини Cover. Це трохи більш складним, так як дійсне рішення до в загальному випадку може призначити ребро НЕ -corresponding мітка , тобто , що означає , що ми не можемо обов'язково «зчитувати» дійсну вершину кришку від дійсного рішення .X = ( A , a , s ) ( G , r ) Y X ( i , j ) S m m { i , j } U YХ= ( A , a , s )( G , r )YХ( i , j )Sмm { i , j }UY

Однак присвоєння невідповідної мітки має високу вартість, що суттєво обмежує структуру рішення: щоразу, коли ребру присвоюється така мітка , з , факт що гарантує, що це повинен бути єдиний край, призначений цій мітці. Отже, в будь-якому рішенні що містить такий невідповідно маркований край , ми могли б побудувати альтернативне рішення таким чином:( i , j ) S m m { i , j } a ( i , j ) , m = 1 Y ( i , j ) S m Y ( i , j )Sмm { i , j }а( i , j ) , m= 1Y(i,j)SmY

  1. Довільно виберіть нову мітку для або або .S z ( i , j ) S i S jSz(i,j)SiSj
  2. Призначте цю нову мітку. Якщо це призведе до недійсного рішення, це повинно бути тому, що саме одному іншому краю , вже було присвоєно мітку . У цьому випадку встановіть і перейдіть до кроку 1.( i , j ) ( i , j ) z { i , j } S z ( i , j ) = ( i , j )(i,j)(i,j)z{i,j}Sz(i,j)=(i,j)

Наведений вище алгоритм повинен закінчуватися одним із двох способів: або знайдена нова мітка , яка не вводить суперечностей, або повний цикл вершин. У першому випадку знайдено дійсне нове рішення з наборами , а в останньому випадку - нове дійсне рішення з наборами ; в будь-якому випадку, ми побудували діюче нове рішення з принаймні ще одним краєм, присвоєним відповідній мітці. Після повторення всього цього процесу не більшеразів ми створили правильне рішення з якого може бути зчинено рішення вихідної проблеми Vertex Cover .S z s - 1 s | Е | Y Szs1s|E|Y′′

Ця конструкція є явно поліноміальною часом, тому випливає, що ваша проблема є NP-жорсткою.


Дякую за твою допомогу. Чи маєте ви якесь уявлення, як можна вирішити (приблизно) цю проблему? (Як, наприклад, чи можу я використовувати методи для вирішення проблеми вершини для її вирішення?) Я спробував деякий жадібний підхід, але, іноді, він не вдається вивести можливе рішення. (Те, як я обираю робить жадібний підхід не вдається, де може існувати рішення.)S jSj
drzbir

Що ж, очікується, що жадібний підхід іноді не зможе отримати можливе рішення, оскільки якби це було завжди, ви вирішили б непросту проблему за багато разів ;-) Пам'ятайте, що це не обов'язково неправильно, якщо він не може знайти рішення: цілком можливо, що не існує можливого рішення.
j_random_hacker

Щодо методик вирішення, то мені подобається той, що називається пошуком променів. Це в основному своєрідне зв'язане з гілкою, яке «забуває» досить погані часткові рішення, щоб обмежити його використання пам'яті. (B&B - це дуже хороший підхід, іноді вирішує проблеми швидко, і це трохи простіше, ніж пошук променями, тому це варто зняти - але, оскільки це точний метод, він, звичайно, може зайняти тисячоліття в деяких випадках.)
j_random_hacker

(Все наведене нижче стосується також пошуку променів, а також B&B.) B&B - дуже загальна методика. Ключовим з цього питання є використання специфіки проблеми, щоб організувати прийняті вами рішення так, щоб, наскільки це можливо, погані рішення (тобто рішення, які не призводять до можливих рішень), приймалися на початку дерева пошуку. (Ці рішення будуть прийняті десь , і кожен рівень, який вони отримують, удвічі збільшує кількість разів, коли вони приймаються.) Для вашої проблеми я б запропонував спершу класифікувати елементи в у порядку зменшення «поганості», де. ..АA
j_random_hacker

... поганість елемента може бути, наприклад, мінімум на всіх , розрив зв'язків на другий мінімум, потім на третій мінімум тощо. Грубо кажучи, "найгіршим" елементом буде елемент що найбільш сильно обмежує будь-який набір, до якого він доданий. На кожному вузлі на глибині в дереві пошуку ви матимете часткове рішення, в якому перші (і, отже, «найгірші») елементи вже були призначені наборам; вам потрібно буде вибрати якому з наборів призначити -й елемент: тобто вам знадобиться до рекурсивних викликів. ("До", тому що, сподіваємось, у нас є ...i a i j j d d n ( d + 1 ) niaijjddn(d+1)n
j_random_hacker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.