RL: Codierungsaktion, die von der vorherigen Aktion abhängig ist

Dec 27 2020

Ich habe ein Kartenspiel, bei dem der Spieler im Zug eines Spielers nacheinander zwei Karten zieht. Jede Karte kann vom Ablagestapel eines anderen Spielers (verdeckt) oder vom Stapel (verdeckt) gezogen werden.

Wenn ich darüber nachdenke, wie ich dies in einen Aktionsraum kodieren kann, könnte ich naiv annehmen, dass die beiden Draws unabhängig sind. Der Aktionsraum wäre einfach ein binärer Vektor von 2 * (1 + (Anzahl_der_Spieler - 1)), den ich nachfiltern könnte, um die Anzahl der leeren Ziehstapel zu begrenzen (und nicht aus dem eigenen Stapel ziehen kann).

Als ich das Spiel selbst spielte, bemerkte ich jedoch, dass es manchmal vorteilhaft ist, die erste Karte aus dem Stapel zu ziehen und dann den Ziehstapel für die zweite Karte basierend auf dem Wert der ersten gezogenen Karte auszuwählen. Aber wie würde dies in einen Aktionsraum kodiert werden? Wäre es besser, sich vorzustellen, dass dies zwei getrennte Aktionen sind, selbst wenn sie Teil derselben "Wendung" sind?

Antworten

2 NeilSlater Dec 27 2020 at 22:31

Es ist schwer mit Sicherheit zu sagen, ohne die vollständigen Details und Ergebnisse der Experimente zu kennen.

Wenn das Spiel jedoch eine Aufteilung der Entscheidungen zulässt, ist es für den Agenten wahrscheinlich besser, das zusätzliche Wissen über den Wert einer zuvor verborgenen Karte zu nutzen, die gerade vom Ziehstapel genommen wurde.

Wenn jede Spielerentscheidung nacheinander getroffen wird, was zu Statusänderungen führt, handelt es sich im Allgemeinen um eine separate Aktion in einem separaten Zeitschritt gemäß dem theoretischen MDP-Modell, das beim Verstärkungslernen (RL) verwendet wird. Möglicherweise möchten Sie die Zeitschritte anders beschreiben / notieren, damit sie mit dem Spielverlauf übereinstimmen. Für die Zwecke von RL sollte sich jedoch jeder Entscheidungspunkt in einem neuen Zeitschritt befinden und zu einem neuen Zustand, neuen Wertschätzungen usw. führen.

Ebenso muss es Teil des Staates sein, ob die aktuelle Wahl die erste oder die zweite Karte des Spielers ist, die gezogen werden soll oder nicht. Dieses Detail des Zustands wird möglicherweise bereits durch die Anzahl der Karten auf der Hand des Spielers abgedeckt, wenn logischerweise die Anzahl der Karten in jeder Phase immer gleich ist. Wenn die Handgröße jedoch aus anderen Gründen variieren kann, lohnt es sich, ein explizites Flag für "First Draw Choice" oder ähnliches hinzuzufügen, damit der Agent die Informationen verwenden kann.

Sie haben einige Freiheiten für die Codierung des Aktionsbereichs. Wenn das Ziehen von Karten in diesem Spiel in allen Phasen die einzig mögliche Aktion ist, ist ein binärer Ausgabevektor mit 1 + (Anzahl_der_ Spieler - 1) Dimensionen geeignet. Andere Codierungen funktionieren möglicherweise auch gut. Dies hängt davon ab, ob die Auswahlmöglichkeiten oder abgeleitete Daten, die nützliche Spielinformationen codieren, logisch strukturiert sind.

Es kann nützlich sein, die Aktionsoptionen so anzuordnen, dass der Index für das Ziehen vom Ablagestapel jedes Spielers relativ zum Zug des aktuellen Spielers berücksichtigt wird . Das heißt, anstatt Aktionen zu arrangieren$[draw, discard P1, discard P3, discard P4, discard P5]$ für P2 würden sie angeordnet $[draw, discard P3, discard P4, discard P5, discard P1]$ und für P3 wäre das anders: $[draw, discard P4, discard P5, discard P1, discard P2]$. . . das würde von Natur aus die zyklische Natur von Kurven berücksichtigen. Die staatliche Repräsentation müsste das Wissen über jeden Spieler auf ähnliche Weise drehen, um dies zu erreichen. Möglicherweise müssen Sie dies nicht tun, aber ich würde es für Spiele empfehlen, bei denen es eine Menge allgemeiner Logik hinsichtlich der Auswahl von Aktionen in Bezug auf die Drehposition gibt, die Sie nutzen könnten. Das Gegenteil würde zutreffen (und Sie würden absolute Spielerpositionen verwenden), wenn es im Laufe des Spiels wichtige Unterschiede zwischen P1, P2, P3 usw. gäbe.