파이썬 NetworkX를 활용하여 그래프 탐색 알고리즘을 구현하는 방법을 알려드립니다.

그래프는 여러 개의 노드(node)와 노드 사이의 연결된 에지(edge)로 구성된 자료구조입니다. 그래프는 알고리즘 및 데이터 분석에서 중요한 역할을 합니다. 그래프를 탐색하는 알고리즘은 네트워크 분석, 라우팅, 최단 경로 문제 등 다양한 문제에 활용될 수 있습니다. 이번 글에서는 파이썬의 NetworkX 라이브러리를 활용하여 그래프 탐색 알고리즘을 구현하는 방법을 알아보겠습니다.

NetworkX 소개

NetworkX는 파이썬으로 그래프를 생성, 조작, 분석하는데 사용되는 강력한 라이브러리입니다. 그래프를 편리하게 구성하고 다양한 그래프 알고리즘을 적용할 수 있는 기능을 제공합니다.

NetworkX를 설치하기 위해 다음 명령어를 사용하세요:

pip install networkx

그래프 생성하기

먼저, NetworkX를 사용하여 그래프를 생성해보겠습니다. 예를 들어, 다음과 같이 5개의 노드와 6개의 에지로 구성된 그래프를 생성할 수 있습니다.

import networkx as nx

G = nx.Graph()
G.add_nodes_from([1, 2, 3, 4, 5])
G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 5), (5, 1), (2, 4)])

깊이 우선 탐색 (Depth-First Search, DFS)

깊이 우선 탐색은 그래프를 탐색하는 기본적인 알고리즘 중 하나입니다. DFS 알고리즘은 재귀를 통해 인접한 노드를 탐색하고, 이전에 방문한 노드는 다시 방문하지 않는 특징을 가지고 있습니다.

NetworkX를 사용하여 그래프에 대한 DFS 알고리즘을 구현해보겠습니다.

visited = set()

def dfs(graph, start_node):
    visited.add(start_node)
    print(start_node, end=' ')

    for neighbor in graph.neighbors(start_node):
        if neighbor not in visited:
            dfs(graph, neighbor)

위 코드에서 visited는 이미 방문한 노드를 저장하는 집합(set)입니다. dfs() 함수는 재귀적으로 자식 노드를 탐색하고, 노드를 출력하며 이미 방문한 노드는 처리하지 않습니다.

너비 우선 탐색 (Breadth-First Search, BFS)

너비 우선 탐색은 그래프를 탐색하는 또 다른 기본적인 알고리즘입니다. BFS 알고리즘은 인접한 노드를 먼저 탐색하고, 동일한 레벨에 있는 노드부터 탐색을 진행합니다.

NetworkX를 사용하여 그래프에 대한 BFS 알고리즘을 구현해보겠습니다.

def bfs(graph, start_node):
    visited = set()
    queue = [start_node]
    visited.add(start_node)

    while queue:
        node = queue.pop(0)
        print(node, end=' ')

        for neighbor in graph.neighbors(node):
            if neighbor not in visited:
                queue.append(neighbor)
                visited.add(neighbor)

위 코드에서 visited는 이미 방문한 노드를 저장하는 집합(set)이며, queue는 탐색할 노드들의 순서를 저장하는 큐(queue)입니다. bfs() 함수는 큐에 있는 노드를 하나씩 방문하면서 인접한 노드를 큐에 추가하고, 이미 방문한 노드는 처리하지 않습니다.

마치며

이번 글에서는 NetworkX를 활용하여 파이썬에서 그래프 탐색 알고리즘을 구현하는 방법을 알아보았습니다. NetworkX는 그래프를 편리하게 생성하고 다양한 알고리즘을 적용할 수 있는 강력한 라이브러리입니다. 파이썬을 사용하여 그래프 탐색 알고리즘을 구현하고자 한다면, NetworkX를 활용해 보세요!

참고 자료