ほぼコピペですが、みていきます。。。
https://www.kaggle.com/learn/intro-to-game-ai-and-reinforcement-learning
導入
コネクトフォーは、2人のプレイヤーが交互に色付きのディスクを縦のグリッドに落とすゲームです。各プレイヤーは異なる色(通常は赤または黄色)を使用し、ゲームの目的は、4つのディスクを一列に並べることができる最初のプレイヤーになることです。
このコースでは、ゲームをプレイするための独自のインテリジェントなエージェントを構築します。
最初のレッスンでは、ゲーム環境を設定し、最初のエージェントを作成する方法を学びます。
次の2つのレッスンは、ゲームAIを構築するための伝統的な方法に焦点を当てています。これらのエージェントは、多くの初心者のプレイヤーを打ち負かすのに十分賢いです!
最後のレッスンでは、強化学習の分野からの最先端のアルゴリズムを試します。あなたが構築するエージェントは、人間がするようにゲームプレイの戦略を考え出します。
スタートガイド
ゲーム環境には、あらかじめ実装されたエージェントが備わっています。これらのデフォルトのエージェントのリストを表示するには、次のコマンドを実行してください。
from kaggle_environments import make, evaluate
Create the game environment
Set debug=True to see the errors if your agent refuses to run
env = make("connectx", debug=True)
List of available default agents
print(list(env.agents))
Loading environment lux_ai_s2 failed: No module named 'vec_noise'
['random', 'negamax']
"random"エージェントは、有効な動きのセットから一様にランダムに選択します。コネクトフォーでは、ディスクを置くスペースが列にまだある場合(つまり、ボードに7行ある場合、列には7枚未満のディスクがある場合)、移動は有効と見なされます。
以下のコードセルでは、このエージェントが自分自身のコピーと対戦する1ゲームラウンドをプレイします。
# Two random agents play one game round
env.run(["random", "random"])
Show the game
env.render(mode="ipython")
上のプレイヤーを使用して、ゲームの詳細を表示できます。この情報は、エージェントを改善する方法を考える際に非常に役立ちます。
エージェントの定義
コンペティションに参加するために、独自のエージェントを作成します。
あなたのエージェントは、obsとconfigの2つの引数を受け入れるPython関数として実装する必要があります。それは選択された列の整数を返します。インデックスはゼロから始まります。したがって、返される値は0-6のいずれかです。
いくつかの例を始めて、文脈を提供します。以下のコードセルでは:
最初のエージェントは上の"random"エージェントとまったく同じ動作をします。
2番目のエージェントは常に中央の列を選択します、それが有効であるかどうかに関係なく!エージェントが無効な動きを選択した場合、そのゲームを失うことに注意してください。
3番目のエージェントは、最も左の有効な列を選択します。
import random
import numpy as np
In [4]:
# Selects random valid column
def agent_random(obs, config):
valid_moves = [col for col in range(config.columns) if obs.board[col] == 0]
return random.choice(valid_moves)
Selects middle column
def agent_middle(obs, config):
return config.columns//2
Selects leftmost valid column
def agent_leftmost(obs, config):
valid_moves = [col for col in range(config.columns) if obs.board[col] == 0]
return valid_moves[0]
それでは、具体的にobsとconfigは何ですか?
obs
obsには2つの情報が含まれています:
obs.board - ゲームボード(各グリッドの位置ごとに1つのアイテムを持つPythonのリスト)
obs.mark - エージェントに割り当てられたピース(1または2のいずれか)
obs.boardは、ディスクの位置を示すPythonのリストであり、最初の行が最初に表示され、次に2行目が表示される、というようになっています。プレイヤー1のディスクを追跡するために1を使用し、プレイヤー2のディスクを追跡するために2を使用します。例として、このゲームボードについて:
obs.board would be [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 2, 1, 2, 0, 2, 0].
config
configには3つの情報が含まれています:
config.columns - ゲームボードの列数(Connect Fourの場合は7)
config.rows - ゲームボードの行数(Connect Fourの場合は6)
config.inarow - 勝利するためにプレイヤーが一列に取得する必要があるピースの数(Connect Fourの場合は4)
上で定義した3つのエージェントを調査する時間をとってください。コードが理解できることを確認してください!
エージェントの評価
カスタムエージェントが1ゲームラウンドをプレイさせるには、以前と同じenv.run()メソッドを使用します。
# Agents play one game round
env.run([agent_leftmost, agent_random])
Show the game
env.render(mode="ipython")
一つのゲームの結果だけでは、エージェントがどれくらいの性能を発揮するかを把握するのに十分な情報は得られません。より良い考えを得るために、各エージェントの勝率を複数のゲームで平均して計算します。公平を期すため、各エージェントは半分の時間を先手で行います。
これを行うために、get_win_percentages()関数(隠されたコードセルで定義)を使用します。この関数の詳細を表示するには、以下の"Code"ボタンをクリックしてください。
def get_win_percentages(agent1, agent2, n_rounds=100):
# Use default Connect Four setup
config = {'rows': 6, 'columns': 7, 'inarow': 4}
# Agent 1 goes first (roughly) half the time
outcomes = evaluate("connectx", [agent1, agent2], config, [], n_rounds//2)
# Agent 2 goes first (roughly) half the time
outcomes += [[b,a] for [a,b] in evaluate("connectx", [agent2, agent1], config, [], n_rounds-n_rounds//2)]
print("Agent 1 Win Percentage:", np.round(outcomes.count([1,-1])/len(outcomes), 2))
print("Agent 2 Win Percentage:", np.round(outcomes.count([-1,1])/len(outcomes), 2))
print("Number of Invalid Plays by Agent 1:", outcomes.count([None, 0]))
print("Number of Invalid Plays by Agent 2:", outcomes.count([0, None]))
ランダムエージェントに対してどのエージェントがより優れていると思いますか:常に中央でプレイするエージェント(agent_middle)、または最も左の有効な列を選択するエージェント(agent_leftmost)?調べてみましょう!
get_win_percentages(agent1=agent_middle, agent2=agent_random)
Agent 1 Win Percentage: 0.65
Agent 2 Win Percentage: 0.0
Number of Invalid Plays by Agent 1: 35
Number of Invalid Plays by Agent 2: 0
In [8]:
get_win_percentages(agent1=agent_leftmost, agent2=agent_random)
Agent 1 Win Percentage: 0.82
Agent 2 Win Percentage: 0.18
Number of Invalid Plays by Agent 1: 0
Number of Invalid Plays by Agent 2: 0
最も左の有効な列を選択するエージェントが最も良い性能を発揮しているようです!