[PYTHON] Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken (② Registrieren Sie die Umgebung im Fitnessstudio).

Einführung

Ich habe versucht, eine Blackjack-Strategie zu entwickeln, während ich Python studiert und das Lernen gestärkt habe. Es gibt eine Strategie, die auf der Wahrscheinlichkeit einer Grundstrategie basiert, aber ich werde versuchen, sie einzuholen.

Ich werde so vorgehen

  1. Blackjack-Implementierung
  2. Registrieren Sie sich in der OpenAI-Fitnessumgebung ← Diesmal hier
  3. Lernen Sie die Blackjack-Strategie mit erweitertem Lernen

Was ist OpenAI Fitnessstudio?

Es ist eine Plattform, die als Forschungsumgebung für intensives Lernen genutzt wird. Umgebungen (Spiele) wie CartPole und Labyrinth werden vorbereitet, und Sie können problemlos verbessertes Lernen ausprobieren. Die OpenAI Gym-Umgebung verfügt über eine gemeinsame Schnittstelle, die Aktionen von Agenten empfängt und als Ergebnis den nächsten Status und die nächste Belohnung zurückgibt. Die Installation kann wie folgt problemlos durchgeführt werden. Die detaillierte Methode finden Sie auf anderen Seiten. Im Folgenden wird davon ausgegangen, dass die Installation abgeschlossen ist.

pip install gym

Dieses Mal werde ich meinen eigenen Blackjack in dieser Open AI Gym-Umgebung registrieren, damit ich besser lernen kann.

Überprüfung des verstärkenden Lernens

Zunächst ein kurzer Überblick über das Lernen zur Stärkung. Der "Zustand" wird von der "Umgebung" aus beobachtet, und der "Agent" ergreift als Reaktion darauf "Maßnahmen". "Umgebung" gibt den aktualisierten "Status" und "Belohnung" an "Agent" zurück. Der Zweck des verstärkten Lernens besteht darin, eine "Aktions" -Methode (= Richtlinie) zu erwerben, die die Gesamtmenge der "Belohnungen" maximiert, die in Zukunft erhalten werden.

Wenden Sie die Elemente des verbesserten Lernens auf Blackjack an

In diesem Blackjack werden wir das Lernen der Verstärkung wie folgt betrachten.

--Umwelt: Blackjack

image.png

Verfahren zum Registrieren der Umgebung in OpenAI Gym

Führen Sie die folgenden Schritte aus, um Ihre eigene Umgebung in OpenAI Gym zu registrieren.

  1. Erstellen Sie eine Blackjack-Umgebungsklasse "BlackJackEnv", die gym.Env von OpenAI Gym erbt
  2. Registrieren Sie die Umgebung mit der Funktion gym.envs.registration.register, damit sie mit der ID BlackJack-v0 aufgerufen werden kann.

Entwicklungsumgebung

Dateiorganisation

Die Dateistruktur ist wie folgt. Bitte beachten Sie, dass es zwei Dateien mit dem Namen \ _ \ _ init \ _ \ _. Py gibt.

└─ myenv
    ├─ __init__.py  --->Rufen Sie BlacJackEnv an
    └─env
       ├─ __init__.py  --->Gibt an, wo sich das BlackJack Env befindet
       ├─ blackjack.py  --->BlackJack-Spiel selbst
       └─ blackjack_env.py  --->OpenAI Fitnessstudio.Erstellen Sie eine BlackJackEnv-Klasse, die Env erbt

Befolgen Sie dann die Anweisungen zum Registrieren der Umgebung.

Erstellen Sie eine Blackjack-Umgebungsklasse "BlackJackEnv", die gym.Env von OpenAI Gym erbt

myenv/env/blackjack.py Lassen Sie den zuletzt erstellten Blackjack-Code unverändert. Importieren Sie es mit blackjack_env.py unten und verwenden Sie es.

myenv/env/blackjack_env.py Erstellen Sie die BlackJack-Spielumgebung "BlackJackEnv", die Sie im OpenAI Gym registrieren möchten. Erben Sie gym.Env und implementieren Sie die folgenden 3 Eigenschaften und 5 Methoden.

Eigentum

--action_space: Gibt an, welche Aktion der Spieler (Agent) auswählen kann. --observation_space: Informationen zur Spielumgebung, die der Spieler (Agent) beobachten kann --reward_range: Bereich von minimaler bis maximaler Belohnung

Methode

--reset: Eine Methode zum Zurücksetzen der Umgebung. --step: Eine Methode, die eine Aktion in der Umgebung ausführt und das Ergebnis zurückgibt. --render: Eine Methode zur Visualisierung der Umgebung. --close: Eine Methode zum Schließen der Umgebung. Es wird am Ende des Lernens verwendet. --Seed: Eine Methode zum Fixieren eines zufälligen Seeds.

action_space-Eigenschaft

Es zeigt, dass Sie vier Aktionen ausführen können: Stand, Hit, Double Down und Surrender.

action_space


self.action_space = gym.spaces.Discrete(4)
Observation_space-Eigenschaft

Beobachten Sie die vier Zustände der Gesamtpunktzahl der Hand des Spielers, die Punktzahl der vom Händler angegebenen Hand, die Flagge, die die weiche Hand anzeigt (A ist in der Hand des Spielers enthalten), und die Flagge, die angibt, ob der Spieler getroffen wurde. Bestimmen Sie jeweils die Maximal- und Minimalwerte.

observation_space


high = np.array([
            30,  # player max
            30,  # dealer max
            1,   # is_soft_hand
            1,   # hit flag true
        ])
        low = np.array([
            2,  # player min
            1,  # dealer min
            0,  # is_soft_hand false
            0,  # hit flag false
        ])
        self.observation_space = gym.spaces.Box(low=low, high=high)
Belohnung_Range-Eigenschaft

Bestimmen Sie den Bereich der Belohnungen. Hier wird entschieden, die minimalen und maximalen Werte der Chips zu berücksichtigen, die erhalten werden können.

reward_range


        self.reward_range = [-10000, 10000]
Methode zurücksetzen

Initialisiere self.done, initialisiere die Hand von Spieler und Dealer mit self.game.reset_game (), setze Chips (Bet) und verteile Karten (Deal). Wie in der Schrittmethode erwähnt, ist self.done ein boolescher Wert, der angibt, ob ein Gewinn oder ein Verlust vorliegt oder nicht. Beobachten Sie und geben Sie 4 Zustände mit self.observe () zurück. Dieses Mal haben wir uns jedoch entschlossen, den Spieler unter der Annahme zu trainieren, dass die Anzahl der Chips, die der Spieler besitzt, nicht abnimmt.

reset()


    def reset(self):
        #Initialisiert den Status und gibt die anfängliche Beobachtung zurück
        #Initialisieren Sie verschiedene Variablen
        self.done = False

        self.game.reset_game()
        self.game.bet(bet=100)
        self.game.player.chip.balance = 1000  #Der Geldbetrag, den Sie haben, wird während des Studiums niemals Null sein
        self.game.deal()
        # self.bet_done = True

        return self.observe()
Schritt Methode

Der Spieler nimmt entweder Stand, Hit, Double Down oder Surrender in Bezug auf die Umgebung ein. Wenn der Spieler an der Reihe ist, wird der Chip abgerechnet. Schließlich werden die folgenden vier Informationen zurückgegeben.

Wenn Sie in dieser Lernumgebung nach dem Schlagen verdoppeln oder sich ergeben, werden Sie für Verstöße gegen die Regeln bestraft.

step()


    def step(self, action):
        #Führen Sie die Aktion aus und geben Sie das Ergebnis zurück
        #Beschreiben Sie den Vorgang, um einen Schritt voranzutreiben. Der Rückgabewert ist Beobachtung, reward,fertig (hat das Spiel beendet), info(Wörterbuch mit zusätzlichen Informationen)

        if action == 0:
            action_str = 's'  # Stand
        elif action == 1:
            action_str = 'h'  # Hit
        elif action == 2:
            action_str = 'd'  # Double down
        elif action == 3:
            action_str = 'r'  # Surrender
        else:
            print(action)
            print("Undefinierte Aktion")
            print(self.observe())

        hit_flag_before_step = self.game.player.hit_flag
        self.game.player_step(action=action_str)

        if self.game.player.done:
            #Am Ende des Zuges des Spielers
            self.game.dealer_turn()
            self.game.judge()
            reward = self.get_reward()
            self.game.check_deck()
            print(str(self.game.judgment) + " : " + str(reward))


        elif action >= 2 and hit_flag_before_step is True:
            reward = -1e3  #Geben Sie eine Strafe, wenn Sie gegen die Regeln verstoßen

        else:
            #Wenn ein Spieler an der Reihe ist
            reward = 0

        observation = self.observe()
        self.done = self.is_done()
        return observation, reward, self.done, {}

Dieses Mal werden die Render-, Close- und Seed-Methoden nicht verwendet.

Der gesamte Code für blackjack_env.py sieht folgendermaßen aus:

myenv/env/blackjack_env.py


import gym
import gym.spaces
import numpy as np

from myenv.env.blackjack import Game


class BlackJackEnv(gym.Env):
    metadata = {'render.mode': ['human', 'ansi']}

    def __init__(self):
        super().__init__()

        self.game = Game()
        self.game.start()

        # action_space, observation_space, reward_Bereich einstellen
        self.action_space = gym.spaces.Discrete(4)  # hit, stand, double down, surrender

        high = np.array([
            30,  # player max
            30,  # dealer max
            1,   # is_soft_hand
            1,   # hit flag true
        ])
        low = np.array([
            2,  # player min
            1,  # dealer min
            0,  # is_soft_hand false
            0,  # hit flag false
        ])
        self.observation_space = gym.spaces.Box(low=low, high=high)
        self.reward_range = [-10000, 10000]  #Liste der minimalen und maximalen Belohnungen

        self.done = False
        self.reset()

    def reset(self):
        #Initialisiert den Status und gibt die anfängliche Beobachtung zurück
        #Initialisieren Sie verschiedene Variablen
        self.done = False

        self.game.reset_game()
        self.game.bet(bet=100)
        self.game.player.chip.balance = 1000  #Der Geldbetrag, den Sie haben, wird während des Studiums niemals Null sein
        self.game.deal()
        # self.bet_done = True

        return self.observe()

    def step(self, action):
        #Führen Sie die Aktion aus und geben Sie das Ergebnis zurück
        #Beschreiben Sie den Vorgang, um einen Schritt voranzutreiben. Der Rückgabewert ist Beobachtung, reward,fertig (hat das Spiel beendet), info(Wörterbuch mit zusätzlichen Informationen)

        if action == 0:
            action_str = 's'  # Stand
        elif action == 1:
            action_str = 'h'  # Hit
        elif action == 2:
            action_str = 'd'  # Double down
        elif action == 3:
            action_str = 'r'  # Surrender
        else:
            print(action)
            print("Undefinierte Aktion")
            print(self.observe())

        hit_flag_before_step = self.game.player.hit_flag
        self.game.player_step(action=action_str)

        if self.game.player.done:
            #Am Ende des Zuges des Spielers
            self.game.dealer_turn()
            self.game.judge()
            reward = self.get_reward()
            self.game.check_deck()
            print(str(self.game.judgment) + " : " + str(reward))


        elif action >= 2 and hit_flag_before_step is True:
            reward = -1e3  #Geben Sie eine Strafe, wenn Sie gegen die Regeln verstoßen

        else:
            #Wenn ein Spieler an der Reihe ist
            reward = 0

        observation = self.observe()
        self.done = self.is_done()
        return observation, reward, self.done, {}

    def render(self, mode='human', close=False):
        #Visualisieren Sie die Umgebung
        #Im Falle eines Menschen wird es an die Konsole ausgegeben. Gibt StringIO für ansi zurück
        pass

    def close(self):
        #Schließen Sie die Umgebung und führen Sie die Nachbearbeitung durch
        pass

    def seed(self, seed=None):
        #Fix zufällige Samen
        pass

    def get_reward(self):
        #Belohnung zurückgeben
        reward = self.game.pay_chip() - self.game.player.chip.bet
        return reward

    def is_done(self):
        if self.game.player.done:
            return True
        else:
            return False

    def observe(self):
        if self.game.player.done:
            observation = tuple([
                self.game.player.hand.calc_final_point(),
                self.game.dealer.hand.calc_final_point(),  #Gesamtpunktzahl der Händlerkarte
                int(self.game.player.hand.is_soft_hand),
                int(self.game.player.hit_flag)])
        else:
            observation = tuple([
                self.game.player.hand.calc_final_point(),
                self.game.dealer.hand.hand[0].point,  #Nur Händlerkarte
                int(self.game.player.hand.is_soft_hand),
                int(self.game.player.hit_flag)])

        return observation

Registrieren Sie die Umgebung mit der Funktion gym.envs.registration.register, damit sie mit der ID BlackJack-v0 aufgerufen werden kann.

myenv/__init__.py Registrieren Sie BlackJackEnv mit der Funktion gym.envs.registration.register im Fitnessstudio. Hier erklären wir, dass wir die Klasse "BlackJackEnv" unter dem Verzeichnis env unter dem Verzeichnis myenv mit der ID "BlackJack-v0" aufrufen werden.

myenv/__init__.py


from gym.envs.registration import register

register(
    id='BlackJack-v0',
    entry_point='myenv.env:BlackJackEnv',
)

myenv/env/__init__.py Erklären Sie nun, dass sich die Klasse "BlakcJackEnv" in "blackjack_env.py" unter dem Verzeichnis "env" unter dem Verzeichnis "myenv" befindet.

myenv/env/__init__.py


from myenv.env.blackjack_env import BlackJackEnv

Das Lernen stärken

Sie können die Umgebung verwenden, indem Sie im Trainingscode "env = gym.make (" BlackJack-v0 ")" festlegen.

Dieses Mal ist die Registrierung der Umgebung die wichtigste, daher werde ich sie weglassen, aber der nächste Artikel wird dies erstellen.

Am Ende

Ich habe mein eigenes Blackjack-Spiel in der OpenAI Gym-Umgebung registriert. Mir wurde klar, dass ich sorgfältig darüber nachdenken musste, was ich tun sollte, was ich als Zustand beobachten sollte, was ich belohnen sollte und wohin ich von einem Schritt in die von mir geschaffene Umgebung gehen sollte. .. Zunächst wurde die Länge eines Schritts lächerlich lang eingestellt. .. ..

Als nächstes möchte ich diese Umgebung nutzen, um die Strategie von Blackjack zu lernen.

Websites / Bücher, auf die ich mich bezog

Recommended Posts

Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken (② Registrieren Sie die Umgebung im Fitnessstudio).
Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken (③ Stärkung des Lernens in Ihrer eigenen OpenAI Gym-Umgebung).
Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken ((1) Implementierung von Blackjack)
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Anfänger des maschinellen Lernens versuchen, einen Entscheidungsbaum zu erstellen
Ich habe versucht, mit Open AI Gym eine verbesserte Lernumgebung für Othello zu schaffen
Machen wir einen Sprung in die Fertigungsindustrie, indem wir zusätzlich zu Python das Web nutzen
Ein Memorandum zur Registrierung der in Hy in PyPI geschriebenen Bibliothek
Kombinieren Sie Listen zu einem DataFrame mit Pandas
[Einführung in die Stärkung des Lernens] Stärkung des Lernens, um sich vorerst zu bewegen
Versuchen Sie Q-Lernen in einem Kampf im Drakue-Stil [Einführung in die Stärkung des Lernens]
Führen Sie eine morphologische Analyse in der von GCE gestarteten maschinellen Lernumgebung durch
Probieren Sie Cython in kürzester Zeit aus
Versuchen Sie, das Triplett des Bootsrennens vorherzusagen, indem Sie das Lernen bewerten
Ich habe versucht, ein System zu erstellen, um den Programmführer automatisch zu erfassen → ihn an einem Tag im Kalender zu registrieren
Es wurde eine Funktion hinzugefügt, um gewünschte Verschiebungen in der Django-Verschiebungstabelle zu registrieren
Ein Skript, das die von wercker in der Sicherheitsgruppe verwendete IP-Adresse registriert
[Python] Versuchen Sie, selbst ein Sortierprogramm zu erstellen. (Selektive Sortierung, Sortierung einfügen, Blasensortierung)
Sortieren durch Angabe einer Spalte im Python Numpy-Array.
Versuchen Sie, sich der Teilsumme zu stellen
Machen wir einen Jupyter-Kernel
Verwenden Sie Cloud Composer, um regelmäßig auf die Youtube-API zuzugreifen und eine Pipeline zum Speichern der Ergebnisse in Bigquery zu erstellen
Sogar ein neuer Diplomingenieur kann das! Tipps, um die Synchronisierung durch Auskommentieren zu verbessern
Von nichts unter Ubuntu 18.04 bis zum Einrichten einer Deep Learning-Umgebung auf Tensor
9 Schritte, um in kürzester Zeit Experte für maschinelles Lernen zu werden [Völlig kostenlos]
Versuchen Sie, durch maschinelles Lernen anhand von Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (3).
Versuchen Sie, durch maschinelles Lernen basierend auf Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (1)
Versuchen Sie, durch maschinelles Lernen anhand von Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (4)
Erstellen Sie eine Python-Umgebung, um die Theorie und Implementierung von Deep Learning zu erlernen
Versuchen Sie, durch maschinelles Lernen basierend auf Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (2)
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
Anweisungen zum Verbinden von Google Colab mit der lokalen Laufzeit in einer Windows-Umgebung
So installieren Sie das Deep Learning Framework Tensorflow 1.0 in der Windows Anaconda-Umgebung
Verstärkungslernen 10 Versuchen Sie es mit einem trainierten neuronalen Netz.
Versuchen Sie, den Strombedarf durch maschinelles Lernen vorherzusagen
Verwenden Sie den neuesten Pip in einer virtuellen Umgebung
Kopieren Sie die Liste in Python
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Legen Sie eine feste IP in der Linux-Umgebung fest
Erklären, wie LINE BOT auf einfachste Weise der Welt erstellt werden kann (2) [Vorbereiten der Bot-Anwendung in einer lokalen Umgebung mit Django of Python]
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 01 Memo "Erstellen eines Dialogagenten"
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Registrieren Sie zum ersten Mal eine Aufgabe in cron
Ich möchte mit verstärkendem Lernen einen Berg besteigen
Versuchen Sie, das Bild in einen separaten Thread zu laden (OpenCV-Python).
Versuchen Sie, die in Firefox gespeicherten Anmeldedaten zu entschlüsseln
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
Ich habe eine Klasse erstellt, um das Analyseergebnis von MeCab in ndarray mit Python zu erhalten
So erstellen Sie einen Datensatz, indem Sie eine Beziehung zum geerbten Modell in das von Django geerbte Modell einfügen
Ich möchte die Grafik in 3D sehen! Ich kann einen solchen Traum wahr werden lassen.
Eine Geschichte, die das Debuggen von Modellen in der Django + SQLAlchemy-Umgebung einfacher macht