Recentemente ho giocato alla nuova release di The Logical Journey of the Zoombinis e ho cercato di implementare alcuni algoritmi informatici in grado di risolvere i vari enigmi. Sono bloccato su come affrontare il puzzle del traghetto del Capitano Cajun.
Per quelli che non hanno familiarità, uno Zoombini è una creatura con 4 attributi: capelli, occhi, naso e piedi. Ognuno di questi attributi ha 5 possibili valori; per esempio, i piedi di uno Zoombini possono essere ruote, pattini a rotelle, scarpe da ginnastica, una molla o un'elica. Ecco un esempio di Zoombini con capelli disordinati, occhiali, naso verde e scarpe da ginnastica:
Nel puzzle del traghetto, il compito è quello di organizzare una raccolta di 16 Zoombinis sui 16 posti di un traghetto. L'accordo deve obbedire alla regola secondo la quale due posti vicini ortogonalmente devono essere occupati da Zoombinis che condividono almeno una caratteristica. Se due Zoombinis hanno capelli diversi, occhi diversi, nasi diversi e piedi diversi l'uno dall'altro, potrebbero non sedersi uno accanto all'altro.
La disposizione dei posti cambia di livello; per concretezza, concentriamoci sul livello "Molto difficile", in cui i 16 posti sono disposti in una griglia 4 per 4. Ecco un esempio in cui 15 Zoombinis sono stati seduti legalmente, ma l'ultimo Zoombini in piedi sul molo non può essere posizionato sull'ultimo posto vuoto, perché non condividerebbe alcun aspetto con Zoombini alla sua destra:
Ce ne sono 16! ≈ 21 trilioni di possibili assegnazioni di Zoombinis ai posti. Quindi semplicemente eseguendo ogni possibile incarico per vedere se è legale non sarà pratico. Quali sono alcune euristiche che potrei impiegare per affrontare questo problema in modo sensato?
Subgraph Isomorphism Problem
. Il problema è trovare un grafico in un altro grafico. Nel tuo caso il sottografo sarebbe la sede (i bordi sono adiacenze), mentre il grafico principale sarebbe lo zoombinis, dove le connessioni sarebbero la presenza di un tratto condiviso. Si noti che in generale il problema è NP-completo e di solito viene eseguito anche con il backtracking, tuttavia per alcuni casi speciali (di cui il grafico potrebbe essere benissimo), sono possibili soluzioni polinomiali o persino lineari.