[2017 삼성 육목대회] 2. 전략 조사 & 코딩 방향 잡기

막연하게 AI를 쓰면 좋겠다고 생각이 들어 알파고의 원리를 찾아봤습니다. 올해 1월달 쯤에 인공지능을 아주 잠깐 공부했던 적이 있어서 다행히 엄청 낯설지는 않았습니다. 그런데 현실적으로 개발 기간이 너무 촉박하기 때문에 찾아만 보고 딱히 이걸 통해 무언가 하지는 못했습니다.


이후 찾아본 것은 육목(Connect6, 앞으로 Connect6로 쓰겠습니다.)에 대한 논문이었습니다. 구글에서 마구잡이로 뒤져 한 6편 정도의 논문을 볼 수 있었고 이들을 통해 어느 정도 전략에 대한 감을 잡을 수 있었습니다.


그리고 NCTU6이라는 프로그램을 다운받아 실제로 컴퓨터와 Connect6를 둬보았습니다. 오목을 엄청 깊게 공부하지는 않았지만 꽤 잘한다고 생각했기 때문에(오목의 달인이라는 어플에서 최대 4단인가 5단까지 찍어봤습니다.) Connect6를 좀만 하면 금세 게임을 잘하게 될 줄 알았는데 막상 해보니까 굉장히 어려웠습니다. 뭐라고 말로 설명하기가 참 힘든데 돌을 2개 놓을 수 있다는게 굉장히 사람을 헷갈리게 만들었습니다. 그래도 계속 지다보니 어느 정도 게임에 대한 이해도가 생겼습니다. 오목을 예로 들면 내가 흑일 때 세 수 앞의 3-4를 내다보는 느낌? 그 느낌을 받을 수 있었고 이 이해를 바탕으로 일단 굉장히 초보적인 프로그램을 만들어보기로 했습니다. 이 프로그램은 다음과 같은 기능을 합니다.


입력 - 판의 상태(19*19 2차원 배열, 빈칸은 0, 검정은 1, 하양은 2로 표기), 플레이어의 색깔


출력 - 해당 플레이어의 최선의 수


이 때 "최선의 수"라는 것을 어떻게 판단하냐가 굉장히 중요한데, 저는 아래와 같은 기준으로 만들었습니다.


i) 6목이 있는지 없는지


ii) 상대의 4목이 있는지 없는지(연속한 4목이 아니더라도 상대가 2개를 놓아서 게임을 끝낼 수 있는 경우가 있는지 없는지)


iii) 상대가 나의 승리를 막기 위해 다음 턴에 써야하는 돌의 갯수(관련 논문에서는 Threat이라고 부름)


iv) Factor가 높은 순


우선순위는 i) -> ii) -> iii) -> iv)이고 Threat의 수를 구하는 방법, 그리고 Factor의 계산 식은 "A defensive Strategy Combined with Threat-Space Search for Connect6"이라는 논문을 참고했습니다.


즉, 모든 빈칸에 대해 임의로 2개를 골라 돌을 놓아본 뒤 위의 기준대로 판단하여 가장 좋은 수를 찾아냅니다. 굉장히 비효율적이고(대략 45000가지에 대해 테스트를 해봐야겠죠.) 여러 수 앞을 내다볼 수 없지만 일단 한 번 만들어보기로 했습니다.

  Comments