Flying memes

Le otto regine e ruby-dlx

Il problema delle otto regine rientra a far parte di quell’insieme di sfide che da molti anni interessano ed incuriosiscono matematici ed appassionati (questo problema è stato proposto nel 1848).

Cercando di applicare la tecnica dei Dancing Links su questo problema mi sono accorto di un piccolo, ma non banale dettaglio: ‘il problema delle otto regine non rientra nella categoria ‘Exact Cover Problems”, e quindi non può, almeno nella sua forma nativa, essere risolto usando il famoso algoritmo di Knuth.

Gli ‘Exact Cover Problems’ sono definiti da una proprietà che gli accumuna, che è la seguente:

Dato un set X e una collezione S di sotto-set di X un ‘exact cover’ S* è una sotto-collezione di S tale che ogni elemento di X è contenuto in esattamente un set di S*

Tale proprietà è resa magistralmente da questa immagine su wikipedia e può essere riassunta nel seguente modo:

Esprimendo il problema in termini di vincoli deve essere sempre possibile ricavare una e una sola soluzione per ogni ‘elemento’ dei vincoli imposti.

Nel caso delle otto regine questa proprietà non si verifica; prendiamo ad esempio la definizione del vincolo ‘non possono esserci due regine sulla stessa diagonale’. In un ‘exact cover problem’ questo significherebbe che per ogni diagonale esiste una e una sola regina mentre nella realtà solo 16 delle diagonali (su 30) conterranno una regina.

Come ovviare a questo problema ?

La soluzione è guardare le variabili in gioco non nei termini di ‘regine’ ma in termini di coordinate x e y; in quest’ottica le costrizioni diventano le seguenti (dove E11 sta per elemento in riga 1, colonna 1):


-- RIGHE 1-8 --
R1 : { E11 E12 E13 E14 ... E18 }
R2 : { E21 E22 ... E28 }
...
R8 : { E81 E82 ... E88 }

-- COLONNE 1-8 --
C1 : { E11 E21 E31 ... E81 }
C2 : { E12 E22 E32 ... E82 }
...
C8 : { E18 E28 E38 ... E88 }

-- DIAGONALI 1-28 (prima / e poi \ escludendo quelle con 1 solo elemento ) --
D1  : { E21 E12 }
D2  : { E31 E22 E13 }
D3  : { E41 E32 E23 E14 }
...
D30: { E17 E28 }

La prossima settimana implementeremo questa matrice di costrizione all’interno di ruby-dlx

Tags: , ,