• Feed
  • Explore
  • Ranking
/
/
    ๐Ÿค– AI&๋”ฅ๋Ÿฌ๋‹ ๊ฐœ๋… ๋ชจ์Œ

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

    ๐ŸŽฎ ๊ฒŒ์ž„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜: Mini-Max, ฮฑ-ฮฒ Pruning, ๋ชฌํ…Œ์นด๋ฅผ๋กœ ํƒ์ƒ‰
    ์ก
    ์ก
    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)์—์„œ ํ™•๋ฅ  ๊ธฐ๋ฐ˜์œผ๋กœ ํšจ๊ณผ์ ์ธ ํƒ์ƒ‰ ์ˆ˜ํ–‰







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