Big Ben
Big Ben's Log
Big Ben
전체 방문자
오늘
어제
  • 전체 글 (80)
    • 파이썬 (23)
      • 파이썬 기초 (5)
      • 클래스 (6)
      • 자료구조 (4)
      • Tensorflow (3)
      • PyTorch (2)
      • konlpy (1)
      • anaconda (1)
    • 머신러닝 (3)
      • 선형회귀 (1)
      • Tree 기반 (1)
    • 딥러닝 (6)
      • NLP (2)
      • VISION (2)
      • TABULAR (0)
      • 딥러닝 서버 구축 (2)
    • 그래프 이론 (1)
      • 그래프마이닝 (1)
      • GNN (0)
    • 강화학습 (3)
      • 강화학습 기본 (3)
    • 인공지능 (5)
    • 추천시스템 (2)
      • 추천시스템 기초 (2)
    • Competitions (1)
    • 빅데이터 (8)
      • 하둡 (3)
      • 스파크 (4)
      • 클라우드 (1)
    • SQL (7)
      • MariaDB (2)
    • 논문 리뷰 (2)
    • 대학원 (0)
      • 데이터 사이언스 (0)
      • 경제학 (0)
    • 선형대수학 (7)
      • 선형대수 ICE BREAKING (1)
      • 벡터 (5)
      • 고윳값 (1)
    • 개인프로젝트 (0)
      • 포트폴리오 대시보드 + AI기반 주식 자동매매 (0)
    • 재테크 (1)
    • 자동차 (0)
    • 알고리즘 (11)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 빅데이터
  • MariaDB
  • 데이터사이언스
  • 객체
  • 선형대수
  • 인공지능
  • 파이썬
  • Baekjoon
  • sql
  • 선형대수학
  • 코딩테스트
  • TensorFlow
  • 알고리즘
  • 객체지향
  • 프로그래밍
  • 프로그래머스
  • 파이썬기초
  • 데이터베이스
  • AI
  • 백준
  • PYTHON
  • class
  • pytorch
  • 머신러닝
  • 하둡
  • 딥러닝
  • 자료구조
  • mysql
  • 코테
  • 데이터

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Big Ben

Big Ben's Log

[python] 기본적인 탐색 알고리즘 1 - DFS
인공지능

[python] 기본적인 탐색 알고리즘 1 - DFS

2022. 12. 31. 21:10
반응형

탐색 알고리즘에 대해 알아봅시다.

 

인공지능을 공부하면, 상당수의 개념이 상태공간에서 비롯됨을 알 수 있습니다.

 

이러한 상태공간을 탐색하는데에는 여러 방법이 있는데요. 그중에서도 아무런 기초 지식이 없을때 활용할 수 있는 탐색 방법중 하나인 망라적 탐색(Exhaustive Search)에 대해서 알아보도록 하겠습니다. 

 

 

 

망라적 탐색을 수행하려면 몇 가지 기본적인 Rule을 숙지해야합니다.

  • 이미 확인한 곳을 다시 확인해서는 안됨 (closed list로 관리)
  • 아직 확인하지 않은 곳을 알고 있어야함 (open list로 관리)
  • 효율적인 순서로 탐색해야함 -> 깊이우선탐색(DFS), 너비우선탐색(BFS) 활용

 

그 중에서도 이번에는 깊이 우선 탐색인 Depth-First Search (DFS)에 대해 알아보고, 파이썬으로 구현해보는 시간을 갖도록 하겠습니다. 위 탐색 방법은 그래프와 리스트로 확인하는 것이 직관적으로 이해하기 수월할 것입니다. 아래의 그림을 살펴보죠

 

DFS 원리 설명

 

왼쪽의 그래프를 탐색한다고 가정해보자. 오른쪽의 open list, closed list로 관리가 가능하다.

이 그래프는 DFS의 전반적인 프로세스를 보여주고 있습니다.

각 노드 옆에 위치한 숫자는 탐색 순서를 나타내고 있습니다. 말 그대로 깊이 우선 탐색이기에 한쪽 가지의 뿌리까지 확인하고 그 다음(여기서는 오른쪽)으로 이동하여 다시 탐색을 수행하고 있습니다.

 

간단하게 유사코드로 설명을 드리자면, 아래와 같은 방식으로 DFS를 수행할 수 있습니다.

초기 상태 (최상단에 위치한 노드)를 open list로 넣고, closed list는 빈 리스트로 시작

while open list:
	
    - open list의 첫 요소(a)를 꺼내고, a를 closed list로 이동 (a 탐사 완료)
    - a가 목표 상태라면 해를 발견하였으므로 탐색 종료
    - a에 인접한 상태 중 아직 탐사하지 않은 상태(자식 노드)를 모두 open list의 첫 요소로 추가

 

DFS는 망라적 탐색의 한 방법으로써, 모든 가능성을 다 확인해보는것이 특징입니다. 그만큼 확인해야할 데이터가 많다면 탐색 시간은 오래 걸릴 수 있겠죠.

 

DFS 파이썬 코드 구현

이번에는 DFS 응용을 통한 코드 구현을 해보죠.

 

아래와 같은 미로가 있다고 가정해봅시다. 

 

인공지능이 이 미로를 풀고 Goal(G)까지 도달하기 위해서 DFS를 활용할 수 있을 것입니다.

 

위 미로를 그래프로 표현해보자면..

조금은 친숙한 트리 모양의 그래프로 나타낼 수 있습니다.

이제 오픈리스트와 클로즈 리스트를 만들어서 문제를 풀 수 있겠죠.

 

파이썬 코드는 다음과 같습니다.

# 그래프 내 노드 dictionary로 표현
graph = { 
    '0' : ['3'],   # key는 0번 노드, value는 0번 노드의 자식 노드
    '3' : ['4', '7'],  # key는 3번 노드, value는 3번 노드의 자식 노드 
    '4' : ['6', '1'],  # ...
    '7' : ['9', '8'],
    '6' : ['2', '100'],
    '2': [],   # 발단 노드는 value가 없는 것이 특징
    '100' : [],  # 100번 노드를 Goal이라고 가정
    '1': [],
    '9': [],
    '8': ['10', '5'],
    '10': [],
    '5': []
}


def dfs(graph, start_node):
	""" graph에 트리 구조 입력, start node에 뿌리노드(최상단 노드) 입력 """
    open, closed = [], []
    open.append(start_node)

    while open:
        node = open[-1]
        del open[-1]

        if node not in closed:
            closed.append(node)
            open.extend(graph[node])

        if node == '100':
            break

    return closed
    
    
dfs(graph, '0')  

# ------- 결과물 ------
# ['0', '3', '7', '8', '5', '10', '9', '4', '1', '6', '100']

 

양 갈래 길에서 왼쪽을 먼저 탐사할 지, 오른쪽을 먼저 탐사할 지 결정할 수 있는데요.  이부분은 랜덤으로 진행을 하거나, 특정한 룰을 주어 다음 단계로 전개할 수 있습니다. 

반응형
저작자표시 (새창열림)

'인공지능' 카테고리의 다른 글

[python] 해밍 거리 (Hamming Distance) - 동적 계획법  (0) 2022.12.31
[python] 기본적인 탐색 알고리즘 2 - BFS  (0) 2022.12.31
[인공지능] 프레임 문제 (Frame Issue)  (0) 2022.12.23
[인공지능] Strong AI vs Weak AI  (0) 2022.12.23
    '인공지능' 카테고리의 다른 글
    • [python] 해밍 거리 (Hamming Distance) - 동적 계획법
    • [python] 기본적인 탐색 알고리즘 2 - BFS
    • [인공지능] 프레임 문제 (Frame Issue)
    • [인공지능] Strong AI vs Weak AI
    Big Ben
    Big Ben
    Data Scientist

    티스토리툴바