Artificial-intelligence-with-python-gaming
Pythonを使用したAI –ゲーム
ゲームは戦略でプレイされます。 すべてのプレイヤーまたはチームはゲームを開始する前に戦略を立て、ゲームの現在の状況に応じて新しい戦略を変更または構築する必要があります。
検索アルゴリズム
上記と同じ戦略のコンピューターゲームも検討する必要があります。 検索アルゴリズムは、コンピューターゲームの戦略を理解するものであることに注意してください。
使い方
検索アルゴリズムの目標は、最終的な目的地に到達して勝つことができるように、最適な動きのセットを見つけることです。 これらのアルゴリズムは、ゲームごとに異なる勝利条件を使用して、最適な動きを見つけます。
コンピューターゲームをツリーとして視覚化します。 ツリーにはノードがあることがわかっています。 ルートから始めて、最終的な勝者ノードに到達できますが、最適な動きがあります。 それが検索アルゴリズムの仕事です。 そのようなツリーのすべてのノードは、将来の状態を表します。 検索アルゴリズムはこのツリーを検索して、ゲームの各ステップまたはノードで決定を下します。
組み合わせ検索
検索アルゴリズムを使用する主な欠点は、本質的に網羅的であるということです。そのため、検索スペース全体を探索して、リソースの浪費につながる解決策を見つけます。 これらのアルゴリズムが最終的なソリューションを見つけるために検索スペース全体を検索する必要がある場合は、さらに面倒です。
この種の問題を排除するために、ヒューリスティックを使用して検索スペースを探索し、起こりうる誤った動きを排除することでサイズを縮小する組み合わせ検索を使用できます。 したがって、このようなアルゴリズムはリソースを節約できます。 ヒューリスティックを使用してスペースを検索し、リソースを節約するアルゴリズムの一部は、ここで説明されています-
ミニマックスアルゴリズム
これは、組み合わせ検索で使用される戦略であり、ヒューリスティックを使用して検索戦略を高速化します。 ミニマックス戦略の概念は、各プレイヤーが対戦相手の次の動きを予測し、その機能を最小化しようとする2人のプレイヤーゲームの例で理解できます。 また、勝つために、プレイヤーは常に現在の状況に基づいて独自の機能を最大化しようとします。
ヒューリスティックは、ミニマックスのような戦略で重要な役割を果たします。 ツリーのすべてのノードには、それに関連付けられたヒューリスティック関数があります。 そのヒューリスティックに基づいて、最もメリットのあるノードに向かって移動することを決定します。
アルファベータプルーニング
Minimaxアルゴリズムの主な問題は、関係のないツリーの部分を探索でき、リソースの浪費につながることです。 したがって、ツリーのどの部分が関連性があり、どの部分が無関係であるかを決定し、無関係な部分を未探索のままにする戦略が必要です。 アルファベータ枝刈りは、そのような種類の戦略の1つです。
Alpha-Betaプルーニングアルゴリズムの主な目標は、解のないツリーの部分の検索を回避することです。 アルファベータ枝刈りの主な概念は、 Alpha という最大下限と、 Beta という最小上限という2つの境界を使用することです。 これらの2つのパラメーターは、可能なソリューションのセットを制限する値です。 現在のノードの値をアルファおよびベータパラメータの値と比較して、ツリーの解のある部分に移動し、残りを破棄できるようにします。
Negamaxアルゴリズム
このアルゴリズムはMinimaxアルゴリズムと違いはありませんが、より洗練された実装をしています。 Minimaxアルゴリズムを使用する主な欠点は、2つの異なるヒューリスティック関数を定義する必要があることです。 これらのヒューリスティックの関係は、あるプレイヤーにとってゲームの状態が良いほど、他のプレイヤーにとっては悪いということです。 Negamaxアルゴリズムでは、1つのヒューリスティック関数を使用して、2つのヒューリスティック関数の同じ作業が行われます。
ゲームをプレイするためのボットの構築
AIで2つのプレイヤーゲームをプレイするボットを構築するには、 easyAI ライブラリをインストールする必要があります。 これは、2プレーヤーゲームを構築するためのすべての機能を提供する人工知能フレームワークです。 あなたは、次のコマンドの助けを借りてそれをダウンロードすることができます-
pip install easyAI
最後のコイン立ちをするボット
このゲームでは、コインの山があります。 各プレイヤーは、その山からいくつかのコインを取る必要があります。 このゲームの目標は、山の最後のコインを取るのを避けることです。 easyAI ライブラリーの TwoPlayersGame クラスから継承した LastCoinStanding クラスを使用します。 次のコードは、このゲームのPythonコードを示しています-
示されているように必要なパッケージをインポートします-
from easyAI import TwoPlayersGame, id_solve, Human_Player, AI_Player
from easyAI.AI import TT
今、ゲームのすべての操作を処理するために TwoPlayerGame クラスからクラスを継承します-
class LastCoin_game(TwoPlayersGame):
def __init__(self, players):
次に、プレーヤーとゲームを開始するプレーヤーを定義します。
self.players = players
self.nplayer = 1
次に、ゲーム内のコインの数を定義します。ここでは、ゲームに15個のコインを使用しています。
self.num_coins = 15
プレーヤーが手札に入れることができるコインの最大数を定義します。
self.max_coins = 4
次のコードに示すように、定義する特定の事項がいくつかあります。 可能な動きを定義します。
def possible_moves(self):
return [str(a) for a in range(1, self.max_coins + 1)]
コインの除去を定義する
def make_move(self, move):
self.num_coins -= int(move)
誰が最後のコインを取ったかを定義します。
def win_game(self):
return self.num_coins <= 0
ゲームを停止するタイミング、つまり誰かが勝つタイミングを定義します。
def is_over(self):
return self.win()
スコアの計算方法を定義します。
def score(self):
return 100 if self.win_game() else 0
パイルに残っているコインの数を定義します。
def show(self):
print(self.num_coins, 'coins left in the pile')
if __name__ == "__main__":
tt = TT()
LastCoin_game.ttentry = lambda self: self.num_coins
次のコードブロックでゲームを解く-
r, d, m = id_solve(LastCoin_game,
range(2, 20), win_score=100, tt=tt)
print(r, d, m)
誰がゲームを開始するかを決定する
game = LastCoin_game([AI_Player(tt), Human_Player()])
game.play()
次の出力とこのゲームの簡単なプレイを見つけることができます-
d:2, a:0, m:1
d:3, a:0, m:1
d:4, a:0, m:1
d:5, a:0, m:1
d:6, a:100, m:4
1 6 4
15 coins left in the pile
Move #1: player 1 plays 4 :
11 coins left in the pile
Player 2 what do you play ? 2
Move #2: player 2 plays 2 :
9 coins left in the pile
Move #3: player 1 plays 3 :
6 coins left in the pile
Player 2 what do you play ? 1
Move #4: player 2 plays 1 :
5 coins left in the pile
Move #5: player 1 plays 4 :
1 coins left in the pile
Player 2 what do you play ? 1
Move #6: player 2 plays 1 :
0 coins left in the pile
チックタックトーをプレイするボット
三目並べは非常に親しみやすく、最も人気のあるゲームの1つです。 Pythonで easyAI ライブラリを使用してこのゲームを作成しましょう。 次のコードは、このゲームのPythonコードです-
示されているようにパッケージをインポートします-
from easyAI import TwoPlayersGame, AI_Player, Negamax
from easyAI.Player import Human_Player
*TwoPlayerGame* クラスからクラスを継承して、ゲームのすべての操作を処理します-
class TicTacToe_game(TwoPlayersGame):
def __init__(self, players):
今、プレイヤーとゲームを開始しようとしているプレイヤーを定義します-
self.players = players
self.nplayer = 1
ボードの種類を定義します-
self.board = [0] * 9
今、次のように定義するいくつかの特定のものがあります-
可能な動きを定義する
def possible_moves(self):
return [x + 1 for x, y in enumerate(self.board) if y == 0]
プレーヤーの動きを定義する-
def make_move(self, move):
self.board[int(move) - 1] = self.nplayer
AIを後押しするには、プレイヤーがいつ動きをするかを定義します-
def umake_move(self, move):
self.board[int(move) - 1] = 0
対戦相手が3人並んでいるという敗北条件を定義する
def condition_for_lose(self):
possible_combinations = [[return any([all([(self.board[z-1] == self.nopponent)
for z in combination]) for combination in possible_combinations])
ゲームの終了のチェックを定義する
def is_over(self):
return (self.possible_moves() == []) or self.condition_for_lose()
ゲーム内のプレイヤーの現在の位置を表示する
def show(self):
print('\n'+'\n'.join([' '.join([[O', 'X'][self.board[3*j + i]]
for i in range(3)]) for j in range(3)]))
スコアを計算します。
def scoring(self):
return -100 if self.condition_for_lose() else 0
アルゴリズムを定義し、ゲームを開始する主な方法を定義します-
if __name__ == "__main__":
algo = Negamax(7)
TicTacToe_game([Human_Player(), AI_Player(algo)]).play()
次の出力とこのゲームの簡単なプレイを見ることができます-
. . .
. . .
. . .
Player 1 what do you play ? 1
Move #1: player 1 plays 1 :
O . .
. . .
. . .
Move #2: player 2 plays 5 :
O . .
. X .
121
. . .
Player 1 what do you play ? 3
Move #3: player 1 plays 3 :
O . O
. X .
. . .
Move #4: player 2 plays 2 :
O X O
. X .
. . .
Player 1 what do you play ? 4
Move #5: player 1 plays 4 :
O X O
O X .
. . .
Move #6: player 2 plays 8 :
O X O
O X .
. X .