동계 캠프에서 4일간 20시간 동안 AI를 배우면서, AI에 전체적인 개념에 대해서 알 수 있었다. AI로 러시아 장기, 4x4 오델로를 만들어보며 정말 뿌듯했지만, 반대로 정말 어려웠던 20시간이었기도 하다.
유니티와 C++ 게임 개발의 영역에만 있다가 AI라는 새로운 영역에 발을 디딘 것에 의의를 둔다! 잊어버리지 않기 위해 4x4 오델로 AI 만들기를 DP, Sarsa, QLearning AI를 통해 다시 한 번 복습해볼 것이다! 물론... DP는 AI가 아니긴 하지만... 일단 편의상 묶자 ㅎ_ㅎ
상태
우선, 오델로 보드 한 칸에서의 상태는 3가지가 있다. 흑돌 혹은 백돌 상태, 그 외 빈 상태!
상태를 표현해주기 위해 우리는 흑돌을 1, 백돌을 2, 빈 상태를 0으로 놓았다.
이렇게 2차원 배열의 형태로 보드의 상태를 저장해주었다.
하지만, 나는 각 AI의 가치 함수, Q 함수의 Key 값으로 보드의 상태를 주고 싶지만, 2차원 배열을 키값으로 두기에는 무리가 있다. 따라서, 0 1 2의 숫자만 넣을 수 있는 3진수로 보드의 상태를 저장하기로 했다!
또, 3진수에 현재 턴을 붙여 일의 자리 수가 1이면 흑돌 턴, 그렇지 않다면 백돌 턴으로 표현할 것이다.
예시)
3진수 변환 (흑턴): 01210122121010001
3진수 변환 (백턴): 01210122121010002
10진수 변환 (흑턴): 25855525
10진수 변환 (백턴): 25855526
이 10진수 숫자(보드의 상태)를 키 값으로 쓴다!
행동
오델로에서 행동은 단 한가지, 돌을 놓는 것이다. 4x4 오델로에서 돌은 1번째 칸부터 16번째 칸까지 놓을 수 있는데, 그래서 한 상태에서 할 수 있는 행동은 16가지가 되는 것이다!
그런데, 여기서 오델로의 룰을 잘 알아야 한다. 오델로는 돌을 놓을 때 놓을 돌과 놓은 돌 사이에 적의 돌이 있어야만 돌을 놓을 수 있다!
그리고 오델로는 말을 다 쓰면 패스가 있기 때문에 한 상태에서 할 수 있는 행동이 하나 더 늘었다.
한 상태에서 갈 수 있는 행동 = (놓을 수 있는 자리) or (패스)
위처럼 정리했다. 각 행동은 정수로 나타냈다. 1~16까지는 해당 칸을 가는 행동으로 설정했고, 0은 패스이다!
보상
검은 돌이 승리할 때는 100, 패배할 때는 -100의 보상을 주었다. AI가 자신이 검은 돌이라면 최대의 보상을, 하얀 돌이라면 최소의 보상을 선택하게 맡길 것이다!
if (gameState.NextTurn == 1)
{
selectedExpectation = actionCandidateDictionary.Select(e => e.Value).Max();
}
else if (gameState.NextTurn == 2)
{
selectedExpectation = actionCandidateDictionary.Select(e => e.Value).Min();
}
미리 코드로 나타내자면, 이런 식이다.
다음 글에서는 이 상태, 행동, 보상의 큰 설정을 가치함수를 구현하고, DP로 AI인 척하는 프로그램을 만들어볼 것이다!
'AI' 카테고리의 다른 글
[AI][C#][오델로 AI] 3. Q-Learning으로 오델로 AI를 만들자! (0) | 2023.01.14 |
---|---|
[AI][C#][오델로 AI] 2. DP로 오델로 AI를 만들자! (0) | 2023.01.14 |