Dominosa NP-Hard è difficile?


26

Dominosa è un puzzle game relativamente nuovo. Viene riprodotto su una griglia . Prima dell'inizio del gioco, le ossa del domino vengono posizionate sulla griglia (costituendo una piastrellatura perfetta ). Nel passaggio successivo, le ossa del domino sono nascoste, lasciando solo i numeri rivelati. Lo scopo del gioco è recuperare la disposizione originale delle ossa del domino. Puoi giocare qui: http://www.puzzle-dominosa.com/ :(n+1)×(n+2)(0,0),(0,1),,(n,n)

Regole:

Le regole sono semplici Devi trovare la posizione di tutti i domino sulla griglia. Un domino è una coppia di numeri. Puoi avere solo uno per ogni coppia.

Ho alcuni algoritmi polinomiali che risolvono una parte relativamente piccola del puzzle. Potrei anche mostrare che le tipiche griglie Dominosa hanno almeno .2n2+o(n)

Dominosa NP-Hard è difficile?


"Il puzzle può essere facilmente ridotto a un problema SAT o ILP." Per dimostrare la completezza NP, non vorresti il ​​contrario?
Dennis Meng,

1
@DennisMeng Il punto delle riduzioni menzionate nell'interrogazione è stabilire che il problema è in NP. Quindi non resta che dimostrare che NP è difficile. Per inciso, non è necessario uno sconto per vedere che il problema è in NP. La disposizione dei domini è essa stessa un testimone polinomiale della solvibilità.

Suppongo che il problema la cui completezza NP sia in discussione, data la disposizione dei numeri, provenga da una disposizione dei domini. Se il problema è effettivamente mostrare la disposizione dei domino (quando esiste), allora il problema non è un problema decisionale e "NP completo" non ha senso.

@AndreasBlass Uno potrebbe anche considerare il problema più grande: dato un sottoinsieme di elementi dei domini da a , e un grafico con vertici etichettati da a , determina se è possibile coprirlo con i domini dati. Se questo problema si verifica in P, esiste un algoritmo P-time per ripristinare la piastrellatura originale, poiché è possibile provare a rimuovere un bordo e verificare in P-time se è possibile completare la griglia. 1 n G 2 k 1 nk1nG2k1n

1
Secondo un articolo di G. Nordh chiamato NP-completezza delle sequenze generalizzate multi skolem, il seguente problema simile è NP-complete. Istanza: un grafico , una partizione dei bordi in insiemi disgiunti: con tale che nessun bordo con la stessa etichetta condivide un vertice. DOMANDA: Esiste un sottoinsieme con tale che nessun bordo in M ​​condivide un vertice comune e tale che M contiene al massimo un bordo da ciascun ? E 1 , E 2 , . . . , E m , | m | | V | / 2 | E i | 2 , i = 1 , , m M E | M | = | V , ... , mG=(V,E)E1,E2,...,Em,|m||V|/2|Ei|2, i=1,,mMEE i , i = 1|M|=|V|/2Ei, i=1,,m
Yoav bar sinai

Risposte:


9

Nota: questa è una continuazione e revisione dell'altra mia risposta .

Problemi con la riduzione

Ricorda il problema decisionale:

Esiste una piastrellatura perfetta che copre una determinata griglia con tessere uniche?n(n+1)×(n+2)n

Quindi per una griglia , possiamo usare solo variabili.n(n+1)×(n+2)n

Ma:

  • La nostra riduzione richiede molte variabili uniche, molto più di .O(n)
  • Inoltre, i nostri fili sono aperti, il che porta a:
    • Come facciamo a sapere che possiamo affiancare le aree aperte?

Per risolvere il primo problema, ingrandiamo artificialmente il tabellone di gioco molto più grande; essenzialmente facciamo uguale al numero di variabili che effettivamente richiediamo, quindi creiamo una griglia di dimensioni e posizioniamo la nostra griglia nell'angolo in basso a sinistra. Ciò comporterà un esplosione quadratica.( n + 1 ) × ( n + 2 )n(n+1)×(n+2)

Per il secondo problema, dobbiamo ripensare un po 'i nostri gadget.

Può sembrare un po 'scoraggiante dimostrare che possiamo affiancare con successo il resto del tabellone secondo la regola. Quindi iniziamo con la stessa strategia che si userebbe per generare effettivamente schede di gioco di dimensioni :(n+1)×(n+2)

Innanzitutto generiamo un insieme di tutte le tessere possibili. Tutte queste tessere dovranno essere posizionate sul tabellone. Quindi rimuoviamo le tessere e lasciamo i loro quadrati.

Tuttavia, i nostri gadget non garantiscono il posizionamento di un determinato set di tessere; le tessere posizionate dipendono dallo stato. Quindi dobbiamo modificare attentamente i gadget per garantire che vengano rimosse tessere particolari, indipendentemente dallo stato scelto.

Esaminiamo quindi i nostri gadget.

Il filo e la clausola-gate sono problematici per due motivi.

  1. Non sappiamo che i quadrati che circondano un filo o una porta-clausola possano essere piastrellati correttamente; dopo tutto, alcuni fili possono essere spinti a sinistra, altri a destra e piastrellare i restanti quadrati dello spazio bianco diventa non banale. Faremo riferimento a questo problema come al problema "flusso".
  2. Non c'è modo di sapere quali tessere rimuovere dal set di tessere; in uno stato, un insieme di quadrati, nel filo o nella porta della clausola, sarà piastrellato, in un altro stato, verrà piastrellato un insieme completamente diverso di quadrati.

Per risolvere questi problemi:

  • Innanzitutto, generiamo un insieme di tutte le tessere possibili. Tutte queste tessere dovranno essere posizionate sul tabellone; quando li posizioniamo sul tabellone, rimuoveremo la tessera dal set. Sebbene all'inizio potremmo non conoscere , poiché non abbiamo ancora descritto completamente la formulazione, possiamo aggiungere tutte le nuove possibilità di piastrelle man mano che incrementiamo , se necessario. Tutte le tessere che rimuoviamo da questo set devono essere posizionabili (almeno, devono essere garantite se la formula è soddisfacente). Chiamiamo la rimozione di una tessera dal set di tessere, per "scaricare" la tessera dal set di tessere, così come per adempiere al nostro obbligo di posizionarla sul tabellone.nnn
  • Dobbiamo progettare con cura i gadget per garantire che determinate tessere vengano rimosse, indipendentemente dallo stato scelto.
  • Dobbiamo chiudere i nostri gadget, in modo che non spingano le tessere in tutto il tabellone a seconda del loro stato; piuttosto tutti i loro stati devono occupare solo un'area particolare ben definita.
    • In alternativa, tutti i loro stati devono essere garantiti per essere in grado di occupare un'area ben definita; ciò garantisce una piastrellatura soddisfacente, ma non garantisce che si verifichi una piastrellatura particolare. Questo è allo stesso modo in cui viene realizzato un gioco Dominosa:
      • Innanzitutto le tessere vengono generate in un set;
      • Quindi i riquadri vengono posizionati in una configurazione casuale,
      • Quando viene posizionata, ogni tessera viene rimossa dal set di tessere.
      • Quindi le tessere vengono rimosse dal tabellone, lasciando dietro di sé i loro quadrati.
      • Ciò non garantisce che verrà scelta la configurazione prevista,
      • Piuttosto, garantisce che è possibile scegliere la configurazione desiderata e quindi esiste una soluzione. Possiamo fare la stessa cosa qui.
  • Dopo aver posizionato tutti i gadget della formulazione, invece di posizionare quadrati unici per impostazione predefinita, ovvero su tutti gli "spazi bianchi", ci assicuriamo che lo spazio bianco sia un'area rettangolare con una dimensione uniforme o suddividiamo lo spazio bianco in rettangoli con una dimensione uniforme e semplicemente piastrelliamo lo spazio bianco con le tessere rimanenti nel set di tessere.
  • Dopo aver posizionato tutte le tessere dal set, sappiamo che tutto è posizionabile.
    • Alcune tessere saranno ovviamente posizionabili, come quelle nei muri, altre saranno posizionabili solo se la formula è soddisfacente, a causa della natura delle relazioni tra i gadget.
  • Quindi rimuoviamo le tessere e lasciamo i loro quadrati.

Esaminiamo quindi i nostri gadget.

Forzare gadget

Possiamo creare un numero arbitrario di blocchi assicurandoci che non possano essere accoppiati con se stessi.

Ad esempio, supponiamo di voler forzare una tessera , in modo che possiamo usare come elemento costitutivo. (nota, è una variabile arbitraria, che vogliamo forzare come coppia a se stessa, non necessariamente un blocco predefinito poiché abbiamo usato il valore precedenza)1 1 1(1,1)111

Per garantire che le nostre riserve di -building-block , la posizioneremo contro la parete inferiore nella seguente configurazione: posizioneremo il numero riservato, chiamiamolo contro il muro come una virata (a forma di ); contro il muro e uno nella seconda fila nel mezzo. Quindi inseriremo altri due numeri, chiamiamoli e ; questi sono unici per questo gadget. Li posizioniamo in cima a sinistra e a destra .( 1 , 1 ) 1 3 231(1,1)1321 31

Illustrato di seguito, il bordo nero condiviso è il fondo del tabellone, descrizione da sinistra a destra.

  • Configurazione del gadget. Ogni e qui sono unici per questo gadget.323
  • I 3 possibili stati di piastrellatura del centro .1

inserisci qui la descrizione dell'immagine

Dopo aver fatto ciò, possiamo garantire che il nostro gadget può essere piastrellato con un set specifico di tessere, garantendo allo stesso tempo che il nostro gadget deve forzare la coppia .(1,1)

  • Sappiamo che deve verificarsi , poiché tutti e 3 i possibili stati di piastrellatura del medio inferiore , tile come , come illustrato nella figura a destra, sopra.1 ( 1(1,1)1(1,1)
  • Le tessere rimanenti possono essere piastrellate come e , coprendo il gadget. Pertanto, possiamo rimuovere quelle tessere dal nostro set di tessere globale. Di seguito illustrato.( 1 , 3 )(1,2)(1,3)

Descrizione, da sinistra a destra:

  • Sinistra, in alto: stato a sinistra, a sinistra, in basso: una piastrellatura valida dei quadrati rimanenti.
  • Al centro, in alto: stato centrale, al centro, in basso: una piastrellatura valida dei quadrati rimanenti.
  • A destra, in alto: a destra, a destra, in basso: una piastrellatura valida dei quadrati rimanenti.

inserisci qui la descrizione dell'immagine

Nota che la piastrellatura dei quadrati rimanenti non è forzata , poiché possono tessere con i vicini vicini invece di , ma poiché è una piastrellatura valida del tabellone in tutti gli stati , possiamo rimuoverli dal set di tessere e supporre che verranno piastrellati esattamente in questo modo. Poiché sappiamo che esiste una possibile piastrellatura valida, abbiamo almeno una piastrellatura possibile del tabellone, se la formula è soddisfacente. Sebbene non vi sia alcuna garanzia che vengano piastrellate in questo modo, esiste una garanzia che la piastrella verrà forzata.(1(1,1)

Nota: se non sei soddisfatto di questo, o sei confuso dalla differenza di "essere in grado di affiancare" rispetto a "essere costretto a affiancare", puoi semplicemente posizionare un muro attorno al gadget , allo stesso modo creiamo un muro basso per il gadget clausola.3×23×2

Questo gadget non è chiuso, perché non è necessario (ma puoi farlo se lo desideri). Non è necessario, perché ha una configurazione fattibile, che possiamo rimuovere dal set di tessere. Sebbene sia possibile eseguire una configurazione diversa, ciò non influisce sulla soddisfacibilità del problema.

Le seguenti tessere devono essere piastrellate (quindi possono essere rimosse dal set di tessere): (1,1)

Le piastrelle seguenti possono essere piastrellate (quindi possono essere rimosse dal set di piastrelle): (1,2),(1,3)

Se scegli di chiudere questo gadget con un muro, anche sarà garantito per essere coperto.(1,2),(1,3)

Nuove porte Wire e Clause

A causa dei problemi di scorrimento e dello svuotamento del set di piastrelle, dobbiamo ridisegnare un po 'il filo.

Un modo per risolvere il problema del flusso è quello di trasformare il filo in un circuito, anziché semplici stati sinistra-destra; cioè, sarebbe circolare invece di una linea, e quindi se la parte superiore del cerchio viene spinta a destra, la parte inferiore verrà spinta a sinistra. Questo risolve il problema del flusso.

Seguendo questo percorso, possiamo cambiare il gate del cavo e della clausola per risolvere entrambi i problemi.

Prenotazione eFTF

Cerchiamo di introdurre due nuovi valori universali, e . Questi due valori sono universali; valori effettivi nella griglia, come i valori quadrati e (poiché per convenzione, abbiamo riservato come blocco predefinito per i muri), o qualunque cosa tu scelga. Rappresentano rispettivamente vero e falso.FTF3 1231

Riserviamo forzatamente le tessere , , , come segue; illustrazione in basso, descrizione da sinistra a destra:( T , T )(T,F)(T,T)(F,F)

  • Usiamo lo stesso schema di forzare qualsiasi tessera , usando come . Ogni e qui sono unici per questo gadget.T 1 2(1,1)T1323
  • Usiamo lo stesso schema di forzare qualsiasi tessera , usando come Ogni e qui sono unici per questo gadget.F 1 23(1,1)F123
  • Usiamo lo stesso schema del forzare una tessera , usando come al centro e usando nelle altre posizioni dell'up-tack. Ciò forza a tessere. e sono in grado di tessere con , quindi le rimuoviamo dal set di tessere. Ogni e qui sono unici per questo gadget.F 1 T ( F , T ) 23T 23(1,1)F1T(F,T)23T23

inserisci qui la descrizione dell'immagine

Filo

Ogni filo inizierà e finirà con un valore, chiamiamolo , che è unico per il filo. Per ogni clausola a cui partecipa il filo, il filo avrà due valori di filo, e , che sono univoci per ciascun filo e parteciperanno alla stessa clausola. Illustrazione sotto, con descrizione da sinistra a destra.x x Axx

  • Un filo che partecipa a una clausola. Il filo ha un'altezza di e ha una lunghezza di , dove è il numero di clausole a cui partecipa il filo. Il filo è imbottito da due quadrati a sinistra e due a destra. Ovviamente è circondato da un muro su tutti i lati, indicato dal contorno blu. Nota che è unico per questo filo e verrà utilizzato solo nel filo e la clausola a cui partecipa.2 p + 3 p A 22p+3pA1

inserisci qui la descrizione dell'immagine

Di seguito sono illustrati i due stati, descrizioni da sinistra a destra.

  • Un filo che partecipa a una clausola, nel vero stato. Il filo è considerato vero, quando i quadrati sono accoppiati con i quadrati e i quadrati sono accoppiati con i quadrati . È considerato falso nell'altro stato, in cui la piastrellatura è invertita. Nota come viene forzata la piastrellatura una volta selezionata la tessera : sono già forzate in precedenza, quindi il resto delle tessere deve essere orizzontale.T x F A ( TxTxFA(T,F)
  • Lo stesso filo nel falso stato.

inserisci qui la descrizione dell'immagine

Quando partecipano a più clausole, ci sono più valore e , una coppia per ogni clausola a cui partecipa il filo. Si alternano in cima e in fondo, così come il quadrati e matematici che separano ciascuna coppia .x T F x , x xxTFx,x

inserisci qui la descrizione dell'immagine

I due stati corrispondenti.

inserisci qui la descrizione dell'immagine

Questo gadget è chiuso , quindi non esiste un "problema di flusso".

Nota come in entrambi gli stati, raccogliamo le seguenti tessere, indipendentemente dallo stato: , , .( A , T ) ( A , F )(A,A)(A,T)(A,F)

Ci sono comunque alcune tessere di cui non siamo sicuri; in uno stato possiamo rimuovere dal set di tessere, mentre in un altro stato possiamo rimuovere dal set di tessere, quindi quali tessere possiamo effettivamente rimuovere? La risposta è: il gate della clausola ha lo stesso problema, ma con il set di tessere opposto. Raccoglierà sempre le tessere rimanenti, opposte e non raccolte, come vedremo nella prossima sezione. Poiché ciascuno di questi è associato a un gate di clausole, saremo in grado di rimuoverli entrambi.( 1 , F ) , ( 1 , T ) , ( 2 , F(1,T),(1,F),(2,T),(2,F)...(1,F),(1,T),(2,F),(2,T)...

Clausola

Successivamente creeremo la prima iterazione del nuovo gate della clausola. Consiste in un gadget , racchiuso da muri. All'interno del gadget, posizioniamo una in alto al centro e due quadrati matematica negli angoli inferiori; uno in basso a sinistra e uno in basso a destra. I quadrati rimanenti saranno valori che rappresentano le variabili filo di tre fili diversi. Chiamiamoli e . La sarà forzata ad accoppiarsi con una delle variabili wire e le restanti variabili wire si accoppieranno con i valoriIllustrazioni in basso, descrizioni da sinistra a destra.F T a , b , c F2×3FTa,b,cFT

  • A sinistra: la configurazione per la prima iterazione della nuova clausola-gate.
  • Destra I tre possibili stati della piastrellatura .F

inserisci qui la descrizione dell'immagine

Questi tre stati portano a tre possibili massimali. Illustrazione sotto, descrizioni da sinistra a destra.

  • A sinistra, in alto : piastrella a sinistra, a sinistra, in basso: piastrellatura dei quadrati rimanenti.F
  • Al centro, in alto : piastrellato a destra, al centro, in basso: piastrellatura dei quadrati rimanenti.F
  • A destra, in alto : piastrellato in basso, a destra, in basso: piastrellatura dei quadrati rimanenti.F

inserisci qui la descrizione dell'immagine

Poiché la sarà accoppiata con una delle variabili wire nella clausola , quella variabile wire non può più essere accoppiata con nel wire ; forzando così il filo a vero. Al contrario, le rimanenti variabili di filo che si tessono con saranno costrette a tessere con all'interno dei loro fili. Sono esattamente gli stessi vincoli di una clausola .F T F 1 -in- 3 - S A TFF TF1-in-3-SAT

Nota, e sono variabili variabili, ma ciascuna potrebbe riferirsi a un o un variabile filo; l'utilizzo di una sta essenzialmente negando la variabile filo.c x x x a,b,cxxx

Un'aggiunta: per adempiere all'obbligo di sapere quali tessere possono essere rimosse dal set di tessere, dobbiamo "raddoppiare e contrapporre" la clausola. Ciò che intendo con questo è creare un altro gadget , con variabili aggiuntive che rappresentano le negazioni di e . Chiamiamoli e . Questi devono essere i valori di filo variabile negati di e . Questo gadget è diverso, in quanto avrà una al centro e due3 a , b , c a , b , c a , b , c3×23a,b,ca,b,ca,b, 3 × 2 T F ( T , x ) , ( T , x ) , ( F ,c3×2TF valori agli angoli; esattamente l'opposto del gadget della clausola descritto finora. "Raddoppiando" la clausola in questo modo, aggiungiamo nuovamente gli stessi vincoli del gadget sopra descritto. Tuttavia, scarichiamo anche tutte le combinazioni di dal set di tessere, per ogni variabile (e quindi per e , perché dopo tutto sono variabili wire). Di seguito, descrizioni da sinistra a destra. a , b , c (T,x),(T,x),(F,x),(F,x)a,b,c

  • Una clausola "doppia e contrapposta". La sezione inferiore è la clausola sopra descritta; la sezione superiore è la clausola contrapositiva appena descritta. La nuova clausola ha esattamente gli stessi vincoli logici; è il contrappunto della clausola inferiore. Insieme, questi gadget combinati e il filo scaricano tutte le combinazioni di dal set di tessere, per ogni variabile filo che partecipa alla clausola.(T,x),(F,x),(T,x),(F,x)
  • La linea blu al centro della figura più a sinistra è lì per facilità di visione; in realtà può essere rimosso senza consentire altri stati.

inserisci qui la descrizione dell'immagine

Quindi, facciamo un esempio, per mostrare che tutte le tessere vengono scaricate come promesso. Di seguito, descrizione da sinistra a destra.

  • Figura di un filo che partecipa a una singola clausola; viene scelto uno stato per la clausola. Qui stiamo usando , mentre e rappresentano altri valori-filo in questa clausola.a 1=bab
  • Per lo stato determinato nella clausola, il valore è costretto ad essere accoppiato con la vicina .T1T
  • Questo fa sì che il filo sia forzato ad essere valutato in modo vero (si può dire come la variabile positiva del filo sia forzata ad accoppiarsi con la , e la variabile negativa sia forzata ad accoppiarsi con la , come spiegato sopra ).TF
  • Questo impone nella clausola contrapositiva (la sezione superiore della clausola) di essere accoppiata con all'interno della clausola. Ora, se guardi il filo, ogni tessera all'interno del filo è garantita per essere scaricata: o scaricata nel filo stesso o nel corrispondente gadget-clausola. In questo stato, abbiamo le tessere, , , , , , e .T ( A , A )(1T(A,A)( A , F ) ( 1 (A,T)(A,F)( 1 , F ) ( 1 , F ) ( 1 , T(1,T)(1,F)(1,F)(1,T)

inserisci qui la descrizione dell'immagine

Provando l'altro stato, otteniamo l'illustrazione seguente, descrizione da sinistra a destra.

  • La clausola si trova nell'altro stato, piastrellando in uno dei due modi.(1,T
  • Pertanto, è forzato sul filo,(1,F
  • Condurre il resto del filo a tessere corrispondentemente e valutare il filo come falso.
  • Infine, nella sezione contrapposta / superiore del gadget-clausola, deve affiancare, perché è preso nella filo. In questo stato, abbiamo le tessere, , , , , , e . Queste sono le stesse tessere scaricate dell'altro stato .( 1 , T ) ( A , A ) ( A , T ) ( A (1,F)(1,T)(A,A)(A,T)( 1 , T ) ( 1 ,(A,F)(1,T)( 1 , F ) ( 1 , T )(1,F)(1,F)(1,T)

inserisci qui la descrizione dell'immagine

Quindi in entrambi gli stati, scarichiamo le stesse tessere. Pertanto, il filo e la clausola scaricano insieme con successo piastrelle specifiche se esiste un compito soddisfacente.

Questo gadget è chiuso , quindi non ci saranno problemi di flusso. Il gadget-clausola insieme al gadget di filo garantisce sempre di scaricare gli stessi valori di coppie di tessere , e quindi possiamo scaricarli anche se non sappiamo in che modo affiancherà.

Ora tutti i nostri gadget soddisfano i criteri.

Formulazione

Nella nostra formulazione finale, creiamo tre file di gadget, ciascuna separata da una parete orizzontale.

  • Sul fondo, posizioniamo i gadget forzanti, che sono alti due tessere. Abbiamo bisogno di un gadget per forzare il blocco di costruzione, e per le combinazioni di e . Posizioniamo i gadget forzanti direttamente uno accanto all'altro.FTF
  • Nella riga centrale, posizioniamo i gadget di filo, orizzontalmente, che sono alti due tessere. I gadget di filo devono essere separati l'uno dall'altro con una parete verticale.
  • Nella riga superiore posizioniamo i gadget della clausola, che sono alti quattro caselle. I gadget della clausola devono essere separati l'uno dall'altro da un muro verticale.

Seguono illustrazioni, descrizioni sopra ogni figura. Fai clic sulle immagini per la risoluzione massima. Il codice sorgente per riprodurre / generare le immagini è elencato nella parte inferiore della pagina.

Usando la formula come esempio, abbiamo un soddisfacente soluzione come testimone.( ¬ x 1 , x 2 , x 3 , ¬ x 4 )Φ(x)=(x1,¬x2,x3)(x2,¬x3,x4)(x1,x2,¬x4)(¬x1,x2,x3,¬x4)

Innanzitutto iniziamo con le pareti orizzontali che separano le file di gadget. Mostriamo i quadrati e le coppie che sono costrette a tessere all'interno delle pareti.

inserisci qui la descrizione dell'immagine

Successivamente, mostriamo i gadget. Il contorno blu rappresenta i bordi dei gadget; tratteggiato in blu per i forzanti-gadget, poiché non saranno circondati da muri. Nota che la linea al centro del gadget della clausola non è circondata da un muro; è lì per facilità di visione; l'eliminazione della linea non consente ulteriori stati nella clausola, come spiegato sopra, ma mostriamo la linea blu per questa dimostrazione. Nota: che usiamo i nomi quadrati per dare ai numeri una leggibilità semantica, quando applicabile. Ogni nome rappresenta un valore numerico.

inserisci qui la descrizione dell'immagine

Qui riempiamo le pareti verticali.

inserisci qui la descrizione dell'immagine

Qui compiliamo la soluzione del testimone; cioè questa è la soluzione di piastrellatura se si utilizza la soluzione SAT per generarla.

inserisci qui la descrizione dell'immagine

Successivamente affianchiamo l'area di riempimento; il resto del tabellone, grande quanto necessario, per quanto sia necessario per tessere finora. Quindi scarichiamo le coppie rimanenti nel set di tessere. Le linee tratteggiate qui rappresentano una piastrellatura valida ma non forzata; potrebbe esserci un altro modo di affiancarli. Qui mostriamo l'angolo in basso a sinistra.n

inserisci qui la descrizione dell'immagine

Qui riempiamo i quadrati rimanenti con una piastrellatura banale valida.

inserisci qui la descrizione dell'immagine

Qui mostriamo l'angolo in basso a destra della griglia.

inserisci qui la descrizione dell'immagine

Qui mostriamo l'angolo in alto a destra della griglia. Nota come le tessere verticali non si adattano più; quindi, se necessario, affianchiamo la fila superiore in orizzontale.

inserisci qui la descrizione dell'immagine

E infine l'angolo in alto a sinistra.

inserisci qui la descrizione dell'immagine

La generazione dell'intera scheda di gioco in una sola volta tramite TeX non riesce con errori di memoria esaurita da pdflatex, quindi se vuoi vederlo, dovresti generare clip e correggerle insieme. Assicurati di controllare il visualizzatore di notebook .


Fonti TikZ

Generatore di giochi:

  • graphtex.py

    Converte TeX in svg, usando pdflatex, pdfcairo (poppler) e rsvg-convert (libsvg)

  • dominosa.py

    Contiene la logica di conversione, la verifica della soluzione di gioco e la logica di disegno

  • dominosa_demo.py

    Una demo eseguibile che genera le immagini utilizzate nella risposta sopra. Scarica le immagini nella directory corrente-lavoro.

  • dominosa_demo.ipynb

    Una demo di ipython che genera le immagini utilizzate nella risposta sopra.


1
Questo è spettacolare, grazie mille ..
Yoav bar sinai,

2
Per favore, dimmi che hai una versione di arXiv. Si può essere più ragionevole per questa piattaforma per includere uno schizzo e il link al documento completo.
Raffaello

22

DOMINOSA è NP-difficile


Giocare è un problema di ottimizzazione; trovare una piastrellatura domino valida in modo tale da coprire tutti i quadrati. La versione decisionale di questo problema è:

Esiste una piastrellatura perfetta che copre una determinata griglia con tessere uniche?n(n+1)×(n+2)n

Ovviamente, il problema dell'ottimizzazione, il problema di trovare effettivamente una soluzione al gioco è almeno altrettanto difficile o più difficile del problema decisionale.

Convertiremo una formula in una griglia corrispondente, che sarà percorribile solo in caso di assegnazione soddisfacente alla formula. Inoltre, la copertura può effettivamente essere utilizzata per recuperare l'incarico soddisfacente.1-3-in-SAT

Pertanto, se la costruzione presentata è corretta e si potrebbe risolvere un gioco in tempo polinomiale su un DTM , ciò implicherebbe . Ciò implica che è NP-difficile.P=NPDOMINOSA

Riduzione da a1-3-in-SATDOMINOSA

introduzione

La maggior parte dei problemi / varianti hanno una corrispondenza abbastanza buona con . Può essere importante pensare ai problemi in parallelo; poiché sono correlati tra loro, quasi tutto in un problema può essere correlato nell'altro.3-SATCIRCUITSAT

CIRCUITSAT ha una variante planare, alla quale si riduce, chiamata . Questa conversione è molto elegante e sostanzialmente ti consente di prendere qualsiasi incorporamento planare, trovare i rimanenti fili di attraversamento e utilizzare un "gadget" per far passare i fili attraverso un "gate" planare (raccolta di gadget, con fili di ingresso e uscita) .PLANAR-CIRCUITSAT

Convenientemente, la maggior parte delle varianti hanno anche riduzioni alle varianti planari, che parallelamente e sono molto correlati; facilmente riducibile l'uno dall'altro e facile da ragionare. Quindi ogni volta che arrivo a un problema planare che potrebbe essere NP-difficile, penso in termini di varianti planari di e dei loro parallelismi in .3-SATPLANAR-CIRCUITSAT3-SATPLANAR-CIRCUITSAT

Le varianti planari sono importanti da sapere, perché aiutano a ridurre i problemi planari / geometrici, come il TSP euclideo (per inciso una riduzione piuttosto rara da trovare e imparare). Pertanto, vi è e un parallelo, , per agevolare tali riduzioni.PLANAR-3-SATPLANAR-CIRCUITSAT

Altre sono importanti da sapere perché alcune sono più deboli; cioè, apparentemente "più facile", eppure NP-completo. Essi sembrano più facile da risolvere a prima vista - e sono molto più semplici - ma sono ancora NP-completo. NP-completo, ma più semplice; e quindi più facile fare riduzioni, in molti casi.3-SAT

Ad esempio, esiste . Per alcuni problemi, puoi facilmente creare un gadget esattamente , realizzando "almeno 1 su 3", come lo standard usi, sarebbe non ovvio e renderebbe enormi costruzioni.1-in-3-SAT1-in-33-SAT

Un altro esempio è . Il monotono rende le cose molto più semplici quando hai una costruzione che non può facilmente negare i valori.MONOTONE-1-in-3-SAT

Ancora più sorprendente è che ha una variante planare: ! Quindi questo rende le cose molto più facili; non devi attraversare "fili" (ricorda, ci sono parallelismi in a questi), e fidati di me, mentre attraversare i gadget è divertente da fare, loro tendono ad essere molto ovvi e difficili. P L A N A R - M O N O T O N EMONOTONE-1-in-3-SATPLANAR-MONOTONE-1-in-3-SATCIRCUITSAT

PROBLEMMONOTONEPLANAR1-in-3NP-hard3-SATNoNoNoYesMONOTONE-3-SATYesNoNoNo1PLANAR-3-SATNoYesNoYes21-in-3-SATNoNoYesYes3PLANAR1-in-3-SATNoYesYesYes4MONOTONE-1-in-3-SATYesNoYesYes5PLANAR-MONOTONE-3-SATYesYesNoYes!6PLANAR-MONOTONE-1-in-3-SATYesYesYesYes7
  1. Pura eliminazione letterale
  2. Teorema della dicotomia di Schaefer
  3. Il problema dei rappresentanti compatibili
  4. La triangolazione del peso minimo è NP-Hard
  5. Teorema della dicotomia di Schaefer
  6. Trovare partizioni automatiche perfette è NP-difficile
  7. Partizioni ottimali di spazio binario nel piano

Un modo per iniziare con una riduzione è quello di cercare "gadget" che assomiglino ai fili e un gadget che assomigli a una clausola di una delle varianti . Come bonus, molte delle varianti sono planari, probabilmente possiamo scappare senza attraversare i fili.3-SAT

Che cos'è un "gadget"? Un gadget è una costruzione del problema, che è utile come blocco per costruire cancelli / fili / clausole. Alcuni gadget avranno un set limitato di stati; ad esempio, un gadget con due stati può essere utilizzato come variabile; uno stato è "vero" e l'altro è "falso". Un gadget con due stati, che può essere "lungo", può essere piegato e diviso, è utile come filo - se può interagire con una variabile e diventare vincolato per estendere lo stato della variabile in un'altra posizione. Un gadget con esattamente tre stati può forse essere usato come una clausola; se può essere usato per vincolare "uno dei tre" fili attraverso ciascuno dei suoi tre stati. Allo stesso modo, si potrebbero desiderare tutti i tipi di porte logiche, come un non-gadget, un or-gadget, un xor-gadget ecc;

Un blocco predefinito

  • Innanzitutto, riserviamo un numero, ad esempio, , alla lavagna. Faremo di un blocco per tutto il resto.11
  • Useremo un angolo per assicurarci che non possa mai connettersi ad un altro , tranne che in questo angolo, dove deve.11
  • Sotto (nelle tre figure) c'è l'angolo, e come posizioniamo il s lì.1
  • Useremo la per indicare valori univoci in tutta la griglia, in tutti i diagrammi.
  • In effetti, copriremo la nostra griglia con valori prima di sovrapporli con valori importanti; pertanto, per impostazione predefinita copri tutto con i valori .

inserisci qui la descrizione dell'immagine

Come puoi vedere, posizionando i s la coppia deve essere utilizzata in questa configurazione; deve usare una delle piastrelle tratteggiate. Ora non può mai accadere altrove nel board, che è ciò di cui abbiamo bisogno.1 ( 1 , 1 ) ( 1 , 1 )3   1(1,1) (1,1)

Ci sono modi alternativi di riservare un numero, o contro il muro con di essi, o nel mezzo del nulla, con di loro in una croce. Va bene comunque, fintanto che è forzato.5 ( 1 , 1 )45(1,1)

Un muro

Ora, sarebbe molto utile essere in grado di realizzare "pareti" e "angoli" in tutto il luogo, non solo ai lati della griglia. Guarda cosa succede se allineiamo coppie di una in una linea; quelli non hanno altra scelta che accoppiarsi con i loro vicini, creando un "muro" di larghezza .4

Immagini in basso, da sinistra a destra:

  1. Una linea di coppie di s.1
  2. L'unica piastrellatura possibile di quella -square.1
  3. L'unica piastrellatura possibile di (quasi) tutti i s nella linea.1
  4. La linea del muro, disegnata per enfasi.

inserisci qui la descrizione dell'immagine

Un tentativo iniziale di un filo

Ora, posizionando due "muri" uno di fronte all'altro e lasciando uno spazio di tra i muri, forse possiamo trovare un gadget simile a un "filo".1

Mostrando solo i bordi del muro, questo è ciò che otteniamo nelle figure seguenti (da sinistra a destra):

  • Posizionare due pareti una di fronte all'altra.
  • Inserire numeri univoci all'interno.
  • A destra due: due possibili stati del filo.

inserisci qui la descrizione dell'immagine

Come funziona:

Non ci possono essere fori nel tubo / filo, quindi, se le piastrelle vengono spostate verso l'alto, allora tutti devono essere spostati verso l'alto, lungo il tubo; se vengono spostati verso il basso, li "risucchia" tutti. Pertanto, possiamo inviare un "segnale" da un lato del filo all'altro; in altre parole, propagare un valore.

Quindi, ora possiamo propagare un valore su lunghe distanze!

Le restanti limitazioni sono:

  • Non possiamo piegare un filo,
  • Non possiamo dividere un filo,
  • Non possiamo attraversare i fili,
  • Potremmo avere fastidiosi problemi di layout perché dobbiamo stare attenti alla parità della lunghezza del filo.

Piegare un filo , parte 1: parete sotto

Il prossimo problema è che dobbiamo essere in grado di piegare un filo, non solo di andare dritto ...

Così. Spezzeremo la parte flettente in due parti; la parte superiore e la parte inferiore. Prima la parte inferiore. Ignora la parte superiore della curva, lo faremo più tardi.

Le figure seguenti mostrano un po 'di problemi con la flessione; la parte superiore del filo è "allentata", sembra difficile realizzare un muro che gira di 90 gradi.

Da sinistra a destra:

  • La parte superiore di un filo è "allentata".
  • Cosa succede se proviamo a piegarlo; vogliamo cablare per essere tra le linee blu. Ancora una volta, Ignora la parte superiore della curva, lo faremo più tardi.
  • 1

inserisci qui la descrizione dell'immagine

Una soluzione è la seguente:

  • (x,1)xqx1111

Illustrazione sotto, descrizione da sinistra a destra:

  • La situazione con il problema.
  • q1
  • 1

inserisci qui la descrizione dell'immagine

qq

Da sinistra a destra:

  • L'attuale costruzione.
  • q

inserisci qui la descrizione dell'immagine

11

(r,1)r1

Illustrazione in basso, da sinistra a destra:

  • La nostra attuale costruzione.
  • 1
  • r1

inserisci qui la descrizione dell'immagine

E finalmente otteniamo la nostra curva inferiore. Illustrazione sotto, descrizioni, da sinistra a destra:

  • A sinistra: la nostra costruzione finale per una curva.
  • Destra: come continuare il filo a sinistra.

inserisci qui la descrizione dell'immagine

Piegare un filo , parte 2: muro sopra

Le pareti per rendere l'angolo superiore della curva sono molto più semplici. Allinea semplicemente una parete verticale con una parete orizzontale. Illustrazione sotto, descrizione da sinistra a destra:

  • La piega del filo che vogliamo fare.
  • Posizionare la sezione verticale dei quadrati delle pareti verso il basso.
  • Piastrellatura dei quadrati della parete verticale.
  • Posizionamento e piastrellatura della parete orizzontale; può incontrare la parete verticale e formare un angolo.

inserisci qui la descrizione dell'immagine

Ora dovresti essere convinto che possiamo posizionare e piegare i fili. Tuttavia, non possiamo ancora dividere o attraversare i fili, ne parleremo più avanti.

Le restanti limitazioni sono:

  • Non possiamo piegare un filo,
  • Non possiamo dividere un filo,
  • Non possiamo attraversare i fili,
  • Potremmo avere fastidiosi problemi di layout perché dobbiamo stare attenti alla parità della lunghezza del filo.

Un filo prezioso

7TFTFquadrato che li separa. Di seguito, descrizione da sinistra a destra:

  • Sinistra: un filo.
  • A destra: la configurazione quadrata.

inserisci qui la descrizione dell'immagine

TF

  • Sinistra, destra: i due stati del filo valutato ;
  • T
  • F

inserisci qui la descrizione dell'immagine

3-SAT

Le restanti limitazioni sono:

  • Non possiamo dividere un filo,
  • Non possiamo attraversare i fili,
  • Potremmo avere fastidiosi problemi di layout perché dobbiamo stare attenti alla parità della lunghezza del filo.

Non-gate

Un non-gate non è necessario in quanto è implicito: semplicemente usando una lunghezza del filo off-by-one possiamo negare il valore del filo.

A Clause Gate

3

Illustrazioni sotto, descrizioni da sinistra a destra:

  • La disposizione dei fili del gadget clausola. Fa un segno "più"; l'unione di 3 fili in un punto.
  • 1-in-3-SAT

inserisci qui la descrizione dell'immagine

Ora diamo un'occhiata ai diversi stati. Illustrazione sotto, descrizione da sinistra a destra:

  • Il filo sinistro viene tirato al centro; gli altri due vengono espulsi.
  • Il filo inferiore viene tirato al centro; gli altri due vengono espulsi.
  • Il filo in basso a destra viene tirato al centro; gli altri due vengono espulsi.

inserisci qui la descrizione dell'immagine

31-in-3

Le restanti limitazioni sono:

  • Non possiamo dividere un filo,
  • Non possiamo attraversare i fili,
  • Potremmo avere fastidiosi problemi di layout perché dobbiamo stare attenti alla parità della lunghezza del filo.

Dividere un filo

TTTT1T2a,b,ca,b,cTa,b,c

Illustrazione sotto, descrizione da sinistra a destra:

  • Disposizione dei fili. Notare che le pareti sono un po 'spesse, quindi i fili sono ravvicinati a scopo illustrativo; in realtà, sono un po 'più distanti.
  • Ta,b,c

inserisci qui la descrizione dell'immagine

a,ba,ba,b

  • Esempio di stato del filo sinistro, valutato come vero.
  • Cattivo stato del secondo filo; cerca di essere valutato diversamente, ma poi ottiene una coppia duplicata.
  • Buono stato del secondo filo, ora hanno lo stesso valore e non ci sono coppie duplicate.

inserisci qui la descrizione dell'immagine

a,b,c

Le restanti limitazioni sono:

  • Non possiamo dividere un filo,
  • Non possiamo attraversare i fili,
  • Potremmo avere fastidiosi problemi di layout perché dobbiamo stare attenti alla parità della lunghezza del filo.

Un filo cordless!

Bene, con mia grande gioia, dividere un filo si è rivelato senza fili! Cioè, nelle illustrazioni sopra, poso i fili uno accanto all'altro, ma non c'è motivo di farlo! Possiamo posizionare i fili in qualsiasi punto della griglia e sarebbero ancora "impigliati" per così dire. Questo ci fa risparmiare un sacco di problemi:

  • 3-SAT
  • Dobbiamo fare qualsiasi layout fastidioso, portare i fili nelle loro posizioni, è facile! Come un telefono cordless! La libertà!
  • Non dobbiamo preoccuparci della parità della lunghezza del filo / layout off-by-one.
  • Possiamo fare una riduzione abbastanza ridotta; le variabili avranno ciascuna un singolo set di lunghe strisce di filo, con molte connessioni cordless lungo i fili. Queste connessioni saranno alle porte delle clausole, che risiederanno nella propria posizione sulla griglia. La clausola ora consisterà solo nel gadget della clausola e tre fili cordless che fuoriescono da esso.

Le restanti limitazioni sono:

  • Non possiamo attraversare i fili,
  • Potremmo avere fastidiosi problemi di layout perché dobbiamo stare attenti alla parità della lunghezza del filo.

La riduzione, primo tentativo

Φ(x)=iCi1-in-3-SAT

  • xjx
  • CiΦ(x)
  • xjCi3a,b,c

Come potrebbe essere:

  • a,b,c

inserisci qui la descrizione dell'immagine

Ed ecco come potrebbe apparire la griglia:

  • Figura: il tabellone di gioco risultante. Le variabili sono allineate in file sul fondo. Le clausole sono sparse in alto. Questo layout fornisce un ingrandimento quadratico; un layout più intelligente può evitare l'esplosione quadratica.

inserisci qui la descrizione dell'immagine

Dettagli dell'ultimo minuto

Ricorda il problema decisionale:

(n+1)×(n+2)n

(n+1)×(n+2)nO(n)

  • O(|x|×|Φ(x)|)O(n)n
  • 1O(n)

Fonti grafiche


[ai,bi]ai,bi=1..n

Sposterò tutti questi commenti nella mia risposta e li renderò più completi nella mia prossima grande revisione.
Realz Slaw,

ok, lo aspetterò!
Vor,

@RealzSlaw, grazie mille! Non ho ancora avuto il tempo di leggere questo, ma sembra molto bello.
Yoav bar sinai,

@RealzSlaw, c'è un modo per contattarti direttamente?
Yoav bar sinai,
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.