에듀테크 프로젝트 대시보드
미니맥스 & 알파-베타
틱택토·오목·체스처럼 두 사람이 번갈아 두는 완전정보 게임에서 컴퓨터는 어떻게 "최선의 수"를 찾을까?
미니맥스(Minimax)는 "나는 점수를 최대화하고, 상대는 나를 최소화하려 든다"고 가정하고
가능한 미래를 게임 트리로 모두 펼쳐 본 뒤, 잎(끝 상태)의 점수를 위로 끌어올려 지금 둘 수를 정한다.
알파-베타 가지치기(Alpha-Beta Pruning)는 결과가 바뀌지 않는 가지를 탐색 생략해
같은 답을 훨씬 빠르게 얻는 최적화다.
당신은 X — 먼저 두세요.
AI가 마지막에 계산한 각 칸의 점수
깊이를 "완벽"으로 두면 AI는 절대 지지 않는다 — 최선을 다해도 무승부가 한계다. 깊이를 낮추면 AI가 멀리 있는 위협을 못 보고 실수하기 시작한다.
"평가 애니메이션"을 눌러 깊이 우선으로 잎을 읽고 점수가 위로 전달되는 과정을 확인하세요.
내 차례(MAX)는 자식 중 가장 큰 값을, 상대 차례(MIN)는 가장 작은 값을 고른다고 가정한다.
끝까지 못 가면 그 국면의 유불리를 숫자로 매기는 평가 함수가 필요하다. 틱택토는 작아서 끝까지 간다.
탐색 중 이미 확보한 하한 α와 상한 β가 교차(α ≥ β)하면 나머지 형제는 볼 필요가 없다.
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 처럼 깊이를 섞으면 "이왕 이길 거 빨리, 이왕 질 거 늦게"를 선호하게 된다.