Minimax Algorithm과 간단한 예제 포스팅에서 사용했던 예제에서 main()함수에 있는 total_coins 변수의 값을 12에서 32이로 증가시켜서 실행해 보면 컴퓨터가 답을 내는 시간이 기하 급수적으로 늘어나서 첫 대답을 탐색하는데 대략 30초 정도 시간이 걸리는 것을 볼 수 있다(Macbook Pro M5 기준).
def main():
total_coins = 32 # 원래는 12임.
...
이는 각 노드들의 선택가능한 조건이 3개씩이어서 32개의 코인을 가정하는 경우 이론상 대략 1000조가지가 넘는 노드들을 탐색해야 하기 때문이다.
Pruning(가지치기)
하지만, 실제로는 모든 노드들을 탐색해야 하는 것은 아니다. 개중에는 어차피 탐색해 들어가 봤자 선택되지 않을 값을 가진 것들이 있기 때문에 이러한 것들을 미리 알 수만 있다면 탐색 할 필요가 없는 경로들에 대해 탐색을 수행하지 않음으로써 소요되는 시간을 아끼고 효율적인 탐색을 수행할 수 있다. 이러한 동작을 “가지치기”라고 하는데, alpha와 beta라는 두개의 경계값을 유지하는 것으로 이루어진다.
- α(alpha): 현재까지 Max(컴퓨터)가 확보한 가장 높은 점수
- β(beta): 현재까지 Min(사용자)가 확보한 가장 낮은 점수
탐색 도중에 α >= β가 되는 순간이 있다면, 이러한 경로는 선택될 리가 없다고 가정하고 탐색을 중단한다.
구현 예제
다음의 코드는 “변형 nim game” 예제에 Alpha-Beta purining을 적용한 것이다.
실행결과 및 결론
이 프로그램을 실행하고 컴퓨터의 턴으로 게임을 시작하면 기존에 30초 가량 걸리던 탐색시간이 2초 정도로 줄어드는 것을 확인할 수 있다.





