Q-Learning am Beispiel 4-gewinnt
Verfasst: Montag 2. März 2020, 15:36
Guten Tag zusammen!
Ich habe mich letztens damit beschäftigt, ein 4-gewinnt Spiel mit Python zu programmieren. Es ist lediglich in der Konsole, funktioniert aber auch soweit. Jetzt kam mir in den Sinn, dass ich dafür einen perfekten Gegenspieler programmiere, weil ich es faszinierend finde wie Computer "lernen" können. Allerdings verstehe ich auch nach mehreren Videos wie z.B. von Sentex und Websiten z.B. https://www.learndatasci.com nicht wie genau ich das jetzt auf mein eigenes Programm übertragen kann. In den Fällen, die ich gefunden habe, ist das Environment immer schon vorgegeben, was ich bei meinem Code nicht habe.
Also der Plan war es, zwei Agents gegeneinander spielen zu lassen und diese sich dabei immer weiter verbessern. Hierbei gibt es für jeden Zug -1 bei den Rewards, für eine Niederlage -100, für einen Sieg +100 und für ein Unentschieden +10. Jedoch verstehe ich nicht, wie genau ich dies in eine Q-Tabelle fassen soll und der Agent daraus lernt (bzw. die Formel dahinter). Ich hatte gedacht, dass für den State einfach das Feld nehmen könne.
Ich hoffe sehr darauf, dass ihr mir dabei helfen könntet Q-Learning an meinem Programm anzuwenden, bzw. mir Tipps zu geben wie es geht
.
Das Spielfeld liegt folgend vor:
SpielInhalt = [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0,0, 0, 0], [0, 0, 0, 0,0, 0, 0]
, wobei jede Dimension eine Reihe darstellt. Je nach Spieler wird eine 1 bzw. 2 eingetragen.
Ich habe mich letztens damit beschäftigt, ein 4-gewinnt Spiel mit Python zu programmieren. Es ist lediglich in der Konsole, funktioniert aber auch soweit. Jetzt kam mir in den Sinn, dass ich dafür einen perfekten Gegenspieler programmiere, weil ich es faszinierend finde wie Computer "lernen" können. Allerdings verstehe ich auch nach mehreren Videos wie z.B. von Sentex und Websiten z.B. https://www.learndatasci.com nicht wie genau ich das jetzt auf mein eigenes Programm übertragen kann. In den Fällen, die ich gefunden habe, ist das Environment immer schon vorgegeben, was ich bei meinem Code nicht habe.
Also der Plan war es, zwei Agents gegeneinander spielen zu lassen und diese sich dabei immer weiter verbessern. Hierbei gibt es für jeden Zug -1 bei den Rewards, für eine Niederlage -100, für einen Sieg +100 und für ein Unentschieden +10. Jedoch verstehe ich nicht, wie genau ich dies in eine Q-Tabelle fassen soll und der Agent daraus lernt (bzw. die Formel dahinter). Ich hatte gedacht, dass für den State einfach das Feld nehmen könne.
Ich hoffe sehr darauf, dass ihr mir dabei helfen könntet Q-Learning an meinem Programm anzuwenden, bzw. mir Tipps zu geben wie es geht

Das Spielfeld liegt folgend vor:
SpielInhalt = [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0,0, 0, 0], [0, 0, 0, 0,0, 0, 0]
, wobei jede Dimension eine Reihe darstellt. Je nach Spieler wird eine 1 bzw. 2 eingetragen.
Code: Alles auswählen
import random
import numpy as np
SpielInhalt = [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0,0, 0, 0], [0, 0, 0, 0,0, 0, 0]
SpielerListe = [[input("Spielername Spieler 1:"), 1], [input("Spielername Spieler 2:"), 2]]
# Setzen
ZugRecht = 0
def Zugfrage():
Auswahl = True
global ZugRecht, SpalteChoosen, Spieler
Spieler = ZugRecht % 2
while Auswahl:
#SpalteChoosen = input("{}, du bist dran. Welche Spalte waehlst du (1-7)?".format(SpielerListe[Spieler][0]))
SpalteChoosen = random.randrange(1, 8, 1)
SpalteChoosen = str(SpalteChoosen)
if SpalteChoosen.isdigit():
SpalteChoosen = int(SpalteChoosen)
if SpalteChoosen >= 1 and SpalteChoosen <= 7:
Auswahl = False
SpalteChoosen -= 1
Platzieren()
else:
print("Deine Eingabe war nicht in dem genannten Bereich, versuche es erneut.")
else:
print("Die Eingabe war keine Zahl, versuche es erneut.")
def Platzieren():
Feld = [0,0]
global Spieler, SpalteChoosen, Auswahl, ZugRecht
if SpielInhalt[0][SpalteChoosen] == 0:
for Reihe in range(1, 7, 1):
if SpielInhalt[Reihe - 1][SpalteChoosen] == 0:
if Reihe == 6:
SpielInhalt[Reihe - 1][SpalteChoosen] = SpielerListe[Spieler][1]
Feld = [SpalteChoosen, Reihe - 1]
else:
SpielInhalt[Reihe - 2][SpalteChoosen] = SpielerListe[Spieler][1]
Feld = [SpalteChoosen, Reihe - 2]
break
for FeldReihe in SpielInhalt:
print(FeldReihe)
print("---------------------")
else:
print("Das ist leider nicht moeglich. Probiere eine andere Spalte")
Zugfrage()
# Hat Reihe gewonnen?
ReihenCounter = 0
for NF_Reihe in range(Feld[0] - 3, Feld[0] + 4, 1):
if not NF_Reihe <= -1 and not NF_Reihe >= 7:
if SpielInhalt[Feld[1]][NF_Reihe] == SpielerListe[Spieler][1]:
#print(NF_Reihe,Feld[1], SpielInhalt[Feld[1]][NF_Reihe], SpielerListe[Spieler][1], ReihenCounter+1 )
ReihenCounter += 1
if ReihenCounter >= 4:
break
else:
ReihenCounter = 0
# Hat Spalte gewonnen?
SpaltenCounter = 0
for NF_Spalte in range(Feld[1] - 3, Feld[1] + 4, 1):
if not NF_Spalte <= -1 and not NF_Spalte >= 6:
if SpielInhalt[NF_Spalte][Feld[0]] == SpielerListe[Spieler][1]:
SpaltenCounter += 1
if SpaltenCounter >= 4:
break
else:
SpaltenCounter = 0
# Hat Diagonale gewonnen?
DiagonalenCounterOben = 0
DiagonalenCounterUnten = 0
for DiaOben in range(-3, 4, 1):
if not Feld[0] + DiaOben <= -1 and not Feld[0] + DiaOben >= 7 and not Feld[1] + DiaOben <= -1 and not Feld[
1] + DiaOben >= 6:
if SpielInhalt[Feld[1]+DiaOben][Feld[0]+DiaOben] == SpielerListe[Spieler][1]:
DiagonalenCounterOben += 1
if DiagonalenCounterOben >= 4:
break
else:
DiagonalenCounterOben = 0
for DiaUnten in range(-3, 4, 1):
if not Feld[0] - DiaUnten <= -1 and not Feld[0] - DiaUnten >= 7 and not Feld[1] + DiaUnten <= -1 and not Feld[
1] + DiaUnten >= 6:
if SpielInhalt[Feld[1]+DiaUnten][Feld[0]-DiaUnten] == SpielerListe[Spieler][1]:
DiagonalenCounterUnten += 1
if DiagonalenCounterUnten >= 4:
break
else:
DiagonalenCounterUnten = 0
# Gewonnen?
if ReihenCounter >= 4 or SpaltenCounter >= 4 or DiagonalenCounterOben >= 4 or DiagonalenCounterUnten >= 4:
print("{} hat gewonnen!".format(SpielerListe[Spieler][0]))
else:
fertig = True
for i in range(0,6,1):
for Elements in SpielInhalt[i]:
if Elements == 0:
fertig = False
break
if fertig:
print("Unentschieden! Es gibt keinen Sieger")
else:
ZugRecht += 1
Zugfrage()
Zugfrage()