• Feed
  • Explore
  • Ranking
/
/
    πŸ€– AI&λ”₯λŸ¬λ‹ κ°œλ… λͺ¨μŒ

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

    μ •λ³΄μ΄μš©νƒμƒ‰ μ•Œκ³ λ¦¬μ¦˜μ—: νœ΄λ¦¬μŠ€ν‹± 탐색과 A* μ•Œκ³ λ¦¬μ¦˜
    탐색 μ•Œκ³ λ¦¬μ¦˜νœ΄λ¦¬μŠ€ν‹±νœ΄λ¦¬μŠ€ν‹±νƒμƒ‰
    쑍
    쑍
    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']






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