Il problema della chiave e della porta


Mondo di gioco

Partendo dall'obiettivo di avere una modellazione formale del problema, il primo passo è quello di creare il mondo di gioco. Dal momento che la rete sarà probabilmente scritta in Python usando PyTorch, il gioco in sè ho deciso di farlo con PyGame. Questo mi permette di rimanere dentro lo stesso ecosistema python e dovrebbe facilitare la comunicazione tra la rete e il gioco stesso.

Il gioco, come descritto nell'articolo precedente, è abbastanza semplice: il giocatore deve prima raccogliere la chiave e poi uscire dalla stanza. Ho deciso di implementarlo in un mondo discreto su griglia, per semplificarmi di parecchio la gestione dei movimenti e delle collisioni con il muro. Per l'implementazione mi sono fatto aiutare da opencode collegato a Deepseek V4 flash. Piccola nota sul setup, considerando tutto il lavoro (dal planning all'implementazione) avrò speso 1/2 centesimi di crediti API, ed è incredibile quanto sia potente e preciso deepseek nonostante un costo in token decisamente inferiore ai suoi competitor.

Griglia di gioco
La griglia di gioco per BoredNet. Il rombo giallo è la chiave mentre la porta è il quadrato marrone.

Interazione con l'ambiente

Ho pensato di fare il tutto abbastanza semplice, per evitare di complicarmi la vita con il design del task per potermi concentrare sulla rete in sè. Per tanto, su BoredWorld (che da ora sarà il nome del task per differenziarlo dalla rete) l'agente potrà muoversi nelle quattro direzioni liberamente.

Movimento dell'agente
Su BoredWorld, l'agente può muoversi liberamente nelle quattro direzioni all'interno del suo ambiente.

Una volta che l'agente raccoglie la chiave, per dare un indizio visivo, l'agente cambierà colore da nero a verde.

Raccolta della chiave
Per dare alla rete / giocatore un indizio visivo, quando viene raccolta la chiave l'agente cambia colore

Una volta che l'agente ha la chiave, può andare ad aprire la porta e concludere il livello

Apertura della porta
Solamente quando l'agente ha la chiave può uscire dalla porta.

La filosofia e l'ispirazione dietro al task

Di recente ho avuto modo di poter assistere ad un mio amico che giocava ad Outer wilds, e tutto questo progetto è forse partito da qua. In Outer wilds non hai un vero scopo se non quello di esplorare. Man mano che esplori e scopri elementi del mondo, il giocatore si autoimpone degli obiettivi da raggiungere spinto dalla curiosità fino ad arrivare ad una conclusione. Chiaramente tutti questi processi di curiosità, apprendimento, cognizione e scopertà di causalità sono tipici negli esseri umani, e difficilmente riproducibili in maniera così generale in un algoritmo. Però mi sono chiesto: è possibile che un algoritmo scopra da solo lo scopo che deve raggiungere? E una volta che lo ha scoperto, è in grado di generalizzarlo?

Per questo ho pensato a BoredWorld, e le intuizioni dietro a BoredNet, che sono:

  • Non avendo un obiettivo specifico, l'agente non inizierà mai a muoversi. Per questo ho pensato al concetto di noia (da qua BoredNet), che non è niente di nuovo in letteratura, ma che in questo progetto sarà la spinta principale che porterà l'agente a muoversi le prime volte.
  • Serve anche un meccanismo di ricompensa implicito. La rete deve riuscire a motivarsi da sola (quindi a porsi degli auto obiettivi). Quando raccoglie la chiave, la rete deve in qualche modo capire che quell'azione è importante.
  • Serve memoria. Il task avrà tempo limitato, e non avendo una funzione di reward esplicita da massimizzare, per ricordarsi i progressi dei tentativi precedenti serve un sistema di memoria inter episodica dalla quale la rete può accingere per porsi gli auto obiettivi scoperti in precedenza.
  • Una volta che casualmente o intenzionalmente la rete riesce ad aprire la porta, la sua memoria sarà così forte da riuscire a generalizzare a tentativi successivi e soprattutto a posizioni diverse della chiave e della porta?

Questi sono più o meno gli obiettivi e le domande di ricerca che mi sono posto. Se dovessi riuscire a soddisfarle, il naturale proseguimento sarebbe quello dell'aggiunta di muri e di una mappa più grande del campo visivo della rete. Con questa seconda aggiunta, la difficoltà aumenta esponenzialmente, perchè l'agente dovrà pianificare azioni che sono al di fuori del suo campo visivo basandosi interamente sulla sua memoria.

Conscio del fatto che potrei fallire e non riuscire nell'intento, nel prossimo post formalizzerò matematicamente il task e aggiungerò il background necessario per poter implementare i blocchi che ho supposto. La mia intuizione è quella di copiare l'approccio di LeWorldModel per il movimento e la conoscenza fisica del mondo, ed in qualche modo creare un sistema che fornisca alla rete lo stato da raggiungere (dal momento che LeWorldModel funziona solamente quando ha lo stato target da raggiungere) basandosi interamente da conoscenza implicita. Un po' appunto come in outer wilds.