반응형
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. 데이터 출력 및 성능 분석 모듈 구현
이 강의는 파이썬의 고급 그래프 이론과 알고리즘, 특히 최소 컷 문제와 강한 연결 요소 분해의 기본 개념과 구현을 익히는 것을 목표로 하며, 각 강의는 이론과 실습을 포함합니다. 다음 주차에 대한 상세 강의를 원하시면 말씀해 주세요!
반응형
'-----ETC2----- > 알고리즘(추가)' 카테고리의 다른 글
[알고리즘] Week 6: Suffix Array and Suffix Tree와 Burrows-Wheeler Transform (0) | 2024.06.02 |
---|---|
[알고리즘] Week 5: Voronoi Diagram과 Delaunay Triangulation (0) | 2024.06.02 |
[알고리즘] Week 4: 마르코프 체인과 랜덤화 알고리즘 (0) | 2024.06.02 |
[알고리즘] Week 3: 기하학적 동적 프로그래밍과 문자열 관련 동적 프로그래밍 (0) | 2024.06.02 |
[알고리즘] Week 2: 이분 그래프 매칭과 최대 가중치 매칭 (0) | 2024.06.02 |