한양과학기술고등학교

에듀테크 프로젝트 대시보드

미니맥스 & 알파-베타

미니맥스 & 알파-베타 가지치기

틱택토·오목·체스처럼 두 사람이 번갈아 두는 완전정보 게임에서 컴퓨터는 어떻게 "최선의 수"를 찾을까? 미니맥스(Minimax)는 "나는 점수를 최대화하고, 상대는 나를 최소화하려 든다"고 가정하고 가능한 미래를 게임 트리로 모두 펼쳐 본 뒤, 잎(끝 상태)의 점수를 위로 끌어올려 지금 둘 수를 정한다. 알파-베타 가지치기(Alpha-Beta Pruning)는 결과가 바뀌지 않는 가지를 탐색 생략해 같은 답을 훨씬 빠르게 얻는 최적화다.

완벽한 AI와 틱택토 대결

AI 탐색 깊이

당신은 X — 먼저 두세요.

AI가 마지막에 계산한 각 칸의 점수

  • —아직 없음
탐색한 노드
0
가지치기 횟수
0

깊이를 "완벽"으로 두면 AI는 절대 지지 않는다 — 최선을 다해도 무승부가 한계다. 깊이를 낮추면 AI가 멀리 있는 위협을 못 보고 실수하기 시작한다.

게임 트리에서 점수 끌어올리기

MAX 노드 (내 차례 · 최댓값 선택) MIN 노드 (상대 차례 · 최솟값 선택) 잎 (게임 결과 점수) 가지치기됨

"평가 애니메이션"을 눌러 깊이 우선으로 잎을 읽고 점수가 위로 전달되는 과정을 확인하세요.

핵심 아이디어 3가지

1. 번갈아 두는 최적 플레이

내 차례(MAX)는 자식 중 가장 큰 값을, 상대 차례(MIN)는 가장 작은 값을 고른다고 가정한다.

2. 잎의 점수 = 평가 함수

끝까지 못 가면 그 국면의 유불리를 숫자로 매기는 평가 함수가 필요하다. 틱택토는 작아서 끝까지 간다.

3. α ≤ 최종값 ≤ β

탐색 중 이미 확보한 하한 α와 상한 β가 교차(α ≥ β)하면 나머지 형제는 볼 필요가 없다.

알파-베타 미니맥스 (핵심 로직)

def minimax(state, depth, alpha, beta, maximizing):
    if depth == 0 or state.is_over():
        return state.evaluate()          # 잎의 점수

    if maximizing:                          # 내 차례 → 최댓값
        value = -INF
        for move in state.moves():
            value = max(value, minimax(state.play(move), depth-1, alpha, beta, False))
            alpha = max(alpha, value)
            if alpha >= beta:
                break                          # β 컷 — 남은 형제 가지치기
        return value
    else:                                   # 상대 차례 → 최솟값
        value = INF
        for move in state.moves():
            value = min(value, minimax(state.play(move), depth-1, alpha, beta, True))
            beta = min(beta, value)
            if alpha >= beta:
                break                          # α 컷
        return value

# 첫 호출: best = argmax_move  minimax(root.play(move), D, -INF, +INF, False)
  • 결과는 동일: 알파-베타는 미니맥스와 정확히 같은 수를 고른다. 단지 볼 필요 없는 가지를 건너뛸 뿐이다.
  • 탐색 순서가 중요: 좋은 수를 먼저 보면 컷이 빨리 일어난다. 이상적으로는 트리 크기가 b^d → b^(d/2) 로 줄어 같은 시간에 2배 깊이를 본다.
  • 깊이 제한 + 평가 함수: 체스·바둑은 트리가 무한히 커서 몇 수만 내다보고 evaluate() 로 국면을 점수화한다.
  • 승리에 10 - depth 처럼 깊이를 섞으면 "이왕 이길 거 빨리, 이왕 질 거 늦게"를 선호하게 된다.

어디에 쓰이나

  • 고전 게임 AI: 체스 엔진(스톡피시 이전 세대), 오델로, 체커, 커넥트4 — 모두 알파-베타 + 정교한 평가 함수가 뼈대였다.
  • 딥블루는 1997년 카스파로프를 이길 때 초당 2억 국면을 알파-베타로 탐색했다.
  • 한계: 분기수가 큰 바둑(약 250)은 알파-베타로도 벅차 몬테카를로 트리 탐색(MCTS)과 신경망(알파고)으로 넘어갔다.
  • 확장: 반복 심화, 전위표(transposition table), 이동 순서 휴리스틱(killer move) 등으로 실전 엔진은 훨씬 더 깊이 본다.
  • 게임이 아니어도 적대적 상황의 의사결정(경매, 협상 봇, 보안 게임 이론)에 같은 뼈대가 쓰인다.