Come suddividere un set in un determinato numero di sottoinsiemi disgiunti soggetti ad alcune condizioni?


11

Mi viene dato un set , un numero intero s \ leqslant k e numeri interi non negativi a_ {ij} . Il mio problema è quello di trovare s sottoinsiemi disgiunti S_j di \ {1, \ ldots, k \} tale che:A{1,,k}skaijsSj{1,,k}

  1. j=1sSj=A ; e
  2. |Sj|aij per tutti iSj e j=1,,s .

Come risolvere questo problema? È difficile trovare una soluzione fattibile?

Penso che non sia facile risolvere il problema perché ho provato una procedura che inizia con alcuni j{1,,n} e assegna i{1,,k} fino al numero di i assegnato a j sono maggiori aij per un po ' i assegnato. Ma questo non è corretto perché potrei essere lasciato di alcuni i che non potevano essere assegnati a nessun j (a causa della loro aij che non poteva essere soddisfatta).

Il metodo della forza bruta, quando devo generare tutti i sottoinsiemi di A e testarli ciascuno, funziona per me ( k=8,n=3 ) ma molto inefficiente.


Controlla se la modifica corrisponde alla domanda che vuoi porre. Inoltre, da dove proviene ? È una costante fissa (non parte dell'input, ma fissa per sempre) o fa parte dell'input? Infine, stai cercando una soluzione pratica? o stai cercando la complessità teorica di questo problema? Se il primo, hai provato a utilizzare la programmazione lineare intera? amax
DW

Risposte:


10

Questo problema è NP-difficile per riduzione da Vertex Cover.

Nel problema della copertura dei vertici, ci viene dato un grafico e un numero , e il nostro compito è determinare se esiste un sottoinsieme di al massimo vertici da tale che ogni fronte in sia incidente su almeno un vertice in . (Equivalentemente: è possibile uccidere ogni fronte in eliminando al massimo vertici?)G=(V,E)rUrVEUGr

In primo luogo, il partizionamento in sottoinsiemi disgiunti equivale ad assegnare ad ogni elemento in esattamente uno possibili etichette. L'idea di base della riduzione è quella di creare un'etichetta per ciascun vertice in e di "consentire" a ciascun bordo di assegnare solo una delle due etichette corrispondenti ai suoi punti finali, nel senso seguente: assegnare un bordo a un corrispondente etichetta non introduce alcun vincolo (autentico) su quali altri bordi possano essere assegnati alla stessa etichetta, mentre l'assegnazione di un bordo a un'etichetta non corrispondente impedisce a qualsiasi altro bordo di essere assegnato la stessa etichetta - il che ovviamente ha l'effetto di spingere verso l'alto il numero di etichette distinte richieste.AsAsSjvjV

Per costruire un'istanza del tuo problema da un'istanza di Vertex Cover:(A,a,s)(G,r)

  1. Impostare su, E creare un elemento in per ciascun bordo in . (Queste coppie possono essere pensate come numeri interi ; qualsiasi biiezione tra loro farà.)k|E|(i,j)AvivjE1,,k
  2. Impostare suse oppure ; in caso contrario, impostare su 1.a(b,c),d|E|d=bd=ca(b,c),d
  3. Impostare .s=r

Se è un'istanza YES di Vertex Cover, allora è facile vedere che l'istanza del problema appena costruita è anche un'istanza YES: basta selezionare le etichette corrispondenti ai vertici in qualsiasi soluzione e per ciascun bordo assegnare l'elemento corrispondente qualunque sia stata scelta una delle etichette o (scegliere arbitrariamente se entrambe le etichette sono state scelte). Questa soluzione utilizza sottoinsiemi ed è valida perché le uniche in vigore sono quelle per la corrispondente(G,r)SjvjUvbvcE(b,c)ASbScsaijetichette, che hanno l'effetto (non) di prevenire più diai bordi viene assegnata la stessa etichetta.|E|

Resta da dimostrare che un'istanza YES del problema implica che l'originale è un'istanza YES di Vertex Cover. Questo è leggermente più complicata, poiché una valida soluzione a può in generale assegnare un bordo un non etichetta -corresponding , cioè, , il che significa che non possiamo necessariamente "leggere" una copertura vertice valida da una soluzione valida .X=(A,a,s)(G,r)YX(i,j)Smm{i,j}UY

Tuttavia, l'assegnazione di un'etichetta non corrispondente ha un costo elevato che limita fortemente la struttura della soluzione: ogni volta che un bordo viene assegnato una tale etichetta , con , il fatto che garantisce che debba essere l' unico bordo assegnato a questa etichetta. Quindi, in qualsiasi soluzione contenente un bordo così marcato in modo non corrispondente , potremmo costruire una soluzione alternativa come segue:(i,j)Smm{i,j}a(i,j),m=1Y(i,j)SmY

  1. Scegli arbitrariamente la nuova etichetta affinché sia o .Sz(i,j)SiSj
  2. Assegna questa nuova etichetta. Se ciò si traduce in una soluzione non valida, deve essere perché esattamente un altro bordo , era già stato assegnato all'etichetta . In tal caso, impostare e andare al passaggio 1.(i,j)(i,j)z{i,j}Sz(i,j)=(i,j)

L'algoritmo di cui sopra deve terminare in due modi: viene trovata una nuova etichetta che non introduce alcuna contraddizione oppure viene trovato un ciclo completo di vertici. Nel primo caso, viene trovata una nuova soluzione valida con set di , mentre nel secondo caso viene trovata una nuova soluzione valida con set di ; in entrambi i casi, abbiamo costruito una nuova soluzione valida con almeno un altro bordo assegnato a un'etichetta corrispondente . Dopo aver ripetuto l'intero processo al massimovolte, avremo prodotto una soluzione valida da cui è possibile leggere una soluzione al problema originale di Vertex Cover .Szs1s|E|Y

Questa costruzione è chiaramente un tempo polinomiale, quindi ne consegue che il tuo problema è NP-difficile.


Grazie per l'aiuto. Hai idea di come si possa risolvere (approssimativamente) questo problema? (Come, ad esempio, posso usare le tecniche per il problema della copertura dei vertici per risolverlo?) Ho provato un approccio avido ma, a volte, non riesce a fornire una soluzione fattibile. (Il modo in cui scelgo fa l'approccio avido dove potrebbe esistere una soluzione.)Sj
drzbir

Bene, ci si aspetta che un approccio avido a volte non riesca a produrre una soluzione fattibile, dal momento che se lo facesse sempre, si potrebbe risolvere un problema NP-difficile in poli-tempo ;-) Ricordare che non è necessariamente sbagliato se non può trovare una soluzione: può darsi che non esista una soluzione fattibile.
j_random_hacker

Per quanto riguarda le tecniche di soluzione, quella che mi piace è chiamata ricerca del raggio. Questo è fondamentalmente un tipo di diramazione che "dimentica" soluzioni parziali sufficientemente sbagliate al fine di limitare l'utilizzo della memoria. (Il B&B è di per sé un ottimo approccio, e talvolta risolve rapidamente i problemi, ed è leggermente più semplice della ricerca del raggio, quindi vale la pena provare - ma dato che è un metodo esatto, può ovviamente richiedere millenni in alcuni casi.)
j_random_hacker

(Tutto quanto segue si applica anche alla ricerca del raggio e al B&B). Il B&B è una tecnica molto generale. La cosa fondamentale con esso è sfruttare le specifiche del problema per organizzare le decisioni che prendi in modo che, per quanto possibile, le decisioni sbagliate (cioè le decisioni che non portano a soluzioni realizzabili) vengano prese all'inizio dell'albero di ricerca. (Queste decisioni saranno prese da qualche parte , e ogni livello più profondo che vengono fatte raddoppia il numero di volte che vengono prese.) Per il tuo problema, suggerirei prima di classificare gli elementi in in ordine decrescente di "cattiveria", dove. ..A
j_random_hacker

... la cattiveria di elemento potrebbe essere, ad esempio, il minimo di su tutti , rompendo i legami di seconda minima, quindi terze minimo, ecc grosso modo, l'elemento "peggiore" sarà l'elemento che vincola più severamente qualsiasi set a cui viene aggiunto. Ad ogni nodo alla profondità nella struttura di ricerca, avrai una soluzione parziale in cui i primi (e quindi "peggiori") elementi sono già stati assegnati agli insiemi; dovrai scegliere a quale degli set assegnare il elemento th: cioè, avrai bisogno di un massimo di chiamate ricorsive. ("Fino a" perché si spera che abbiamo, ...iaijjddn(d+1)n
j_random_hacker
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.