체커 / 드래프트에 AI를 구현하는 방법은 무엇입니까?


21

체커 게임을 보고 AI가 어떻게 구현되었는지 궁금했습니다.

체커 (daughts, dama, dame)를 위한 AI를 어떻게 구현해야 합니까? 알려진 알고리즘이 있습니까?


매우 thnaks는 모두에게 가득. 이 Tic Tac Toe 게임 튜토리얼 블로그 게시물 을 보게되어 매우 기쁩니다 .

그래서, 나는 dama 게임 알고리즘 오픈 소스 코드와 블로그 게시물을 원합니다 . 유용한 링크 나 문서 파일이 있습니까? 알려주세요 ..


정확히 무엇을 알고 싶습니까? 체커 (또는 Draughts / Dame / Dama)를 위해 AI를 구현하는 방법은 무엇입니까?
bummzack

나중에, 정확히 .. Dama를 위해 AI를 구현해야합니다. 시작하는 방법 ..? 당신이 도움을 기쁘게 할 수 나 .. 난 단지 물리학 기반의 게임에서 경험을 .. 감사합니다 ..이
솔리드 소프트

오픈 소스 체커 를 찾기 위해 인터넷을 검색하면 몇 가지 결과가 나왔습니다. 여기 에 파이썬자바가 있습니다 ... 그것을 기반으로 작동하는 것을 너무 어렵지 않아야합니까?
bummzack

고맙습니다 tetrad .. 나는 그것의 규칙을 잊어 버리고 이것을 답변으로 게시합니다 .. Thanks ..
Solid Soft

답변:


28

아, 나는이 게임을 좋아한다!

컴퓨터가 게임을하기 위해서는 먼저 다음 사항이 필요합니다.

  1. 작업 할 구조
  2. 따라야 할 규칙
  3. 에 대한 승리 조건

한 번에이 조각을 다루겠습니다.


구조

보드는 8x8 그리드 (그러나 쉽게 확장 가능)이므로 각 그리드 공간은 5 가지 상태 중 하나에 만 존재할 수 있으므로 해당 상태를 정의 해 보겠습니다.

[EMPTY, WHITE_PIECE, BLACK_PIECE, WHITE_PIECE_PROMOTED, BLACK_PIECE_PROMOTED]

각각 다음과 같은 ENUM :

[0, 1, 2, 3, 4]

이제 우리는 각 공간이 무엇인지 알았으므로 모든 공간을 나타내는 방법이 필요합니다. 거의 모든 강력한 언어는 다차원 배열 (각 요소가 데이터를 보유하는 배열 인 배열)을 지원합니다. 따라서 배열을 정의하려면 다음 슬랙 코드를 사용하십시오.

BOARD_ARRAY = array(8, 8)

이것은 우리에게 정수 (이전의 열거 형)를 저장할 수있는 8 x 8 배열을 제공합니다 :

(
[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, 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],
[2, 2, 2, 2, 2, 2, 2, 2],
[2, 2, 2, 2, 2, 2, 2, 2],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0],
)

(2는 'BLACK_PIECE'를 나타내고 1은 'WHITE_PIECE'를 나타냅니다.)

이제 컴퓨터에는 작업 할 구조가 있습니다. 1 단계 완료!


규칙

마스터 플레이어와 대결하여 실제 보드를 설정했다고 가정 해 봅시다. 그의 조각 중 하나를 움직이려고하면 손이 get니다. 당신이 할 수 없었던 방식으로 조각을 이동하려고하면 손을 때릴 것입니다. 당신이 속임수를 쓰려고 노력했다면 ... 그러나 문제는 컴퓨터가 그렇지 않다는 것입니다. 따라서 엄격한 규칙을 제공하는 것이 우리의 임무 입니다.

주어진 움직임이 '법적'인지 확인하는 방법을 만들어야합니다. 즉, 먼저 '이동'을 나타내는 방법이 필요합니다. 한 가지 방법은 배열 위치를 사용하는 것입니다. 예를 들어 조각을 [0, 0]에서 [0, 1]로 이동하려면 해당 이동에 따라 보드를 업데이트하는 함수를 만들 수 있습니다. 슬랙으로 돌아 가기 :

MY_MOVE = array( [0, 0], [0, 1] )

위의 내용은 보드의 상단 모서리에서 한 칸 아래로 움직이는 한 조각을 나타냅니다 (0, 0이 왼쪽 상단 모서리라고 가정). 이동에 다차원 배열을 사용하기로 선택했을 수도 있습니다. 이것은 조각이 이론적으로 한 번에 많은 횟수만큼 움직일 수 있기 때문입니다 (다른 조각을 '점프'하기 위해). 따라서 0, 1을 척합시다. 상대방 조각이있었습니다. 즉, 우리는 0, 2에 착륙 할 것입니다.

MY_MOVE = array( [0, 0], [0, 2] )

꽤 간단합니다. 프로그램은 우리가 공간을 건너 뛰면 다른 조각을 뛰어 넘고 있다는 것을 이해해야합니다. 그렇지 않으면 불법적 인 움직임이므로 오류가 발생해야합니다. 이제 두 조각으로 넘어 갑시다.

MY_MOVE = array ( [0, 0], [0, 2], [0, 4] )

이것은 우리에게 보드의 움직임을 설명 할 수있는 방법을 제공합니다. 예이! 문제의 정확한 게임 규칙을 완전히 이해하지 못했기 때문에 (내일은 약간의 캐나다 체커를했지만) 정확한 이동 합법성은 귀하가 정의해야합니다. 이 시점까지의 좋은 흐름은 다음과 같습니다.

FUNCTION_FIND_ALL_LEGAL_MOVES( MY_BOARD ) Returns: array ALL_LEGAL_MOVES
FUNCTION_FIND_BEST_MOVE( MY_BOARD, ALL_LEGAL_MOVES ) Returns: array MY_MOVE
FUNCTION_DO_MOVE( MY_BOARD, MY_MOVE ) Throws: error ILLEGAL_MOVE Updates: MY_BOARD
repeat from start for each turn

위의 내용은 각 조각을 순환하여 합법적 인 모든 움직임을 찾은 다음 모든 합법적 인 움직임을 수집하면 어떻게 든 가장 좋은 것을 선택합니다 (여기서 전략). 그런 다음 이동이 보드에 적용되거나 오류가 발생합니다. 그런 다음 다음 플레이어가 차례를 따릅니다. 게임 방법을 아는 AI가 있습니다! 즐거움! 계속합니다.


승리

승리는 매우 간단한 상태로 정의되기 때문에 간단한 게임은 훌륭합니다. 보드에 흰색 조각이 없습니까? 네가 이겼을 것 같아! 이것은 우리가 승리 조건에 더 가까워 지도록 최선의 움직임을 선택할 때 2 단계에서 구현됩니다.

매우 지능적인 AI를 만들기 위해 가능한 모든 보드를 상태로 저장하고 가능한 모든 상태에서 가능한 모든 이동을 통해 승리를 향한 사슬을 찾을 수 있습니다.

다음과 같은 전략을 만들 수도 있습니다. 점프 할 조각이있는 경우 해당 조각을 저장하거나 조각이 다른 조각을 뛰어 넘을 수있는 경우 해당 점프를 수행합니다.


그것은 당신에게 좋은 점프 오프 포인트를 줄 것입니다, 그것은 문자 그대로 무제한 가능성의 유일한 방법입니다. 이론적으로 거대한 로봇을 만들어 크레용으로 그림을 그린 다음 그림에서 스펙트럼 분석을 수행하여 움직임을 선택할 수는 있지만 매우 좋지 않거나 빠르지는 않습니다. 이 방법은 과거에 효과가 있었고 잘 작동했습니다 (: 희망이 도움이됩니다!


구현에 관한 몇 마디

체커는 '해결 된'게임으로, 알려지지 않은 모든 움직임을 계산할 수 있습니다. 그러나 그것은 완전히 움직입니다! 따라서 수동으로 할 수있는 방법은 없습니다. 일부만 있다면 ... 오, 우리는 프로그래머입니다. 주먹 펌프

SQL은 이러한 모든 끝없는 움직임을 저장하는 훌륭한 도구입니다. SQL에 대한 경험이없는 사람들을 위해 mySQL은 무료이며 (사용하기 쉬운) 오픈 소스 SQL 서버입니다. SQL은 스테로이드의 스프레드 시트와 같은 데이터베이스 관리에 사용됩니다. 또한 대량의 데이터를 보유하고 매우 빠르게 작업 할 수 있습니다.

우리는 이것을 어떻게 사용할 수 있습니까? 우리는 보드가 정확한 상태에 있다면 (각 부분이 특정 위치에 있음) 사용 가능한 모든 동작을 계산하고 저장할 수 있습니다. 예를 들면 다음과 같습니다.

+Board State+          +All Possible Moves+               +Best Move+
([0,0,1,2,3],[3..)     ([0,1],[0,2]), ([7,6],[7,7],[5..)  ([7,6],[7,7])
([0,0,2,2,3],[3..)     ([0,1],[0,2]), ([7,6],[7,7],[5..)  ([5,5],[5,4])
([0,0,1,3,3],[3..)     ([0,1],[0,2]), ([7,6],[7,7],[5..)  ([4,4],[4,3])
etc...

따라서 컴퓨터가 이동해야 할 때 데이터베이스에서 보드 상태 (기본 키로 저장 됨)를 조회하고 가장 이동이 잦은 (무적이어야 함) 선택하거나 다른 이동 중 하나를 선택하여보다 친숙하게 만들 수 있습니다. 일체 포함.

이제이 데이터베이스를 구축하겠습니다. 먼저 모든 보드 상태를 계산해야합니다. 누군가가 약간의 시간을 보내고 그것을 끝내고 싶다면 멋진 큰 불쾌한 고리로 할 수 있습니다. 배열을 하나의 큰 숫자로 본 다음베이스 5 (0, 1, 2, 3, 4)를 제외하고 위쪽으로 세고 각 플레이어는 16 개만 가질 수 있습니다.

이 시점에서 모든 보드 상태를 저장해야하며 가능한 모든 이동을 계산할 수 있습니다.

모든 가능한 움직임이 계산되면 가장 좋은 움직임을 길 찾기의 재미있는 부분이됩니다. 여기에서 제 지식이 부족해지기 시작하고 Minimax 또는 A *와 같은 것들이 시작됩니다. 더 이상 도움이 될 수 없습니다 : /


4
당신은 훌륭한 게시물에 많은 노력을 기울였습니다. 그러나 AI 구현 방법에 대한 질문에는 대답하지 않습니다. 당신이 그것에 대해 조금 더 자세히 설명하거나 적절한 링크를 제공한다면 당신의 대답은 약간의
찬사를

어떤 방법으로 정교하게? (저도 행복 할 것입니다) 같은 페이지에 있는지 확인하고 싶습니다. MVC 모델로 구현합니까? 어떤 맥락에서? 개념에는 좋고 단어에 대해서는 좋지 않습니다.
Adrian Seeley

제가 의미하는 바는 CiscoIPPhone이 게시 한 내용과 같습니다. 실제로 AI를 실제로 구현하여 실제로 당신과 대결하도록하는 방법 :)
bummzack

노력 +1 예. 실제 AI 로직을 구현하는 데 특히 구현 관점에서 매우 관심이 있습니다.
Legend

Ahh, gotchya, 지금 내가 쓸 수있는 유일한 방법은 SQL 데이터베이스를 사용하는 것입니다 ... 그래서 우리는 이것이 어떻게 나오는지 보게 될 것입니다 ...
Adrian Seeley

31

게임의 어느 시점에서든 플레이어의 가능한 움직임의 양은 상당히 낮습니다 * (약 5) 이것은 앞으로 몇 가지 움직임을 생각하고 가능한 모든 움직임을 평가하고 최상의 움직임을 선택하는 것이 가능하다는 것을 의미합니다.

이 접근법을 minimax (wikipedia) 라고 합니다.

minimax를 구현하려면 주어진 보드 레이아웃과 플레이어에 대한 점수를 반환하는 평가 기능이 필요합니다. 드래프트의 경우 순진한 구현은 플레이어가 살아있는 모든 조각에 대해 하나의 포인트를 반환하는 함수입니다.

미니 맥스 결정 트리

minimax 의사 결정 트리의 시각화 (wikipedia 기사에서) 왼쪽 아래에는 턴 번호가 있습니다. 리프 노드는 각각 평가 된 점수를 가지고 결정을하기 위해 트리로 피드백됩니다.

*그러나 드래프트는 완전히 해결 된 가장 높은 분기 계수를 가진 게임입니다 .


3
이것이 내가 스택을 좋아하는 이유이고, 필요한 이론을 게시했으며, 어떤 이론을 도입하기 위해 큰 구멍이있는 애플리케이션을 게시했습니다. <3 Stack
Adrian Seeley

5

알파-베타 프 루닝은 검색 트리에서 minimax 알고리즘에 의해 평가되는 노드 수를 줄이려고하는 검색 알고리즘입니다. 2 인 게임 (틱택 토, 체스, 바둑 등)의 머신 게임에 일반적으로 사용되는 적대적 검색 알고리즘입니다. 이동이 이전에 검사 된 이동보다 더 나쁘다는 것을 증명하는 하나 이상의 가능성이 발견되면 이동 평가를 완전히 중지합니다. 이러한 움직임은 더 이상 평가 될 필요가 없다. 표준 minimax 트리에 적용하면 minimax와 동일한 이동을 반환하지만 최종 결정에 영향을 줄 수없는 분기를 제거합니다.


1
불완전하지만 명확하고 유용하며 진실합니다.
Anko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.