๐Ÿ” ์ธ๊ณต์ง€๋Šฅ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ๊ฒŒ์ž„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๐ŸŽฎ ๊ฒŒ์ž„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜: Mini-Max, ฮฑ-ฮฒ Pruning, ๋ชฌํ…Œ์นด๋ฅผ๋กœ ํƒ์ƒ‰
avatar
2025.04.07
ยท
12 min read

๐Ÿ“Œ 1. ๊ฒŒ์ž„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?

โœ… ๊ฒŒ์ž„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?

๊ฒŒ์ž„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Game Search Algorithm)์€ AI๊ฐ€ ๊ฒŒ์ž„ ๋‚ด์—์„œ ์ตœ์ ์˜ ์ „๋žต์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์ƒ๋Œ€๋ฐฉ์˜ ํ–‰๋™์„ ๊ณ ๋ คํ•˜์—ฌ ์ตœ๊ณ ์˜ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๊ฒŒ์ž„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํŠน์ง•
โœ” ์ ์˜ ์›€์ง์ž„์„ ์˜ˆ์ธกํ•˜์—ฌ ์ตœ์ ์˜ ์ˆ˜๋ฅผ ์ฐพ์Œ
โœ” ์Šน๋ฆฌ ํ™•๋ฅ ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ‰๊ฐ€
โœ” ์™„์ „ํ•œ ํƒ์ƒ‰์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ, ํœด๋ฆฌ์Šคํ‹ฑ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํƒ์ƒ‰์„ ์ตœ์ ํ™”

๐Ÿ“Œ ๊ฒŒ์ž„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋˜๋Š” ๋ถ„์•ผ

  • ์ฒด์Šค, ๋ฐ”๋‘‘, ์žฅ๊ธฐ โ†’ ์ „๋žต์ ์ธ ํ„ด ๊ธฐ๋ฐ˜ ๊ฒŒ์ž„

  • ์Šคํƒ€ํฌ๋ž˜ํ”„ํŠธ, ๋กค(LoL), Dota 2 โ†’ ์‹ค์‹œ๊ฐ„ ์ „๋žต ๊ฒŒ์ž„(RTS)

  • ํ‹ฑํƒํ† (Tic-Tac-Toe), ์˜ค๋ชฉ โ†’ ๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„ AI


๐Ÿ“Œ 2. ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜(Mini-Max Algorithm)

โœ… ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?

๋ฏธ๋‹ˆ๋งฅ์Šค(Mini-Max) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ตœ์ ์˜ ์ „๋žต์„ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ํ”Œ๋ ˆ์ด์–ด์˜ ์ตœ์„ ์˜ ์ˆ˜๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ฆ‰, ๋‚ด๊ฐ€ ์ตœ์„ ์˜ ์ˆ˜๋ฅผ ์„ ํƒํ•˜๊ณ , ์ƒ๋Œ€๋ฐฉ์€ ๋‚˜์—๊ฒŒ ์ตœ์•…์˜ ์ˆ˜๋ฅผ ์„ ํƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ๊ฒŒ์ž„์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ ์›๋ฆฌ

  • Max ํ”Œ๋ ˆ์ด์–ด (AI) โ†’ ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๋ฅผ ์–ป๋Š” ์ˆ˜๋ฅผ ์„ ํƒ

  • Min ํ”Œ๋ ˆ์ด์–ด (์ƒ๋Œ€๋ฐฉ) โ†’ AI๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ์–ป๋„๋ก ๋ฐฉํ•ดํ•˜๋Š” ์ˆ˜๋ฅผ ์„ ํƒ

  • ๊ฒŒ์ž„ ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์ตœ์ ์˜ ์ˆ˜๋ฅผ ๊ฒฐ์ •

๐Ÿ” ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ •

  1. ํ˜„์žฌ ์ƒํƒœ์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆ˜๋ฅผ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ํ™•์žฅ

  2. ์ตœํ•˜๋‹จ(๋ฆฌํ”„) ๋…ธ๋“œ์—์„œ ์ŠนํŒจ๋ฅผ ํ‰๊ฐ€ํ•˜์—ฌ ์ ์ˆ˜๋ฅผ ๋ถ€์—ฌ

  3. Min ๋ ˆ๋ฒจ์—์„œ๋Š” ์ตœ์†Ÿ๊ฐ’์„ ์„ ํƒ, Max ๋ ˆ๋ฒจ์—์„œ๋Š” ์ตœ๋Œ“๊ฐ’์„ ์„ ํƒ

  4. ๋ฃจํŠธ ๋…ธ๋“œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ์ตœ์ ์˜ ์„ ํƒ ๊ฒฐ์ •

โœ… ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ ๊ตฌํ˜„ (Python)

def minimax(depth, node_index, maximizing_player, scores, height):
    if depth == height:
        return scores[node_index]

    if maximizing_player:
        return max(minimax(depth + 1, node_index * 2, False, scores, height),
                   minimax(depth + 1, node_index * 2 + 1, False, scores, height))
    else:
        return min(minimax(depth + 1, node_index * 2, True, scores, height),
                   minimax(depth + 1, node_index * 2 + 1, True, scores, height))

scores = [3, 5, 2, 9, 12, 5, 23, 23]
height = 3
print("์ตœ์ ์˜ ๊ฐ’:", minimax(0, 0, True, scores, height))

๐Ÿ“Œ ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

์ตœ์ ์˜ ๊ฐ’: 12

๐Ÿ’ก ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ตœ์ ์˜ ์ „๋žต์„ ๋ณด์žฅํ•˜์ง€๋งŒ, ๊ฒŒ์ž„ ํŠธ๋ฆฌ๊ฐ€ ํฌ๋ฉด ์—ฐ์‚ฐ๋Ÿ‰์ด ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ!


๐Ÿ“Œ 3. ์•ŒํŒŒ-๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ(ฮฑ-ฮฒ Pruning)

โœ… ฮฑ-ฮฒ ๊ฐ€์ง€์น˜๊ธฐ๋ž€?

์•ŒํŒŒ-๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ(Alpha-Beta Pruning)๋Š” ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๋ถˆํ•„์š”ํ•œ ํƒ์ƒ‰์„ ์ค„์—ฌ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ฆ‰, ์ŠนํŒจ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๊ฐ€์ง€๋ฅผ ์ž˜๋ผ๋‚ด์–ด ์—ฐ์‚ฐ๋Ÿ‰์„ ์ค„์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ์•ŒํŒŒ(ฮฑ)์™€ ๋ฒ ํƒ€(ฮฒ)์˜ ๊ฐœ๋…

  • ์•ŒํŒŒ(ฮฑ) โ†’ Max ํ”Œ๋ ˆ์ด์–ด(๋‚ด๊ฐ€)์—๊ฒŒ ๊ฐ€์žฅ ์ข‹์€ ๊ฐ’ (์ตœ๋Œ“๊ฐ’)

  • ๋ฒ ํƒ€(ฮฒ) โ†’ Min ํ”Œ๋ ˆ์ด์–ด(์ƒ๋Œ€๋ฐฉ)์—๊ฒŒ ๊ฐ€์žฅ ์ข‹์€ ๊ฐ’ (์ตœ์†Ÿ๊ฐ’)

  • ฮฑ โ‰ฅ ฮฒ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ ํƒ์ƒ‰์„ ์ค‘๋‹จ (๊ฐ€์ง€์น˜๊ธฐ ๋ฐœ์ƒ)

๐Ÿ” ์•ŒํŒŒ-๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ ๋™์ž‘ ๊ณผ์ •

  1. ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰

  2. Max ๋…ธ๋“œ์—์„œ ํ˜„์žฌ ์ตœ์ƒ์˜ ์„ ํƒ(ฮฑ)์„ ์ €์žฅํ•˜๊ณ , ๋” ์ข‹์€ ์„ ํƒ์ด ๋‚˜ํƒ€๋‚˜๋ฉด ์—…๋ฐ์ดํŠธ

  3. Min ๋…ธ๋“œ์—์„œ ํ˜„์žฌ ์ตœ์ƒ์˜ ์„ ํƒ(ฮฒ)์„ ์ €์žฅํ•˜๊ณ , ๋” ๋‚ฎ์€ ๊ฐ’์ด ๋‚˜ํƒ€๋‚˜๋ฉด ์—…๋ฐ์ดํŠธ

  4. ๋งŒ์•ฝ ฮฑ โ‰ฅ ฮฒ๊ฐ€ ๋˜๋ฉด ํƒ์ƒ‰์„ ์ค‘๋‹จ(๊ฐ€์ง€์น˜๊ธฐ ์ˆ˜ํ–‰)

โœ… ์•ŒํŒŒ-๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ ์ฝ”๋“œ ๊ตฌํ˜„ (Python)

def alpha_beta(depth, node_index, maximizing_player, scores, alpha, beta, height):
    if depth == height:
        return scores[node_index]

    if maximizing_player:
        max_value = float('-inf')
        for i in range(2):
            value = alpha_beta(depth + 1, node_index * 2 + i, False, scores, alpha, beta, height)
            max_value = max(max_value, value)
            alpha = max(alpha, max_value)
            if beta <= alpha:
                break  # ๊ฐ€์ง€์น˜๊ธฐ ๋ฐœ์ƒ
        return max_value
    else:
        min_value = float('inf')
        for i in range(2):
            value = alpha_beta(depth + 1, node_index * 2 + i, True, scores, alpha, beta, height)
            min_value = min(min_value, value)
            beta = min(beta, min_value)
            if beta <= alpha:
                break  # ๊ฐ€์ง€์น˜๊ธฐ ๋ฐœ์ƒ
        return min_value

# ์˜ˆ์ œ ๋ฐ์ดํ„ฐ
scores = [3, 5, 2, 9, 12, 5, 23, 23]
height = 3
print("์ตœ์ ์˜ ๊ฐ’:", alpha_beta(0, 0, True, scores, float('-inf'), float('inf'), height))

๐Ÿ“Œ ์•ŒํŒŒ-๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

์ตœ์ ์˜ ๊ฐ’: 12

๐Ÿ’ก ๋ฏธ๋‹ˆ๋งฅ์Šค๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋ฉฐ, ์ตœ์ ์˜ ์„ ํƒ์„ ๋ณด์žฅํ•จ!


๐Ÿ“Œ 4. ๋ชฌํ…Œ์นด๋ฅผ๋กœ ํŠธ๋ฆฌ ํƒ์ƒ‰(Monte Carlo Tree Search, MCTS)

โœ… MCTS๋ž€?

MCTS(๋ชฌํ…Œ์นด๋ฅผ๋กœ ํŠธ๋ฆฌ ํƒ์ƒ‰)๋Š” ๋ฌด์ž‘์œ„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜์—ฌ ์Šน๋ฅ ์ด ๋†’์€ ์ „๋žต์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ฆ‰, ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ , ์œ ๋งํ•œ ์ˆ˜๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ตœ์ ์˜ ์ „๋žต์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
ํŠนํžˆ ๋ฐ”๋‘‘, ์ฒด์Šค, ํฌ์ปค ๋“ฑ ํ™•๋ฅ ๊ณผ ์ „๋žต์ด ์ค‘์š”ํ•œ ๊ฒŒ์ž„์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ” MCTS์˜ 4๋‹จ๊ณ„ ๊ณผ์ •

1โƒฃ Selection (์„ ํƒ)

  • ํ˜„์žฌ ์ƒํƒœ์—์„œ ๊ฐ€์žฅ ์œ ๋งํ•œ ๋…ธ๋“œ(์ˆ˜)๋ฅผ ์„ ํƒ

  • ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•  ๋…ธ๋“œ๋ฅผ ๊ฒฐ์ • (UCB1 ๊ณต์‹ ํ™œ์šฉ)

2โƒฃ Expansion (ํ™•์žฅ)

  • ์„ ํƒ๋œ ๋…ธ๋“œ์—์„œ ์ƒˆ๋กœ์šด ๊ฐ€๋Šฅํ•œ ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ™•์žฅ

3โƒฃ Simulation (์‹œ๋ฎฌ๋ ˆ์ด์…˜)

  • ๋ฌด์ž‘์œ„ ํ”Œ๋ ˆ์ด์•„์›ƒ(Random Rollout)์„ ์ˆ˜ํ–‰

  • ํ•ด๋‹น ์ˆ˜๊ฐ€ ์Šน๋ฆฌ๋กœ ์ด์–ด์ง€๋Š”์ง€ ํ‰๊ฐ€

4โƒฃ Backpropagation (์—ญ์ „ํŒŒ)

  • ์ŠนํŒจ ๊ฒฐ๊ณผ๋ฅผ ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ ์ „ํŒŒํ•˜์—ฌ ๊ฐ ์ˆ˜์˜ ์Šน๋ฅ  ์—…๋ฐ์ดํŠธ

๐Ÿ’ก ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ฐ€์žฅ ์Šน๋ฅ ์ด ๋†’์€ ์ˆ˜๋ฅผ ์„ ํƒ!

โœ… MCTS์˜ ํŠน์ง•

โœ” ์™„๋ฒฝํ•œ ํƒ์ƒ‰์ด ์–ด๋ ค์šด ๊ฒŒ์ž„์—์„œ ์œ ์šฉ
โœ” ์‹ค์‹œ๊ฐ„ ํ•™์Šต ๊ฐ€๋Šฅ (๊ฐ•ํ™”ํ•™์Šต๊ณผ ๊ฒฐํ•ฉ ๊ฐ€๋Šฅ)
โœ” ๋ฐ”๋‘‘ AI (์•ŒํŒŒ๊ณ , AlphaGo), ์ฒด์Šค AI ๋“ฑ์— ํ™œ์šฉ
โœ” ํƒ์ƒ‰ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜์—ฌ ์—ฐ์‚ฐ๋Ÿ‰ ์ ˆ์•ฝ

โœ… MCTS ์ฝ”๋“œ ๊ตฌํ˜„ (Python, ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ)

import math
import random

class Node:
    def __init__(self, state, parent=None):
        self.state = state
        self.parent = parent
        self.children = []
        self.visits = 0
        self.value = 0

    def is_fully_expanded(self):
        return len(self.children) > 0

    def best_child(self, exploration_weight=1.0):
        return max(self.children, key=lambda c: c.value / (c.visits + 1e-6) + exploration_weight * math.sqrt(math.log(self.visits + 1) / (c.visits + 1e-6)))

def mcts_search(root, itermax=1000):
    for _ in range(itermax):
        node = root
        while node.is_fully_expanded():
            node = node.best_child()
        result = random.choice([-1, 1])  # ๋ฌด์ž‘์œ„ ์ŠนํŒจ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
        while node is not None:
            node.visits += 1
            node.value += result
            node = node.parent

    return root.best_child(exploration_weight=0)

# ์˜ˆ์ œ ์‹คํ–‰
root = Node("Root State")
best_move = mcts_search(root, 1000)
print("MCTS ์„ ํƒ๋œ ์ตœ์  ๊ฒฝ๋กœ:", best_move.state)

๐Ÿ“Œ MCTS ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

MCTS ์„ ํƒ๋œ ์ตœ์  ๊ฒฝ๋กœ: Root State (์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธฐ๋ฐ˜ ์ตœ์  ์ˆ˜ ์„ ํƒ)

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ: ๊ฒŒ์ž„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋น„๊ต

์•Œ๊ณ ๋ฆฌ์ฆ˜ํŠน์ง•์žฅ์ ๋‹จ์ 

๋ฏธ๋‹ˆ๋งฅ์Šค

์™„์ „ํ•œ ๊ฒŒ์ž„ ํŠธ๋ฆฌ ํƒ์ƒ‰

์ตœ์  ํ•ด ๋ณด์žฅ

์—ฐ์‚ฐ๋Ÿ‰ ๋งŽ์Œ

ฮฑ-ฮฒ Pruning

๋ฏธ๋‹ˆ๋งฅ์Šค ์ตœ์ ํ™”

๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ์ค„์ž„

์—ฌ์ „ํžˆ ๊ณ„์‚ฐ๋Ÿ‰ ๋งŽ์Œ

MCTS

ํ™•๋ฅ ์  ์‹œ๋ฎฌ๋ ˆ์ด์…˜

๋น ๋ฅธ ์ „๋žต ์„ ํƒ ๊ฐ€๋Šฅ

์ผ์ • ์ˆ˜์ค€์˜ ๋ฌด์ž‘์œ„์„ฑ ํฌํ•จ

๐Ÿ“Œ ๊ฒŒ์ž„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฒŒ์ž„์˜ ํŠน์„ฑ์— ๋งž๊ฒŒ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

  • ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฒด์Šค, ํ‹ฑํƒํ† ์™€ ๊ฐ™์€ ์ •ํ˜•ํ™”๋œ ํ„ด ๊ธฐ๋ฐ˜ ๊ฒŒ์ž„์—์„œ ์‚ฌ์šฉ๋จ

  • ์•ŒํŒŒ-๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ(ฮฑ-ฮฒ Pruning)๋Š” ๋ฏธ๋‹ˆ๋งฅ์Šค๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ๊ณ„์‚ฐ๋Ÿ‰์„ ์ค„์ด๋Š” ๋ฐ ํšจ๊ณผ์ 

  • ๋ชฌํ…Œ์นด๋ฅผ๋กœ ํŠธ๋ฆฌ ํƒ์ƒ‰(MCTS)์€ ๋ฐ”๋‘‘, ํฌ์ปค, ์‹ค์‹œ๊ฐ„ ์ „๋žต ๊ฒŒ์ž„(RTS)์—์„œ ํ™•๋ฅ  ๊ธฐ๋ฐ˜์œผ๋กœ ํšจ๊ณผ์ ์ธ ํƒ์ƒ‰ ์ˆ˜ํ–‰







- ์ปฌ๋ ‰์…˜ ์•„ํ‹ฐํด