Genera in modo casuale un grafico diretto su una griglia


11

Sto cercando di generare in modo casuale un grafico diretto allo scopo di creare un gioco simile ai puzzle scorrevoli sul ghiaccio di Pokemon.
Questo è essenzialmente ciò che voglio essere in grado di generare in modo casuale: http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory .

Devo essere in grado di limitare la dimensione del grafico in una dimensione xey. Nell'esempio fornito nel collegamento, sarebbe limitato a una griglia 8x4.
Il problema che sto incontrando non è la generazione casuale del grafico, ma la generazione casuale di un grafico, che posso mappare correttamente in uno spazio 2d, poiché ho bisogno di qualcosa (come una roccia) sul lato opposto di un nodo, per farlo ha senso visivamente quando smetti di scivolare. Il problema è che a volte la roccia finisce nel percorso tra altri due nodi o eventualmente su un altro nodo stesso, causando la rottura dell'intero grafico.

Dopo aver discusso del problema con alcune persone che conosco, siamo giunti a un paio di conclusioni che potrebbero portare a una soluzione.

  • Compresi gli ostacoli nella griglia come parte del grafico durante la costruzione.
  • Inizia con una griglia completamente riempita e disegna semplicemente un percorso casuale ed elimina i blocchi che faranno funzionare quel percorso.

Il problema diventa quindi capire quali eliminare per evitare di introdurre un percorso aggiuntivo e più breve. Pensavamo anche che un algoritmo di programmazione dinamica potesse essere utile, anche se nessuno di noi è troppo abile nel creare algoritmi di programmazione dinamica dal nulla. Qualsiasi idea o riferimento su ciò che viene chiamato ufficialmente questo problema (se si tratta di un problema grafico ufficiale) sarebbe di grande aiuto.

Ecco alcuni esempi di ciò che ho realizzato finora posizionando casualmente blocchi e generando il grafico di navigazione dall'inizio / della fine scelti. L'idea (come descritto nel link precedente) è di iniziare dalla S verde e si desidera arrivare alla F. verde. Lo si fa spostandosi su / giù / a sinistra / a destra e si continua a muoversi nella direzione scelta fino a quando si preme un parete. In queste immagini, il grigio è un muro, il bianco è il pavimento e la linea viola è la lunghezza minima dall'inizio alla fine, e le linee nere e i punti grigi rappresentano possibili percorsi.

Ecco alcuni esempi errati di grafici generati casualmente:

inserisci qui la descrizione dell'immagine

Ecco alcuni buoni esempi di grafici generati casualmente (o modificati a mano):

inserisci qui la descrizione dell'immagine

Ho anche notato che quelli più impegnativi quando si gioca a questo puzzle sono quelli che hanno molti nodi di alto grado lungo il percorso minimo.


1
È possibile generare un set di rocce completamente casuale, quindi verificare se il grafico corrispondente ha una soluzione e, in caso contrario, gettarlo via e ricominciare. Con una griglia 8x4 questo non può richiedere così tanto tempo. Sono sicuro che ci sono soluzioni più pulite.
Giobbe

Questo è stato il mio primo approccio, ma ho bisogno di farlo su una scala leggermente più grande e forzare bruscamente sembrava richiedere un po 'di tempo e stavo cercando di trovare un approccio migliore.
Talon876,

Risposte:


2
  • è ghiaccio, ti sposterai se non colpisci una roccia.
  • l'unico modo per cambiare direzione è colpire una roccia.
  • se colpisci una roccia devi cambiare direzione.
  • i cicli sono buoni, per ovvi motivi.
  • possono esserci più inizi e più fini.

proprietà più avanzate:

  • le celle senza rocce adiacenti non sono raggiungibili (alcune possono essere attraversate)
  • anche i muri sono rocce, se li rimuovi puoi decidere di avvolgerli.
  • puoi usare le griglie secondarie come motivi ("piastrellatura" 3x3, 3x4, 5x5, ... ecc.)
  • puoi sovrapporre una tessera MxN puzzle sopra l'area MxN non attraversabile e aggiungere una roccia per reindirizzarla dentro / fuori.
  • la rotazione o la simmetria di una tessera può essere interessante
  • puoi espandere un riquadro inserendo righe / colonne ghiacciate

esempio:

S=start, E=end, o=rock, .=ice

3 . 2 o        3 . . 2 o         . . . . . o o
4 . . E   ~=   4 . . . E   ~=    . . . . . 2 E
o . . .        o . . . .         . . . . . . .
S . 1 o        S . . 1 o         S . . . . 1 o

esempio di combinazione di tessere:

3 . . 2 o       o 2 . . 3      3 . . 2 o 7 . . 6
4 . . . E   +   E . . . 4  =   4 . . . . . . . 5
o . . . .       . . . . o      o . . . . . . . o
S . . 1 o       o 1 . . S      S . . 1 o 8 . . E

ti potrebbe piacere il gioco Tsuro , che utilizza tessere per generare una tavola casuale.


0

Forse il reverse engineering potrebbe aiutarti se sei all'altezza.

Se esiste una e una sola soluzione per ciascun problema, probabilmente puoi generare un grafico basato sulla risposta univoca. Ciò non richiede di eseguire una programmazione dinamica o di saltare la forza bruta e optare per una generazione metodica.

Puoi farlo al riguardo:

  1. Tenere pronto un grafico MxN
  2. creazione di una / più soluzioni
  3. ponendoci una domanda se si tratta di un problema di soluzione singolare
  4. se esistono diverse soluzioni al problema, è possibile ripetere la procedura sopra descritta in modo tale che l'attuale iterazione non inibisca un'altra soluzione.

Tuttavia, dovrai disporre di un dispositivo in base alla complessità del problema e alla dimensione del problema che genererà questa domanda per te. Non limitarti alla forza bruta. Prova invece un algoritmo randomizzato. Questo potrebbe aiutarti.


Sapevo che mi sarei pentito di aver venduto quel libro l'anno scorso, penso che uno dei miei amici ce l'abbia da qualche parte. Qualche algoritmo particolare lì dentro che dovrei cercare? O semplicemente guarda tutti quelli con i grafici e vedi se riesco a trovarne uno che sembra utile? Oh, e c'è una soluzione ottimale (suppongo che potrebbe esserci un pareggio per quello) e infinite altre soluzioni poiché potresti semplicemente andare avanti e indietro tra due nodi un numero qualsiasi di volte e quindi risolverlo.
Talon876,

0

Che ne dici di un altro approccio? Inizia con un labirinto vuoto e aggiungi blocchi come questo:

  1. Blocco casuale iniziale e blocco finale.
  2. Fai 1-3 passi "scorrevoli" in direzione casuale (ma non di ritorno) e con lunghezza casuale (*). Posiziona un blocco dopo ogni passaggio (per fermare la diapositiva).
  3. Trova il percorso più breve verso l'uscita. Se ci sono troppi segmenti (difficoltà di basso livello), prendi un segmento casuale del percorso e dividilo con un blocco. In caso contrario, posizionare un blocco come nel passaggio 1 ed uscire.
  4. Ripeti 1 con cautela (*): quando scegli la lunghezza di un passo scorrevole, fallo in modo che il blocco inserito non chiuda il percorso precedente.

Tocco finale: trova il percorso più breve con l'algoritmo che hai fornito. Prendi nota di tutte le celle utilizzate e inizia a riempire il resto in modo casuale, ogni volta assicurandoti che il percorso più breve non si accorcia.

C'è un avvertimento nel passaggio due, quando non è possibile inserire l'ultimo blocco in modo che non attraversi i percorsi utilizzati, ma vedo due soluzioni a questo: spostare il blocco finale prima o annullare alcuni passaggi e riprovare.

E un altro pensiero per la lunghezza casuale dei gradini scorrevoli: potresti volerlo scegliere in modo da riutilizzare un blocco posizionato in precedenza, purché i percorsi non si sovrappongano.


@ Talon876 Questo è un tipo di algoritmo randomizzato di cui parlavo.
c0da
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.