Python을 사용한 AI – 게임
게임은 전략으로 진행됩니다. 모든 플레이어 나 팀은 게임을 시작하기 전에 전략을 세우고 게임의 현재 상황에 따라 새로운 전략을 변경하거나 구축해야합니다.
검색 알고리즘
위와 동일한 전략으로 컴퓨터 게임도 고려해야합니다. 검색 알고리즘은 컴퓨터 게임의 전략을 파악하는 알고리즘입니다.
작동 원리
검색 알고리즘의 목표는 최종 목적지에 도달하여 승리 할 수 있도록 최적의 동작 세트를 찾는 것입니다. 이러한 알고리즘은 모든 게임에 대해 다른 승리 조건 세트를 사용하여 최상의 동작을 찾습니다.
컴퓨터 게임을 트리로 시각화하십시오. 우리는 나무에 노드가 있다는 것을 알고 있습니다. 루트에서 시작하여 최종 승리 노드에 도달 할 수 있지만 최적의 움직임이 있습니다. 이것이 검색 알고리즘의 작업입니다. 이러한 트리의 모든 노드는 미래 상태를 나타냅니다. 검색 알고리즘은이 트리를 검색하여 게임의 각 단계 또는 노드에서 결정을 내립니다.
조합 검색
검색 알고리즘 사용의 가장 큰 단점은 본질적으로 철저하다는 것입니다. 그래서 전체 검색 공간을 탐색하여 자원 낭비를 초래하는 솔루션을 찾습니다. 이러한 알고리즘이 최종 솔루션을 찾기 위해 전체 검색 공간을 검색해야하는 경우 더 번거로울 것입니다.
이러한 종류의 문제를 제거하기 위해 휴리스틱을 사용하여 검색 공간을 탐색하고 가능한 잘못된 이동을 제거하여 크기를 줄이는 조합 검색을 사용할 수 있습니다. 따라서 이러한 알고리즘은 리소스를 절약 할 수 있습니다. 휴리스틱을 사용하여 공간을 검색하고 리소스를 절약하는 일부 알고리즘은 여기에서 설명합니다.
Minimax 알고리즘
휴리스틱을 사용하여 검색 전략의 속도를 높이는 조합 검색에서 사용하는 전략입니다. Minimax 전략의 개념은 각 플레이어가 상대방의 다음 움직임을 예측하고 그 기능을 최소화하려고 시도하는 두 플레이어 게임의 예를 통해 이해할 수 있습니다. 또한 이기기 위해 플레이어는 항상 현재 상황에 따라 자신의 기능을 극대화하려고 노력합니다.
휴리스틱은 Minimax와 같은 전략에서 중요한 역할을합니다. 트리의 모든 노드에는 이와 관련된 휴리스틱 기능이 있습니다. 그 휴리스틱을 기반으로 가장 많은 혜택을 볼 수있는 노드로 이동하기로 결정해야합니다.
알파-베타 가지 치기
Minimax 알고리즘의 주요 문제는 관련성이없는 트리 부분을 탐색하여 리소스를 낭비 할 수 있다는 것입니다. 따라서 트리의 어느 부분이 관련이 있고 어느 부분이 관련이 없는지 결정하고 관련이없는 부분을 탐색하지 않은 상태로 두는 전략이 있어야합니다. 알파-베타 가지 치기는 그러한 종류의 전략 중 하나입니다.
Alpha-Beta 가지 치기 알고리즘의 주요 목표는 솔루션이없는 트리 부분을 검색하지 않는 것입니다. Alpha-Beta 가지 치기의 주요 개념은 두 개의 경계를 사용하는 것입니다.Alpha, 최대 하한 및 Beta, 최소 상한. 이 두 매개 변수는 가능한 솔루션 세트를 제한하는 값입니다. 현재 노드의 값을 알파 및 베타 매개 변수의 값과 비교하여 솔루션이있는 트리 부분으로 이동하고 나머지는 버릴 수 있도록합니다.
Negamax 알고리즘
이 알고리즘은 Minimax 알고리즘과 다르지 않지만 더 우아한 구현이 있습니다. Minimax 알고리즘 사용의 주요 단점은 두 가지 휴리스틱 함수를 정의해야한다는 것입니다. 이러한 휴리스틱 간의 연결은 한 플레이어의 게임 상태가 좋을수록 다른 플레이어에게는 더 나쁘다는 것입니다. Negamax 알고리즘에서는 두 가지 휴리스틱 함수의 동일한 작업이 단일 휴리스틱 함수의 도움으로 수행됩니다.
게임 플레이를위한 봇 구축
AI에서 2 인용 게임을 플레이하기 위해 봇을 구축하려면 easyAI도서관. 2 인용 게임을 빌드하는 모든 기능을 제공하는 인공 지능 프레임 워크입니다. 다음 명령을 사용하여 다운로드 할 수 있습니다.
pip install easyAI
라스트 코인 스탠딩을하는 봇
이 게임에는 동전 더미가 있습니다. 각 플레이어는 그 더미에서 많은 동전을 가져와야합니다. 게임의 목표는 더미에서 마지막 동전을 가져 가지 않는 것입니다. 우리는 수업을 사용할 것입니다LastCoinStanding 에서 상속 TwoPlayersGame 의 클래스 easyAI도서관. 다음 코드는이 게임에 대한 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
Tic Tac Toe를하는 봇
Tic-Tac-Toe는 매우 친숙하며 가장 인기있는 게임 중 하나입니다. 이 게임을 만들어 보겠습니다.easyAIPython의 라이브러리. 다음 코드는이 게임의 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 = [[1,2,3], [4,5,6], [7,8,9],
[1,4,7], [2,5,8], [3,6,9], [1,5,9], [3,5,7]]
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 .