Come minimizzare la cardinalità di un insieme e dividere le partizioni soggette a vincoli nel tempo polinomiale?


8

Il vero problema che sto affrontando è il seguente.

ISTANZA : ho i set e K: = \ {1, \ ldots, k \} e la matrice a_ {ij}> 0 per tutti i \ in K e j \ in N .N:={1,,n}K:={1,,k}aij>0iKjN

DOMANDA : Devo trovare un sottoinsieme S di N di dimensioni il più piccolo possibile e suddividere il set K in |S|disjoint imposta Kj cui unione è uguale a K tale che per tutti jS , ho

jSjjaijaij1,
per tutti iKj .

Esempio:

Dato n=k=3 e la matrice

[0.62.71.21.32.60.81.50.40.6].

In questo esempio, S dovrebbe essere uguale a S={1,2} e K1={3} e K2={1,2} .

Ho notato due fatti:

  • Se esiste qualche jN tale che aij1 per tutti iK allora S={j} e Kj=K ; e
  • Se esiste qualche iK tale che aij<1 allora S= .

La mia domanda : è possibile risolvere questo problema di ottimizzazione in tempi polinomiali (almeno con l'algoritmo di approssimazione)?

La prima cosa che ho provato a fare è trasformarlo in un problema noto e quindi applicare un algoritmo noto per quello. Ho pensato di trasformarlo in un set di copertura o in un contenitore per rifiuti ma non ci sono riuscito e inoltre non penso che questo sia interessante.


Il problema che ho provato a formulare.

Ho insiemi e e matrice per tutti e . Inoltre, ho insiemi di disgiunti per ogni (ho aggiunto come input perché non avrei potuto formularlo altrimenti).N:={1,,n}K:={1,,k}aij>0iKjNnKjKjNKj

Alla fine, ottengo questo:

minimizeS|S|subject tojSjjaijaij1,jS,iKj,SN.

Grazie.


Hai provato a riformulare come ILP usando le variabili binarie ? Il tuo obiettivo cambia in min con una modifica simile al vincolo. Un risolutore ILP standardizzato può gestirlo bene. xjxj
Nicholas Mancuso,

Ma penso che non mi darebbe un algoritmo temporale polinomiale?
drzbir,

Forse in teoria, ma non in pratica. I solutori moderni come CPLEX sono incredibilmente bravi a trovare soluzioni ottimali in un tempo relativamente breve grazie a diramazioni, limiti e altre euristiche.
Nicholas Mancuso,

Sono il tutti ? Se è così, allora penso che la formulazione del tuo "vero problema" abbia un problema, poiché è banalmente ottimizzata lasciando che sia qualsiasi insieme singleton : facendo questo fa sì che la somma sull'LHS della tua funzione obiettiva sia 0 .aij1S{j}
j_random_hacker

Non tutti sono maggiori di . aij1
drzbir,

Risposte:


4

Anche la versione decisionale di questo problema, in cui proviamo a determinare semplicemente se esiste una soluzione praticabile, è NP-difficile per riduzione da Exact Cover . (La versione di ottimizzazione, in cui cerchiamo una soluzione fattibile che minimizzi , è chiaramente almeno così difficile.)|S|

La matrice a riga singola, a colonna singola contenente il valore 0,5 è un esempio di input per il quale non esiste una soluzione fattibile. Eccone un altro:

[0.243.1350.6].

Creazione di un gadget "Scegli al massimo uno"

Innanzitutto, nota che se il valore massimo in qualche riga è e questa riga contiene (almeno) due copie di , dì a a e , , quindi non può contenere sia che , poiché in tal caso deve sorgere uno dei due seguenti casi, ciascuno dei quali porta a una contraddizione:aix>0xaijaijjjSjj

  1. iKjKj : supponiamo che nel blog . Ma poi , contraddicendo il requisito che .iKjΣmS,mjaimaij=x=aijΣmS,mjaimaij1
  2. iKjKj : Supponi quindi . Ma poi , e poiché è massimo nella riga , il più alto che potrebbe essere chiaramente , quindi dobbiamo violare la stessa disuguaglianza di prima.iKp,p{j,j}ΣmS,mpaimaij+aij=2xxiaipx

Così siamo in grado di scegliere un certo valore massimo che è in sicurezza superiore alla somma di tutti i valori massimi non in prima fila, e utilizzare copie di questo valore massimo per imporre che al massimo una di quelle colonne è incluso nel .S

Possiamo trasformare questo vincolo "scegli al massimo uno" in un vincolo "scegli esattamente uno" utilizzando qualsiasi valore positivo inferiore a 1 come valore "non massimo". Questo perché ogni riga appartiene a una parte della partizione di riga e se allora l'RHS della disuguaglianza diventa negativa per la riga , quindi non c'è modo di soddisfarla: quindi almeno un deve essere forzato in in modo tale che .iKjaij<1ijSaij1

Quindi, per garantire che esattamente una delle colonne in alcuni insiemi sia forzata in , creare una riga come segue:TNSai

  • Set per ogni .aij=n+1jT
  • Impostare per ogni altro .aij=0.5j

Quindi la riduzione da Exact Cover è semplice: c'è una riga per ogni elemento, una colonna per ogni set, con ogni volta che set include l'elemento e altrimenti. Entrambe le direzioni ("L'istanza di input EC è un'istanza YES un'istanza costruita del problema di OP è un'istanza YES", e "L'istanza costruita del problema OP è un'istanza YES l'istanza di input EC è un'istanza YES") sono chiari.aij=n+1jiaij=0.5


L' esempio hai dato credo abbia una soluzione di . 2×2S={2}
drzbir,

Ho e . Quindi la mia disuguaglianza è per . Perché la disuguaglianza deve essere valida per tutti . S={2}K2=K={1,2}0ai21iK2={1,2}iKj
drzbir,

Hai ragione, scusa. Lo riparerò ora.
j_random_hacker,

Ho scritto questo problema come programma intero e l'ho risolto. Ora, ho bisogno di risolverlo con un algoritmo avido (meglio, un algoritmo con garanzie di prestazioni). Come hai suggerito, ho cercato l'esatta copertura della copertina per trovare idee su come progettare un buon algoritmo per questo. Hai qualche idea?
drzbir,

È NP-difficile, quindi quasi sicuramente non esiste un algoritmo poly-time. Proverei a controllare tutte le singole colonne, tutte le coppie di colonne, tutte le triple ecc. Fino a trovare un set soddisfacente. Il sottoproblema che devi risolvere per ogni riga (vale a dire, decidere quale elemento in scegliere per questa riga) è facile. S
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.