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
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.
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.
In diesem Blackjack werden wir das Lernen der Verstärkung wie folgt betrachten.
--Umwelt: Blackjack
Führen Sie die folgenden Schritte aus, um Ihre eigene Umgebung in OpenAI Gym zu registrieren.
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.
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.
--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
--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.
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)
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)
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]
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()
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
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
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.
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.