Ich schreibe einen Code, um die Handlungen von Theseus und dem Minoutaurus zu simulieren, wie in diesem Logikspiel gezeigt; http://www.logicmazes.com/theseus.html
Für jedes Labyrinth gebe ich die Positionen des Labyrinths an, und welche Positionen verfügbar sind, z.B. von Position 0 sind die nächsten Zustände 1, 2 oder bleiben auf 0. Ich lasse eine QLearning-Instanziierung laufen, die den besten Pfad für Theseus berechnet, um dem Labyrinth zu entkommen vorausgesetzt, kein Minotaurus . dann wird der Minotaurus eingeführt. Theseus macht seinen ersten Zug in Richtung Ausgang und wird unweigerlich gefangen, was zu einer Neugewichtung des besten Weges führt. Beim Test von Labyrinth 3 im Spiel führte dieser Ansatz dazu, dass Theseus sich auf der mittleren Linie auf und ab bewegte, da dies die einzigen Züge waren, die ihn nicht umbrachten.
Wenn Theseus sich bewegt, wird der Zustand zu einer Liste von "besuchten Zuständen" hinzugefügt. Indem ich den Zustand, der sich aus der vorgeschlagenen Bewegung ergibt, mit der Liste der besuchten Zustände vergleiche, kann ich sicherstellen, dass Theseus keine Bewegung macht, die zu einem früheren Zustand führen würde.
Das Problem ist, dass ich in einigen Fällen in der Lage sein muss, den Vorgang zu wiederholen. Z.B. mit Labyrinth 3 als Beispiel und Minotaurus bewegen 2x für jede Theseus bewegen. Theseus bewegt sich 4 -> 5, Zustand hinzugefügt(t5, m1). mino bewegt sich 1->5. Theseus gefangen, zurückgesetzt. 4-> 5 ist ein schlechter Zug, also bewegt Theseus 4->3, Mino fängt in seinem Zug. Jetzt sind sowohl(t5, m1) als auch (t3 m1) auf der Besuchsliste
Was passiert, ist, dass alle möglichen Zustände des Ausgangszustands der Liste "Nicht besuchen" hinzugefügt werden, was bedeutet, dass mein Code eine Endlosschleife durchläuft und keine Lösung bietet.
public void move()
{
int randomness =10;
State tempState = new State();
boolean rejectMove = true;
int keepCurrent = currentPosition;
int keepMinotaur = minotaurPosition;
previousPosition = currentPosition;
do
{
minotaurPosition = keepMinotaur;
currentPosition = keepCurrent;
rejectMove = false;
if (states.size() > 10)
{
states.clear();
}
if(this.policy(currentPosition) == this.minotaurPosition )
{
randomness = 100;
}
if(Math.random()*100 <= randomness)
{
System.out.println("Random move");
int[] actionsFromState = actions[currentPosition];
int max = actionsFromState.length;
Random r = new Random();
int s = r.nextInt(max);
previousPosition = currentPosition;
currentPosition = actions[currentPosition][s];
}
else
{
previousPosition = currentPosition;
currentPosition = policy(currentPosition);
}
tempState.setAttributes(minotaurPosition, currentPosition);
randomness = 10;
for(int i=0; i<states.size(); i++)
{
if(states.get(i).getMinotaurPosition() == tempState.getMinotaurPosition() && states.get(i).theseusPosition == tempState.getTheseusPosition())
{
rejectMove = true;
changeReward(100);
}
}
}
while(rejectMove == true);
states.add(tempState);
}
Oben ist die Zugmethode von Theseus dargestellt, die gelegentlich einen zufälligen Zug vorschlägt.