Compare commits
3 Commits
8d4cb47c57
...
1e0559f386
| Author | SHA1 | Date | |
|---|---|---|---|
| 1e0559f386 | |||
| 5232310e3e | |||
| 45edb546f7 |
39
nimm.py
39
nimm.py
@ -13,7 +13,10 @@ def optimal_move():
|
|||||||
return n
|
return n
|
||||||
return random.randint(1, 3) # Wenn keine perfekte Wahl, dann irgendein Zug
|
return random.randint(1, 3) # Wenn keine perfekte Wahl, dann irgendein Zug
|
||||||
|
|
||||||
def ki_move():
|
def random_move():
|
||||||
|
return random.randint(1, 3)
|
||||||
|
|
||||||
|
def ki_move(lastMove, better_version):
|
||||||
global state
|
global state
|
||||||
antiMoves = lostMoves.get(state)
|
antiMoves = lostMoves.get(state)
|
||||||
if antiMoves == None:
|
if antiMoves == None:
|
||||||
@ -24,6 +27,10 @@ def ki_move():
|
|||||||
for i, good in enumerate(availableMoves):
|
for i, good in enumerate(availableMoves):
|
||||||
if good:
|
if good:
|
||||||
return i + 1
|
return i + 1
|
||||||
|
|
||||||
|
# Es gibt keine guten Züge mehr, also muss der letzte Zug schlecht gewesen sein.
|
||||||
|
if better_version:
|
||||||
|
addLostMove(lastMove.state, lastMove.move)
|
||||||
return random.randint(1, 3)
|
return random.randint(1, 3)
|
||||||
|
|
||||||
def makeMove(move): # gibt True zurück, wenn der Spieler verloren hat
|
def makeMove(move): # gibt True zurück, wenn der Spieler verloren hat
|
||||||
@ -39,23 +46,23 @@ def addLostMove(state, move):
|
|||||||
if moves == None:
|
if moves == None:
|
||||||
moves = []
|
moves = []
|
||||||
moves.append(move)
|
moves.append(move)
|
||||||
|
lostMoves[state] = moves
|
||||||
|
|
||||||
def game(train):
|
def game(train, opponent, better_version):
|
||||||
global state
|
global state
|
||||||
state = 12
|
state = 12
|
||||||
lastMove = None
|
lastMove = None
|
||||||
while True:
|
while True:
|
||||||
# KI beginnt, sonst kann sie nicht gewinnen
|
# KI beginnt, sonst kann sie nicht gewinnen
|
||||||
move = ki_move()
|
move = ki_move(lastMove, better_version)
|
||||||
lost = makeMove(move)
|
lost = makeMove(move)
|
||||||
if lost:
|
if lost:
|
||||||
if train:
|
if train:
|
||||||
addLostMove(state + move, move)
|
addLostMove(state + move, move)
|
||||||
addLostMove(lastMove.state, lastMove.move)
|
|
||||||
return 0 # optimale Strategie hat gewonnen
|
return 0 # optimale Strategie hat gewonnen
|
||||||
lastMove = Move(state + move, move)
|
lastMove = Move(state + move, move)
|
||||||
|
|
||||||
move = optimal_move()
|
move = opponent()
|
||||||
lost = makeMove(move)
|
lost = makeMove(move)
|
||||||
if lost:
|
if lost:
|
||||||
return 1 # KI hat gewonnen
|
return 1 # KI hat gewonnen
|
||||||
@ -64,13 +71,19 @@ state = 12
|
|||||||
lostMoves = {}
|
lostMoves = {}
|
||||||
|
|
||||||
# train
|
# train
|
||||||
for _ in range(1000):
|
opponents = [random_move, optimal_move]
|
||||||
game(True)
|
for ki_version in [False, True]:
|
||||||
|
for train_opponent in opponents:
|
||||||
|
for eval_opponent in opponents:
|
||||||
|
ki_text = "optimale Version" if ki_version else "erste Version"
|
||||||
|
print(f"KI: {ki_text} trainiert mit {train_opponent.__name__} und evaluiert mit {eval_opponent.__name__}")
|
||||||
|
for _ in range(1000):
|
||||||
|
game(train=True, opponent=train_opponent, better_version=ki_version)
|
||||||
|
|
||||||
# eval
|
# eval
|
||||||
numberEvalGames = 100000
|
numberEvalGames = 100000
|
||||||
wonGames = 0
|
wonGames = 0
|
||||||
for _ in range(numberEvalGames):
|
for _ in range(numberEvalGames):
|
||||||
wonGames += game(False)
|
wonGames += game(False, opponent=eval_opponent, better_version=ki_version)
|
||||||
|
|
||||||
print(f"Die KI hat {wonGames / numberEvalGames * 100}% der Spiele gewonnen.")
|
print(f"Die KI hat {wonGames / numberEvalGames * 100}% der Spiele gewonnen.\n")
|
||||||
|
|||||||
Reference in New Issue
Block a user