본문 바로가기
-----ETC2-----/알고리즘(추가)

[알고리즘] Week 1: 최소 컷 문제와 강한 연결 요소 분해

by cogito21_python 2024. 6. 2.
반응형

Day 1: 최소 컷 문제 (Minimum Cut Problem)

  • 강의 내용:
    • 최소 컷 문제의 개념
      • 최소 컷 문제란 무엇인가?
      • 네트워크에서 최소 컷의 중요성 및 응용 사례
    • 최소 컷 문제의 정의
      • 최대 유량 - 최소 컷 정리 (Max-Flow Min-Cut Theorem)
      • 컷의 개념과 용량
    • 최소 컷 알고리즘
      • 에드몬드-카프 알고리즘 (Edmonds-Karp Algorithm)
      • 푸드-풀커슨 알고리즘 (Ford-Fulkerson Algorithm)
  • 실습:
    • 파이썬을 사용한 간단한 최소 컷 문제 구현 및 예제
# 파이썬을 사용한 최소 컷 문제 예제: 에드몬드-카프 알고리즘
from collections import deque

def bfs(graph, source, sink, parent):
    visited = [False] * len(graph)
    queue = deque([source])
    visited[source] = True

    while queue:
        u = queue.popleft()
        for ind, val in enumerate(graph[u]):
            if visited[ind] == False and val > 0:
                queue.append(ind)
                visited[ind] = True
                parent[ind] = u
                if ind == sink:
                    return True
    return False

def edmonds_karp(graph, source, sink):
    parent = [-1] * len(graph)
    max_flow = 0

    while bfs(graph, source, sink, parent):
        path_flow = float('Inf')
        s = sink

        while s != source:
            path_flow = min(path_flow, graph[parent[s]][s])
            s = parent[s]

        v = sink
        while v != source:
            u = parent[v]
            graph[u][v] -= path_flow
            graph[v][u] += path_flow
            v = parent[v]

        max_flow += path_flow

    return max_flow

# 예제 실행
graph = [[0, 16, 13, 0, 0, 0],
         [0, 0, 10, 12, 0, 0],
         [0, 4, 0, 0, 14, 0],
         [0, 0, 9, 0, 0, 20],
         [0, 0, 0, 7, 0, 4],
         [0, 0, 0, 0, 0, 0]]

source = 0
sink = 5
print("에드몬드-카프 알고리즘에 의한 최대 유량:", edmonds_karp(graph, source, sink))  # 23

 

Day 2: 최소 컷 문제 심화

  • 강의 내용:
    • 최소 컷 문제의 응용
      • 네트워크 설계 및 최적화
      • 데이터 클러스터링
    • 고급 최소 컷 알고리즘
      • 나가모치-이바타 (Nagamochi-Ibaraki) 알고리즘
      • 코픽 (Karger) 알고리즘
    • 시간 복잡도 분석
      • 고급 알고리즘의 복잡도 및 효율성
  • 실습:
    • 파이썬을 사용한 고급 최소 컷 알고리즘 구현 및 예제
# 파이썬을 사용한 고급 최소 컷 문제 예제: 코픽 알고리즘
import random
import copy

def karger_min_cut(graph):
    while len(graph) > 2:
        u = random.choice(list(graph.keys()))
        v = random.choice(graph[u])
        
        # Merge u and v
        for vertex in graph[v]:
            if vertex != u:
                graph[u].append(vertex)
                graph[vertex].remove(v)
                graph[vertex].append(u)

        del graph[v]

        graph[u] = [x for x in graph[u] if x != u]

    return len(graph[list(graph.keys())[0]])

# 예제 실행
graph = {
    0: [1, 2],
    1: [0, 2, 3],
    2: [0, 1, 3],
    3: [1, 2]
}

min_cut = float('Inf')
for i in range(100):  # 여러 번 실행하여 최소 컷 찾기
    trial_graph = copy.deepcopy(graph)
    min_cut = min(min_cut, karger_min_cut(trial_graph))

print("코픽 알고리즘에 의한 최소 컷:", min_cut)  # 2

 

Day 3: 강한 연결 요소 분해 (Strongly Connected Components)

  • 강의 내용:
    • 강한 연결 요소의 개념
      • 강한 연결 요소란 무엇인가?
      • 그래프에서 강한 연결 요소의 중요성
    • 강한 연결 요소 탐색 알고리즘
      • 코사라주 알고리즘 (Kosaraju's Algorithm)
      • 타잔 알고리즘 (Tarjan's Algorithm)
    • 시간 복잡도 분석
      • 강한 연결 요소 탐색 알고리즘의 복잡도 및 효율성
  • 실습:
    • 파이썬을 사용한 강한 연결 요소 탐색 알고리즘 구현 및 예제
# 파이썬을 사용한 강한 연결 요소 탐색 예제: 타잔 알고리즘
class Graph:
    def __init__(self, vertices):
        self.V = vertices
        self.graph = defaultdict(list)
        self.Time = 0

    def add_edge(self, u, v):
        self.graph[u].append(v)

    def SCCUtil(self, u, low, disc, stack_member, stack):
        disc[u] = self.Time
        low[u] = self.Time
        self.Time += 1
        stack_member[u] = True
        stack.append(u)

        for v in self.graph[u]:
            if disc[v] == -1:
                self.SCCUtil(v, low, disc, stack_member, stack)
                low[u] = min(low[u], low[v])
            elif stack_member[v]:
                low[u] = min(low[u], disc[v])

        w = -1
        if low[u] == disc[u]:
            while w != u:
                w = stack.pop()
                print(w, end=" ")
                stack_member[w] = False
            print("")

    def SCC(self):
        disc = [-1] * self.V
        low = [-1] * self.V
        stack_member = [False] * self.V
        stack = []

        for i in range(self.V):
            if disc[i] == -1:
                self.SCCUtil(i, low, disc, stack_member, stack)

# 예제 실행
g = Graph(5)
g.add_edge(1, 0)
g.add_edge(0, 2)
g.add_edge(2, 1)
g.add_edge(0, 3)
g.add_edge(3, 4)

print("타잔 알고리즘에 의한 강한 연결 요소들:")
g.SCC()  # Output: 4 3, 2 1 0

 

Day 4: 강한 연결 요소 분해 심화

  • 강의 내용:
    • 강한 연결 요소 분해의 응용
      • 소프트웨어 모듈 분석
      • 웹 크롤링
    • 고급 강한 연결 요소 알고리즘
      • 강한 연결 요소 분해의 최적화 기법
    • 시간 복잡도 분석
      • 고급 알고리즘의 복잡도 및 효율성
  • 실습:
    • 파이썬을 사용한 고급 강한 연결 요소 알고리즘 구현 및 예제
# 고급 강한 연결 요소 예제: 코사라주 알고리즘
class Graph:
    def __init__(self, vertices):
        self.V = vertices
        self.graph = defaultdict(list)

    def add_edge(self, u, v):
        self.graph[u].append(v)

    def fill_order(self, v, visited, stack):
        visited[v] = True
        for i in self.graph[v]:
            if not visited[i]:
                self.fill_order(i, visited, stack)
        stack.append(v)

    def get_transpose(self):
        g = Graph(self.V)
        for i in self.graph:
            for j in self.graph[i]:
                g.add_edge(j, i)
        return g

    def DFS_util(self, v, visited):
        visited[v] = True
        print(v, end=" ")
        for i in self.graph[v]:
            if not visited[i]:
                self.DFS_util(i, visited)

    def print_SCCs(self):
        stack = []
        visited = [False] * self.V
        for i in range(self.V):
            if not visited[i]:
                self.fill_order(i, visited, stack)

        gr = self.get_transpose()
        visited = [False] * self.V
        while stack:
            i = stack.pop()
            if not visited[i]:
                gr.DFS_util(i, visited)
                print("")

# 예제 실행
g = Graph(5)
g.add_edge(1, 0)
g.add_edge(0, 2)
g.add_edge(2, 1)
g.add_edge(0, 3)
g.add_edge(3, 4)

print("코사라주 알고리즘에 의한 강한 연결 요소들:")
g.print_SCCs()  # Output: 4, 3, 2 1 0

 

Day 5: 고급 그래프 이론 종합 연습

  • 강의 내용:
    • 종합 연습 문제 풀이
      • 최소 컷 문제 및 강한 연결 요소 분해 문제 해결
    • 고급 그래프 알고리즘의 응용
      • 다양한 실생활 문제에서의 응용 사례
  • 실습:
    • 종합 연습 문제 해결 및 결과 분석
### 종합 연습 문제 예시
1. 주어진 유량 네트워크에서 최소 컷을 찾으세요.
2. 주어진 그래프에서 강한 연결 요소를 분해하세요.

 

Day 6: 프로젝트 준비

  • 강의 내용:
    • 프로젝트 주제 선정 및 요구사항 분석
      • 프로젝트 주제 및 요구사항 확정
      • 프로젝트 설계 및 계획 수립
    • 프로젝트 구현 준비
      • 데이터 구조 및 알고리즘 설계
      • 프로젝트 팀 구성 및 역할 분담
  • 실습:
    • 프로젝트 주제 및 요구사항 분석
    • 프로젝트 설계 및 계획 수립
### 프로젝트 주제 예시
1. 대규모 네트워크 최적화 시스템 개발
2. 소프트웨어 모듈 분석 및 최적화 시스템

### 프로젝트 요구사항 예시
1. 대규모 네트워크 최적화 시스템:
   - 대규모 네트워크 데이터셋 입력 및 저장
   - 고급 그래프 알고리즘을 통한 최적화
   - 최적화 결과 출력 및 성능 분석

### 프로젝트 설계 및 계획 예시
1. 데이터 입력 모듈 구현
2. 고급 그래프 알고리즘 구현 (최소 컷, 강한 연결 요소 등)
3. 데이터 출력 및 성능 분석 모듈 구현

 

이 강의는 파이썬의 고급 그래프 이론과 알고리즘, 특히 최소 컷 문제와 강한 연결 요소 분해의 기본 개념과 구현을 익히는 것을 목표로 하며, 각 강의는 이론과 실습을 포함합니다. 다음 주차에 대한 상세 강의를 원하시면 말씀해 주세요!

반응형