πŸ” 인곡지λŠ₯ 탐색 μ•Œκ³ λ¦¬μ¦˜ - 정보 이용 탐색

μ •λ³΄μ΄μš©νƒμƒ‰ μ•Œκ³ λ¦¬μ¦˜μ—: νœ΄λ¦¬μŠ€ν‹± 탐색과 A* μ•Œκ³ λ¦¬μ¦˜
탐색 μ•Œκ³ λ¦¬μ¦˜νœ΄λ¦¬μŠ€ν‹±νœ΄λ¦¬μŠ€ν‹±νƒμƒ‰
avatar
2025.04.07
Β·
7 min read

πŸ“Œ 1. 정보 이용 탐색(Heuristic Search)λž€?

βœ… 정보 이용 νƒμƒ‰μ΄λž€?

정보 이용 탐색(Heuristic Search)은 문제 해결을 μœ„ν•΄ νœ΄λ¦¬μŠ€ν‹±(heuristic, κ²½ν—˜μ  정보)을 ν™œμš©ν•˜λŠ” 탐색 λ°©μ‹μž…λ‹ˆλ‹€.
즉, 졜적의 경둜λ₯Ό λΉ λ₯΄κ²Œ μ°ΎκΈ° μœ„ν•΄ μ˜ˆμƒ λΉ„μš©μ„ κ³„μ‚°ν•˜μ—¬ 탐색을 μ§„ν–‰ν•©λ‹ˆλ‹€.

πŸ“Œ 정보 이용 νƒμƒ‰μ˜ νŠΉμ§•
βœ” λ§Ήλͺ©μ  탐색(DFS, BFS)보닀 λΉ λ₯΄κ³  효율적
βœ” 문제 해결을 μœ„ν•œ 좔가적인 정보(νœ΄λ¦¬μŠ€ν‹± ν•¨μˆ˜)λ₯Ό μ‚¬μš©
βœ” 졜적의 ν•΄λ₯Ό 보μž₯ν•˜μ§€ μ•Šμ„ μˆ˜λ„ 있음 (νœ΄λ¦¬μŠ€ν‹±μ΄ λΆ€μ •ν™•ν•  경우 μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯)

πŸ“Œ 정보 이용 탐색이 μ‚¬μš©λ˜λŠ” λΆ„μ•Ό

  • λ„€λΉ„κ²Œμ΄μ…˜ μ‹œμŠ€ν…œ (Google Maps, Waze) β†’ 졜적 경둜 μ°ΎκΈ°

  • κ²Œμž„ AI (체슀, μŠ€νƒ€ν¬λž˜ν”„νŠΈ, RPG κ²Œμž„) β†’ 졜적의 μ›€μ§μž„ κ²°μ •

  • λ‘œλ΄‡κ³΅ν•™ (μžμœ¨μ£Όν–‰, λ‘œλ΄‡ 경둜 μ„€μ •) β†’ μž₯애물을 ν”Όν•΄ 이동

  • μžμ—°μ–΄ 처리(NLP) β†’ λ¬Έμž₯ 의미 뢄석 및 검색 μ΅œμ ν™”


πŸ“Œ 2. νœ΄λ¦¬μŠ€ν‹± 탐색(Heuristic Search)

βœ… νœ΄λ¦¬μŠ€ν‹± νƒμƒ‰μ΄λž€?

νœ΄λ¦¬μŠ€ν‹± 탐색은 좔가적인 κ²½ν—˜μ  정보λ₯Ό μ΄μš©ν•˜μ—¬ 탐색 속도λ₯Ό λ†’μ΄λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
즉, κ°€μž₯ κ°€λŠ₯성이 높은 경둜λ₯Ό μš°μ„ μ μœΌλ‘œ νƒμƒ‰ν•˜μ—¬ 졜적의 해결책을 μ°ΎλŠ” λ°©μ‹μž…λ‹ˆλ‹€.

πŸ“Œ νœ΄λ¦¬μŠ€ν‹± νƒμƒ‰μ˜ 핡심 κ°œλ…
βœ” 문제 해결을 μœ„ν•œ 직관적 νŒλ‹¨ μ‚¬μš©
βœ” μ™„μ „ν•œ 탐색을 μˆ˜ν–‰ν•˜μ§€ μ•Šκ³ , κ°€μž₯ μœ λ§ν•œ λ°©ν–₯을 μ„ νƒν•˜μ—¬ 탐색
βœ” μ •ν™•ν•œ 해닡을 보μž₯ν•˜μ§€ μ•Šμ§€λ§Œ, λΉ λ₯Έ ν•΄κ²° κ°€λŠ₯

πŸ” νœ΄λ¦¬μŠ€ν‹± νƒμƒ‰μ˜ μ£Όμš” μ•Œκ³ λ¦¬μ¦˜

μ•Œκ³ λ¦¬μ¦˜μ„€λͺ…νŠΉμ§•

그리디 탐색(Greedy Best-First Search)

λͺ©ν‘œκΉŒμ§€ κ°€μž₯ 적은 λΉ„μš©μ΄ λ“œλŠ” 경둜λ₯Ό μš°μ„  탐색

λΉ λ₯΄μ§€λ§Œ 졜적 경둜 보μž₯ X

A* μ•Œκ³ λ¦¬μ¦˜(A-Star Algorithm)

μ‹€μ œ λΉ„μš©κ³Ό μ˜ˆμƒ λΉ„μš©μ„ λͺ¨λ‘ κ³ λ €ν•˜μ—¬ 졜적 경둜 탐색

f(n) = g(n) + h(n) 곡식 ν™œμš©

πŸ’‘ νœ΄λ¦¬μŠ€ν‹± 탐색은 문제 해결을 λΉ λ₯΄κ²Œ ν•˜μ§€λ§Œ, νœ΄λ¦¬μŠ€ν‹± ν•¨μˆ˜μ˜ ν’ˆμ§ˆμ— 따라 μ„±λŠ₯이 λ‹¬λΌμ§ˆ 수 있음!


πŸ“Œ 3. A* μ•Œκ³ λ¦¬μ¦˜ (A-Star Algorithm)

βœ… A* μ•Œκ³ λ¦¬μ¦˜μ΄λž€?

A* μ•Œκ³ λ¦¬μ¦˜μ€ DFS와 BFS의 μž₯점을 κ²°ν•©ν•˜μ—¬ 졜적 경둜λ₯Ό μ°ΎλŠ” 탐색 μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.
이 μ•Œκ³ λ¦¬μ¦˜μ€ νœ΄λ¦¬μŠ€ν‹±(Heuristic) ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 더 λ‚˜μ€ λ°©ν–₯으둜 탐색할 수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ A* μ•Œκ³ λ¦¬μ¦˜μ˜ 곡식

f(n) = g(n) + h(n)
  • g(n): μ‹œμž‘μ μ—μ„œ ν˜„μž¬ λ…Έλ“œκΉŒμ§€μ˜ μ‹€μ œ λΉ„μš©

  • h(n): ν˜„μž¬ λ…Έλ“œμ—μ„œ λͺ©ν‘œκΉŒμ§€μ˜ μ˜ˆμƒ λΉ„μš© (νœ΄λ¦¬μŠ€ν‹±)

πŸ” A* μ•Œκ³ λ¦¬μ¦˜μ˜ λ™μž‘ κ³Όμ •

  1. μ‹œμž‘ λ…Έλ“œλ₯Ό μ˜€ν”ˆ λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•˜κ³ , g(n) = 0으둜 μ„€μ •

  2. μ˜€ν”ˆ λ¦¬μŠ€νŠΈμ—μ„œ f(n)이 κ°€μž₯ μž‘μ€ λ…Έλ“œλ₯Ό μ„ νƒν•˜μ—¬ ν˜„μž¬ λ…Έλ“œλ‘œ μ„€μ •

  3. ν˜„μž¬ λ…Έλ“œκ°€ λͺ©ν‘œ λ…Έλ“œμ΄λ©΄ 탐색 μ’…λ£Œ

  4. ν˜„μž¬ λ…Έλ“œμ˜ 인접 λ…Έλ“œμ— λŒ€ν•΄ λ‹€μŒμ„ μˆ˜ν–‰:

    • 인접 λ…Έλ“œκ°€ 폐쇄 λ¦¬μŠ€νŠΈμ— 있으면 λ¬΄μ‹œ

    • 인접 λ…Έλ“œκ°€ μ˜€ν”ˆ λ¦¬μŠ€νŠΈμ— μ—†μœΌλ©΄ μΆ”κ°€ν•˜κ³  g(n)κ³Ό f(n)을 계산

    • 인접 λ…Έλ“œκ°€ μ˜€ν”ˆ λ¦¬μŠ€νŠΈμ— 이미 있으면, 더 μž‘μ€ g(n)이 발견된 경우 μ—…λ°μ΄νŠΈ

  5. ν˜„μž¬ λ…Έλ“œλ₯Ό 폐쇄 λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•˜κ³ , 2번 κ³Όμ • 반볡

βœ… A* μ•Œκ³ λ¦¬μ¦˜μ˜ νŠΉμ§•

βœ” νœ΄λ¦¬μŠ€ν‹± ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜μ—¬ 효율적인 탐색 κ°€λŠ₯
βœ” 졜적 경둜λ₯Ό 보μž₯
βœ” λ„€λΉ„κ²Œμ΄μ…˜, κ²Œμž„ AI, λ‘œλ΄‡ 경둜 탐색 등에 ν™œμš©

βœ… A* μ•Œκ³ λ¦¬μ¦˜ μ½”λ“œ κ΅¬ν˜„ (Python)

import heapq

def a_star(graph, start, goal, h):
    open_list = []
    heapq.heappush(open_list, (0 + h[start], start))
    came_from = {}
    g_score = {node: float('inf') for node in graph}
    g_score[start] = 0

    while open_list:
        _, current = heapq.heappop(open_list)

        if current == goal:
            path = []
            while current in came_from:
                path.append(current)
                current = came_from[current]
            path.append(start)
            return path[::-1]

        for neighbor, cost in graph[current]:
            tentative_g_score = g_score[current] + cost
            if tentative_g_score < g_score[neighbor]:
                came_from[neighbor] = current
                g_score[neighbor] = tentative_g_score
                f_score = tentative_g_score + h[neighbor]
                heapq.heappush(open_list, (f_score, neighbor))

    return None

# 예제 κ·Έλž˜ν”„
graph = {
    'A': [('B', 1), ('C', 4)],
    'B': [('C', 2), ('D', 5)],
    'C': [('D', 1)],
    'D': [('E', 3)],
    'E': []
}

# νœ΄λ¦¬μŠ€ν‹± κ°’ (예제)
heuristic = {'A': 6, 'B': 4, 'C': 2, 'D': 1, 'E': 0}

# μ‹€ν–‰
path = a_star(graph, 'A', 'E', heuristic)
print("A* μ•Œκ³ λ¦¬μ¦˜ 탐색 κ²°κ³Ό:", path)

πŸ“Œ A μ•Œκ³ λ¦¬μ¦˜ μ‹€ν–‰ κ²°κ³Ό μ˜ˆμ‹œ

A* μ•Œκ³ λ¦¬μ¦˜ 탐색 κ²°κ³Ό: ['A', 'B', 'C', 'D', 'E']






- μ»¬λ ‰μ…˜ 아티클