Dato un insieme di insiemi, trova gli insiemi più piccoli contenenti almeno un elemento di ciascun insieme


15

Dato un insieme di serie, mi piacerebbe trovare una serie M tale che ogni insieme S a S contiene almeno un elemento di M . Vorrei anche che M contenesse il minor numero possibile di elementi pur rispettando questo criterio, sebbene possa esistere più di una M più piccola con questa proprietà (la soluzione non è necessariamente unica).SMSSMMM

Ad esempio concreto, supponiamo che l'insieme sia l'insieme delle bandiere nazionali, e per ogni bandiera S in S , gli elementi sono i colori usati nella bandiera di quella nazione. Gli Stati Uniti avrebbero S = { r e d , w h i t e , b l u e } e il Marocco avrebbe S = { r e d , g r e e n } . Quindi MSSSS={red,white,blue}S={red,green}Msarebbe un insieme di colori con la proprietà che ogni bandiera nazionale utilizza almeno uno dei colori in . ( I colori olimpici blu, nero, rosso, verde, giallo e bianco sono un esempio di tale M , o almeno lo erano nel 1920.)MM

C'è un nome generale per questo problema? Esiste un algoritmo "migliore" accettato per trovare l'insieme ? (Sono più interessato alla soluzione stessa che all'ottimizzazione del processo per la complessità computazionale.)M


2
Potresti cercare il problema con la copertina ?
Juho,

@Juho Non proprio. Nel mio esempio, il problema della copertina del set sarebbe quello di trovare un set di flag in modo tale che l'unione di tali flag contenga tutti i colori utilizzati su tutti i flag. Al contrario, sto cercando qualcosa che sputi appena fuori un elenco di colori, non un elenco di bandiere, e non ho bisogno che l'insieme contenga tutti i colori possibili. Daremo un'occhiata in quest'area su Wikipedia, penso che tu mi abbia messo sulla strada giusta. Grazie! M
bdesham,

Risposte:


13

Il problema è il noto set di colpire completo problema NP . È strettamente correlato a Set-Cover . La prova della completezza NP si trova nel classico libro di Garey e Johnson .

Se si desidera approssimarlo, è possibile prima tradurre l'istanza in Set-Cover, quindi applicare un algoritmo di approssimazione per Set-Cover. Tuttavia, Set-Cover non può essere approssimato da un fattore costante nel tempo polinomiale, a meno che P = NP come mostrato da Lund e Yannakakis .

Se sei interessato a soluzioni esatte e i tuoi input si comportano bene, ti consiglierei di utilizzare un parametro tracciabile a parametri fissi . Il tempo di esecuzione è qui espresso non solo in termini della lunghezza di input n ma anche in termini di un parametro aggiuntivo k . Se il tempo di esecuzione è O(f(k)nO(1)) , chiamiamo l'algoritmo un algoritmo FPT. Qui, f(k) è una funzione crescente. Quindi se k è costante abbiamo un algoritmo polytime. Il primo capitolo deldi Flum e Grohe , spiega un algoritmo FPT per colpire set (più precisamente per p set di colpire -card). L'algoritmo è facile da implementare e utilizza il metodo degli alberi di ricerca limitati. Tuttavia ha bisogno di molto spazio per spiegare qui, fondamentalmente si suddivide la ricerca necessaria (?) Della forza bruta, in piccoli pezzi (quando k è piccolo).


Grazie. Potete fornire un riferimento da qualche parte da leggere sulle implementazioni effettive? Vale a dire come avrei tradotto il mio problema in un problema di set-cover, e poi come lo avrei risolto?
bdesham,

1
bdesham, pensa a ciascun elemento come all'insieme di insiemi a cui appartiene. eseguire set cover sull'input elements-as-sets. leggi anche la pagina wiki collegata qui.
Sasho Nikolov,

Sei interessato a una soluzione approssimativa o vuoi avere la soluzione esatta?
A. Schulz,

Vorrei una soluzione esatta. I set di dati con cui sto lavorando sono abbastanza piccoli che non penso che dovrebbe essere un problema.
bdesham,

1
@Keyser: hai ragione. Tuttavia, è prassi comune associare il problema decisionale al corrispondente problema di ottimizzazione, poiché riguardano problemi NP-completi strettamente correlati.
A. Schulz,

2

Un'idea che potrebbe aiutare: se l'intersezione di tutti gli insiemi dentro S in non vuoto, quindi puoi scegliere qualsiasi elemento S nell'intersezione e impostare M={S}. Se l'intersezione è vuota, trova un elemento (colore)c la cui occorrenza negli insiemi è massima e sostituisce tutti gli insiemi in cui si verifica dal singleton {c}. Continua fino a quando il conteggio delle occorrenze di ogni elemento è uguale a1 e poi impostare Mall'unione dei set rimanenti. Ad esempio, seS è il set di potenza di alcuni set UN poi M=UN. Potrei sbagliarmi comunque.


2

Dai un'occhiata a "A Theory of Diagnosis from First Principles" di Ray Reiter in cui fornisce un algoritmo per il calcolo dei set di colpi e questa nota aggiuntiva "Una correzione ..." .

L'algoritmo è generalmente noto come algoritmo "hitting set tree", non dovrebbe essere troppo difficile trovare un'implementazione. Hai detto che non eri troppo interessato al runtime, ma ottimizzazioni come la terminazione anticipata delle filiali ecc. Sono piuttosto critiche per l'implementazione e interessanti anche :)


2
Puoi riassumere l'algoritmo per rendere la tua risposta più autonoma? I collegamenti possono e si interromperanno.
Juho,

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.