Algorithmus zur Erzeugung von Zufallswegen

8

Ich möchte einen zufälligen Pfad von oben nach unten in einer Matrix erzeugen.

FIDDLE

Anforderungen:

  • Der Pfad kann sich winden, aber er muss sich von Zeile 1 zur letzten Zeile verbinden.
  • Irgendwann möchte ich, dass die Farben für jedes Pfadstück zufällig sind, aber im Moment kann es einheitlich sein (ich habe unten nur mit Rot getestet)
  • Pfade, die sich von oben nach unten verbinden, werden zufällig generiert
  • Die Wegstücke müssen sich offensichtlich verbinden und sollten nicht verzweigen (aka, geben Sie dem Spieler 2 Optionen, um zu gehen, hier gezeigt)
  • Der Pfad kann nur von oben nach unten gehen (kann nicht nach oben verschoben werden), aber er kann sich nach links und rechts winden

Was ich in Betracht gezogen habe:

  • Ich kann nicht einfach überprüfen, ob die Spalte der obigen Zeile Teil des Pfades ist, weil sie dann fortlaufend Pfadstücke erzeugt, wenn sie den ersten wahren Wert findet.
  • Ich bin nicht daran interessiert, Pfade manuell zu erzeugen, da dies eine neue Matrix erfordern würde, die 1 und 0 angibt, wo ich den Pfad haben möchte. Und dann müsste ich für jede "zufällige" Pfadoption eine neue Matrix erstellen. Noch wichtiger ist, dass das manuelle Erzeugen von Pfaden in Matrizen die Skalierung der Matrixgröße viel mühsamer machen würde ... Zum Beispiel, wenn ich meine 6x6-Matrix zu einer 100x100 ändere.

Also ja, der einfache Weg wäre, dies einfach zu machen und es zu durchlaufen:

%Vor%

Auf der linken, leeren Gitter, auf der rechten Seite, was es generieren sollte

Mein Gedanke war, zuerst das Gitter zu erstellen und die Spannen in jedem Matrixeintrag hinzuzufügen:

%Vor%

Erzeuge dann in Zeile 1 zufällig den ersten Pfad-Teil. Dann suche für jede nachfolgende Zeile nach einem Pfad-Teil darüber, um dich zu verbinden ... und dann von diesem Teil aus, erzeugt start den nächsten Satz:

%Vor%

Bis jetzt fügt es den ersten Schritt hinzu, dann die Reihe unten, aber dann stoppt es.

    
Growler 08.11.2014, 16:48
quelle

5 Antworten

3

Eine Sache, auf die ich hinweisen möchte, ist, dass Sie den Bereich des Arrays so ändern sollten, dass es bei Null beginnt, oder den Bereich der generierten Anzahl fixieren. Momentan produziert es einen Bereich mit ungültigen Indizes. Da deine Frage nicht darauf ausgerichtet war, habe ich es so gelassen.

Dies erzeugt einen gewundenen Pfad, der abwärts gehen und wieder hochfahren kann, bis entweder gültige Bewegungen ausbleiben oder der untere Bildschirmbereich erreicht wird. Hier ist ein JFIDDLE dafür Ссылка

%Vor%     
Taekahn 09.11.2014, 20:20
quelle
1

Ich würde ein Labyrinth mit einer Methode erzeugen, die ein Labyrinth gibt, wo man von jedem Punkt zu jedem anderen kommt. Der rekursive Backtracer ist hierfür gut und einfach zu implementieren.

Nachdem Sie ein Labyrinth auf der Matrix erzeugt haben, müssen Sie einen Weg vom Anfangspunkt zum Endpunkt finden (Es kann jeder Punkt sein. Sie müssen nur daran denken, dass jede Sekunde eine Mauer sein kann). Sie können viele verschiedene Algorithmen im Link am Ende des Beitrags finden. Bei einem Labyrinth, das mit einem rekursiven Backtracer generiert wurde, sind Reihen / Spalten wie gewünscht verbunden (wie gesagt, jeder Punkt ist mit jedem anderen verbunden), aber nicht jede Position kann ein Pfad sein (wegen der Notwendigkeit Wände zu setzen). p>

Ihr gefundener Pfad von Anfang bis Ende erfüllt Ihre Anforderungen, so dass Sie nur alles löschen müssen, was nicht zum Pfad gehört.

Wenn Sie einen eigenen Stapel erstellen, können Sie problemlos Matrizen der Größe ~ 2Kx2K bearbeiten. Vielleicht größer.

Für weiterführende Informationen zu allem, was mit Labyrinthen zu tun hat, empfehle ich diese Seite Ссылка

Sie können einige Änderungen am Labyrinth-Generator vornehmen, so dass es möglich ist, Start / Ende auf jeder möglichen Kachel zu haben, nicht nur auf jeder zweiten. Die einfachste Lösung, die ich mir vorstellen kann, besteht darin, nur für 50% der Fälle ein Labyrinth mit einem Offset von 1 zu erzeugen.

    
Sopel 08.11.2014 19:13
quelle
1

So würde ich dieses Problem angehen.

1) Definieren Sie genau Ihre Regeln für das, was einen gültigen Pfad ausmacht. eine Funktion, die die Matrix auf einen booleschen Wert abbildet. Von deiner Frage aus bin ich nicht klar, was ein gültiger Pfad ist, und ich bin mir auch nicht sicher, ob du es schon bist.

2) Erzeuge wiederholt eine zufällige Anordnung von Kacheln, bis die erzeugte Anordnung die Regeln für einen gültigen Pfad erfüllt. Bei aktuellen Prozessoren wird dies schnell für 6 × 6 funktionieren, dauert aber länger bei größeren Quadraten, z. 100x100.

Eine algorithmische Lösung ist möglich, spart Verarbeitungszeit, aber das ist der schnelle Gewinn in Bezug auf Entwicklungszeit und Code-Einfachheit. Hat auch den Vorteil, Ihnen eine gleichmäßige Verteilung zu geben, d. H. Jeder Pfad wird genauso wahrscheinlich erzeugt wie jeder andere Pfad.

Beispielregelsatz könnte sein:

Ein Pfad ist gültig, wenn und nur wenn die Matrix alle diese Kriterien erfüllt:

1) Jede Kachel in der Matrix (mit Ausnahme von zwei Endkacheln) muss Nachbarn mit genau zwei Kacheln aus den vier möglichen Richtungen N, S, E, W

sein

2) Zwei Kacheln in der Matrix (Endkacheln) müssen Nachbarn mit genau einer Kachel aus den vier möglichen Richtungen N, S, E, W

sein

3) Eine Endkachel muss in der oberen Reihe und die andere in der unteren Reihe sein

    
Brad Thomas 08.11.2014 19:05
quelle
0

Wenn Sie einen Schritt nach dem anderen gehen und der Aufstieg ausgeschlossen wird, scheint es mir, dass Sie nur die letzten beiden Bewegungen im Auge behalten müssen (außer wenn Sie den ersten Schritt bestimmen). Dann könnte der Algorithmus einer Reihe von Regeln folgen und die nächste Kachel zufällig aus den verfügbaren Optionen auswählen.

Zum Beispiel:

%Vor%     
גלעד ברקן 08.11.2014 18:48
quelle
-2

hier jsfiddle

Erstelle Zeilen und Spalten beliebiger Größe

%Vor%

}

    
SeFoSeF 09.11.2014 10:52
quelle