9장. 동적 프로그래밍Dynamic Programming (DP)

Slides:



Advertisements
Similar presentations
3 학년 문제가 남느냐, 내가 남느냐 1. ( 아씨방 일곱 동무 ) 아씨의 방에는 바느질을 위한 친구가 몇 명이 있었나요 ? 정답은 ? 일곱.
Advertisements

1 ‘ 우리나라의 주요공업 ’ - 정도웅, 주민혁, 안수진, 백경민, 엄다운, 박경찬 -.
수유부의 약물복용 시 주의점 발표자 조기성. 모유 수유의 장점 모유 수유의 장점은 ? 위장관 질환 발생감소 영아 돌연사 발생감소 아토피 질환 발생감소 정서적 안정.
미국의 미디어교육 신문방송학과 강진구 한인수 곽모란 이명현.
소규모 합병 공고 주식회사 포스코는 주식회사 포스하이메탈과 2015년 12월23일 합병계약을
행 렬.
PRESENTATION 저온화상이란?
15 장. 알고리즘의 설계 알고리즘 설계 학습목표 기본 패턴 패턴의 한계점 일곱 가지 패턴의 알고리즘 설계 기법을 이해한다.
Recursion SANGJI University KO Kwangman
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
공부할 내용 조상들이 살던 곳 자연과 잘 어울리는 한옥 지방에 따라 서로 다른 집의 모양 섬 지방의 집
쉽게 배우는 알고리즘 10장. 문자열 매칭.
사랑, 데이트와 성적 자율성 :데이트 성폭력!!! 성폭력예방교육 전문강사 / 여성학 전공 신 순 옥.
2017 법인관련 개정세법 곽장미 세무사.
퇴계와 율곡의 사회사상 비교 남 일 재 동서대학교 교수/ 정치학 박사 1. 퇴계 이황과 율곡 이이의 약전(略傳)
실전 데이터모델링 & 데이터베이스 설계와 구축
대포나 미사일이 없던 옛날에는 먼 거리에 있는 적의 성을 어떻게 공격했을까?
사회복지법인 실무자 교육.
501. 군인들의 세상 502. 민정 이양과 한일회담 이선용.
소규모 합병 공고 주식회사 포스코는 포스코그린가스텍 주식회사와 2016년 2월26일 합병계약을
쌓지 말고 해소하자 이 주휘 이 진영 전 민석 전 혜림.
2015년 하반기 소방교육 자 유 전 공 학 부 (금) 안녕하십니까 자유전공학부 행정실 입니다.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 1 강원대학교 컴퓨터과학전공 문양세.
2007 1학기 10 함수 활용.
8장. 동적 프로그래밍Dynamic Programming (DP)
CHAP 10:그래프 순천향대학교 하상호.
부분집합의 합 구하기 문제 부분집합의 합 구하기(Sum-of-Subsets) 문제
CHAP 10 : 그래프 C로 쉽게 풀어쓴 자료구조 생능출판사 학기 데이터구조.
CHAP 10:그래프 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 10 : 그래프 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 62).
부울대수(Boolean Algebra)
쉽게 배우는 알고리즘 9장. 그래프 알고리즘.
Dynamic Programming.
Data structures 02.3:programming recursive functions
 Branch-and-Bound (분기한정)
10장. 그래프 알고리즘.
CHAPTER 6 그래프.
동적 계획(Dynamic Programming)
Ch.03 Dynamic Programming (동적 프로그래밍 or 동적 계획법)
제 7 장 정수계획법 정수계획법의 모형화 정수계획법의 해법 분단탐색법 정수계획법 적용사례.
멸종위기종 복원사업 파워포인트의 무한한 가능성 동물생명자원과학과 임다혁.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
Dynamic Programming.
패시브하우스 신안산대학교 l 건축과 l 박효동, 박창준, 지예림.
CHAP 2:순환.
정치개혁의 가능성 논의 권력구조 개편을 통하여 본 -개헌을 통한 정부형태의 변화를 중심으로 [한국정치론] 윤성이 교수님
CHAP 2:순환 순천향대학교 컴퓨터공학과.
5장 동적계획법 (Dynamic Programming)
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
커 GO 비 의 to 홈 게임공학과 박혜원.
치료 레크레이션 프로그램 (지적 장애 대상) 과 목: 학 과: 학 번: 이 름: 제 출 일 자 담 당 교 수:
육상 허들경기 스포츠 경영전공 이슬기.
동적계획법과 최적화 문제 Dynamic Programming을 사용한 최적화 문제를 해결하는 알고리즘 설계 절차
2010년 연말정산 교육자료 센터운영팀 인사파트
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
노년기 발달 장안대 행정법률과 세류반 정 오 손
CHAP 10 : 그래프.
이번엔 핵엔슬래시 최명근.
태국 문학 욜라다 왓짜니 싸란차나 팟차라와라이 끼따야펀 르앙다우 타니다.
보건소 사업의 문제점 및 발전방향 예방의학 PK A-라 조.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
이산수학(Discrete Mathematics)
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
6차시: 장애물을 회피하는 자율주행 미션 수행하기
워밍업 실뭉치 전달게임.
삼성생명 브라보7080 연금보험 신상품 개발이익보호 신청 제안서 삼성생명 브라보7080연금보험은
음파성명학 최종욱.
강의 #3. 순환(Recursion).
아프타성 구내염- 환자 교육용.
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
Presentation transcript:

9장. 동적 프로그래밍Dynamic Programming (DP)

9장. 동적 프로그래밍 Dynamic Programming (DP)

학습목표 동적 프로그래밍이 무엇인지 이해한다. 어떤 특성을 가진 문제가 동적 프로그래밍의 적용 대상인지 감지할 수 있도록 한다. 기본적인 몇 가지 문제를 동적 프로그래밍으로 해결할 수 있도록 한다.

배경 재귀적 해법 큰 문제에 닮음꼴의 작은 문제가 깃든다 잘쓰면 보약, 잘못쓰면 맹독 관계중심으로 파악함으로써 문제를 간명하게 볼 수 있다 재귀적 해법을 사용하면 심한 중복 호출이 일어나는 경우가 있다

재귀적 해법의 빛과 그림자 재귀적 해법이 바람직한 예 재귀적 해법이 치명적인 예 퀵정렬, 병합정렬 등의 정렬 알고리즘 계승(factorial) 구하기 그래프의 DFS … 재귀적 해법이 치명적인 예 피보나치수 구하기 행렬곱셈 최적순서 구하기

도입문제: 피보나치수 구하기 f(n) = f(n-1) + f(n-2) f(1) = f(2) = 1 아주 간단한 문제지만 동적 프로그래밍의 동기와 구현이 다 포함되어 있다

피보나치수를 구하는 재귀 알고리즘 fib(n) { if (n = 1 or n = 2) then return 1;                 else return (fib(n-1) +fib(n-2)); } 엄청난 중복 호출이 존재한다

피보나치 수열의 호출 트리 중복 호출의 예 fib(7) fib(6) fib(5) fib(5) fib(4) fib(4)

피보나치수를 구하는 동적 프로그래밍 알고리즘 fibonacci(n) {         f[1] ← f[2] ← 1;         for i ← 3 to n                 f[i] ← f[i-1] +f[i-2];         return f[n]; } 선형시간에 끝난다

동적 프로그래밍의 적용 요건 최적 부분구조optimal substructure 큰 문제의 최적 솔루션에 작은 문제의 최적 솔루션이 포함됨 재귀호출시 중복overlapping recursive calls 재귀적 해법으로 풀면 같은 문제에 대한 재귀호출이 심하게 중복됨 동적 프로그래밍이 그 해결책!

문제예 1: 행렬 경로 문제 양수 원소들로 구성된 n×n 행렬이 주어지고, 행렬의 좌상단에서 시작하여 우하단까지 이동한다 이동 방법 (제약조건) 오른쪽이나 아래쪽으로만 이동할 수 있다 왼쪽, 위쪽, 대각선 이동은 허용하지 않는다 목표: 행렬의 좌상단에서 시작하여 우하단까지 이동하되, 방문한 칸에 있는 수들을 더한 값이 최소화되도록 한다

불법 이동의 예 6 7 12 5 3 11 18 17 8 10 14 9 6 7 12 5 3 11 18 17 8 10 14 9 불법 이동 (상향) 불법 이동 (좌향)

유효한 이동의 예 6 7 12 5 3 11 18 17 8 10 14 9 6 7 12 5 3 11 18 17 8 10 14 9

재귀 알고리즘 matrixPath(i, j) { if (i = 0 or j = 0) then return 0;         else return (mij + (max(matrixPath(i-1, j), matrixPath(i, j-1)))); }

호출 트리의 예 mat(4,4) mat(4,3) mat (4,2) mat(3,3) mat(4,1) mat(3,2)

DP 알고리즘 matrixPath(n) { for i ← 0 to n c[i, 0] ← 0; for j ← 1 to n ▷ (n, n)에 이르는 최고점수 {         for i ← 0 to n                  c[i, 0] ← 0;         for j ← 1 to n                 c[0, j] ← 0;         for i ← 1 to n                                      for j ← 1 to n                                                                 c[i, j] ← mij + max(c[i-1, j], c[i, j-1]);         return c[n, n]; }

문제예 2: 돌 놓기 3×N 테이블의 각 칸에 양 또는 음의 정수가 기록되어 있다 조약돌을 놓는 방법 (제약조건) 가로나 세로로 인접한 두 칸에 동시에 조약돌을 놓을 수 없다 각 열에는 적어도 하나 이상의 조약돌을 놓는다 목표: 돌이 놓인 자리에 있는 수의 합을 최대가 되도록 조약돌 놓기

테이블의 예 6 7 12 -5 5 3 11 -8 10 14 9 13 8 4 -2

합법적인 예 합법적이지 않은 예 Violation! 6 7 12 -5 5 3 11 -8 10 14 9 13 8 4 -2 6 7

가능한 패턴 패턴 1: 패턴 2: 패턴 3: 패턴 4: 6 7 12 -5 5 3 11 -8 10 14 9 13 8 4 -2 6 임의의 열을 채울 수 있는 패턴은 4가지뿐이다

서로 양립할 수 있는 패턴들 패턴 1: 패턴 2: 패턴 3: 패턴 4: 2 1 3 1 1 2 3 2 4 2 1 3 2 3 2 서로 양립할 수 있는 패턴들 패턴 1: 2 1 3 1 패턴 2: 1 2 3 2 4 2 패턴 3: 1 3 2 3 패턴 1은 패턴 2, 3과 패턴 2는 패턴 1, 3, 4와 패턴 3은 패턴 1, 2와 패턴 4는 패턴 2와 양립할 수 있다 패턴 4: 2 4

i열과 i-1열의 관계 i-1 i 6 7 12 -5 5 3 11 -8 10 14 9 13 8 4 -2 -5 … 4 i-1열이 패턴 4로 끝나거나 … 4 i-1열이 패턴 3으로 끝나거나 -5 … -5 i-1열이 패턴 1로 끝나거나

재귀 알고리즘 pebble(i, p) { if (i = 1) then return w[1, p] ; else { ▷ w[i, p] : i 열이 패턴 p로 놓일 때 i 열에 돌이 놓인 곳의 점수 합. p {1, 2, 3, 4} { if (i = 1) then return w[1, p] ; else { max ← -∞ ; for q ← 1 to 4 { if (패턴 q가 패턴 p와 양립) then { tmp ← pebble(i―1, q) ; if (tmp > max) then max ← tmp ; } return (max + w[i, p]) ;

return max { pebble(n, p) } ; } pebbleSum(n) ▷ n 열까지 조약돌을 놓은 방법 중 최대 점수 합 구하기 { return max { pebble(n, p) } ; } p =1,2,3,4 pebble(i, 1), …, pebble(i, 4) 중 최대값이 최종적인 답

호출 트리 peb(5,1) peb(4,3) peb (3,1) peb(3,2) peb(2,2) peb(2,3) peb(2,1)

DP 적용 DP의 요건 만족 최적 부분구조 재귀호출시 중복 pebble(i, .)에 pebble(i-1, .)이 포함됨 즉, 큰 문제의 최적 솔루션에 작은 문제의 최적 솔루션이 포함됨 재귀호출시 중복 재귀적 알고리즘에 중복 호출 심함

DP 알고리즘 pebble (n) { for p ← 1 to 4 peb[1, p] ← w[1, p] ; for i ← 2 to n peb[i, p] ← max {peb[i-1, q]} + w[i, p] ; return max { peb[n, p] } ; } p와 양립하는 패턴 q p =1,2,3,4 복잡도 : Θ(n)

복잡도 분석 n * 4 * 3 = Θ(n) 복잡도 : Θ(n) pebble(n) peb[1, p] ← w[1, p] ; 기껏 4 바퀴 pebble(n) { for p ← 1 to 4 peb[1, p] ← w[1, p] ; for i ← 2 to n peb[i, p] ← max {peb[i-1, q]}+w[i, p] ; return max { peb[n, p] } ; } 무시 기껏 n 바퀴 기껏 3 가지 p와 양립하는 패턴 q p =1,2,3,4 n * 4 * 3 = Θ(n) 복잡도 : Θ(n)

문제 예 3: 행렬 곱셈 순서 행렬 A, B, C 예: A:10ⅹ100, B:100ⅹ5, C:5ⅹ50 A1, A2, A3, …, An을 곱하는 최적의 순서는? 총 n-1회의 행렬 곱셈을 어떤 순서로 할 것인가?

재귀적 관계 마지막 행렬 곱셈이 수행되는 상황 n-1가지 가능성 어느 경우가 가장 매력적인가? A1(A2 … An ) (A1A2)(A3 … An) (A1A2 A3)(A4 … An) ∙ ∙ ∙ (A1 … An-2) (An-1An) (A1 … An-1)An 어느 경우가 가장 매력적인가?

min {cik + ck+1,j + pi-1pkpj} if i<j cij = cij: 행렬 Ai, …, Aj의 곱 Ai…Aj를 계산하는 최소 비용 Ak의 차원: pk-1pk 0 if i=j min {cik + ck+1,j + pi-1pkpj} if i<j cij = i ≤ k ≤ j-1 일반형: (A1 … Ak) (Ak+1 … An)

재귀적 구현 rMatrixChain(i, j) { ▷ 행렬곱 Ai…Aj를 구하는 최소 비용 구하기 { if (i = j) then return 0;    ▷ 행렬이 하나뿐인 경우의 비용은 0 min ← ∞; for k ← i to j-1 {        q ← rMatrixChain(i, k) + rMatrixChain(k+1, j) + pi-1pkpj;  if (q < min) then min ← q; } return min; 엄청난 중복 호출이 발생한다!

동적 프로그래밍 복잡도: Θ(n3) matrixChain(i, j) { for i ← 1 to n m[i, i] ← 0; ▷ 행렬이 하나뿐인 경우의 비용은 0 for r ← 1 to n-1 ▷ r: 문제 크기를 결정하는 변수, 문제의 크기 = r+1 for i ← 1 to n-r { j ← i+r; m[i, j] ← min{m[i, k] + m[k+1, j] + pi-1pkpj}; } return m[1, n]; i ≤ k ≤ j-1 복잡도: Θ(n3)

문제 예 4: 최장 공통 부분순서LCS 두 문자열에 공통적으로 들어있는 공통 부분순서 중 가장 긴 것을 찾는다 부분순서의 예 <bcdb>는 문자열 <abcbdab>의 부분순서다 공통 부분순서의 예 <bca>는 문자열 <abcbdab>와 <bdcaba>의 공통 부분순서다 최장 공통 부분순서longest common subsequence(LCS) 공통 부분순서들 중 가장 긴 것 예: <bcba>는 문자열 <abcbdab>와 <bdcaba>의 최장 공통 부분순서다

최적 부분구조 두 문자열 Xm = <x1x2 … xm>과 Yn = <y1y2 … yn>에 대해 Xm과 Yn의 LCS의 길이는 Xm-1과 Yn-1의 LCS의 길이보다 1이 크다 xm≠ yn이면 Xm과 Yn의 LCS의 길이는 Xm과 Yn-1의 LCS의 길이와 Xm-1과 Yn의 LCS의 길이 중 큰 것과 같다 0 if i = 0 or j = 0 ci-1, j-1 + 1 if i, j > 0 and xi= yj max{ci-1, j, ci, j-1} if i, j > 0 and xi ≠ yj cij = cij : 두 문자열 Xi = <x1x2 … xi>과 Yj = <y1y2 … yj>의 LCS 길이

재귀적 구현 LCS(m, n) ▷ 두 문자열 Xm과 Yn의 LCS 길이 구하기 {         if (m = 0 or n = 0) then return 0;         else if (xm= yn) then return LCS(m-1, n-1) + 1;         else return max(LCS(m-1, n), LCS(m, n-1)); } 엄청난 중복 호출이 발생한다!

호출 트리의 예 LCS(3,4) LCS(3,3) LCS(2,3) LCS(2,2) LCS(2,1) LCS(1,3)

동적 프로그래밍 복잡도: Θ(mn) LCS(m, n) ▷ 두 문자열 Xm과 Yn의 LCS 길이 구하기 {         for i ← 0 to m                 C[i, 0] ← 0;         for j ← 0 to n                 C[0, j] ← 0;         for i ← 1 to m                 for j ← 1 to n                         if (xi= yj) then C[i, j] ← C[i-1, j-1] + 1;                           else C[i, j] ← max(C[i-1, j], C[i, j-1]);         return C[m, n]; } 복잡도: Θ(mn)

문제 예 5: 최단경로 optional Weighted digraph G=(V, E) 목표 wij : vertex i에서 vertex j에 이르는 edge의 길이 Edge가 없으면 ∞ 목표 시작점 s에서 다른 각 정점vertex에 이르는 최단거리를 모두 구한다

dtk : 중간에 최대 k 개의 edge를 거쳐 s로부터 vertex t에 이르는 최단거리 목표: dtn-1 Note! For i≠s, dt0 = ∞ dt1 = ws,t 다음 페이지로 넘어가기 전에 무엇을 중심으로 관계를 파악할 지 스스로 생각해보자

재귀적 관계 dtk = min {drk-1+ wrt} ds0 = 0; dt0 = ∞; for all edges (r, t)

DP 알고리즘 a b Propagation 되는 모습이 떠오르면 잘 이해한 것! Ballman-Ford(G, s) { ds ← 0; for all vertices i ≠ s di ← ∞; for k ← 1 to n-1 { for all edges (a, b) { if (da + wab < db ) then db ← da + wab ; } b a Propagation 되는 모습이 떠오르면 잘 이해한 것!

(a) (b) i =1 (c) i =2 (e) i =4 (d) i =3 (f) i =5 8 9 10 1 3 -12 -7 11 -15 ∞ (b) i =1 8 9 10 1 3 -12 -7 11 2 4 5 -15 ∞ 8 9 10 1 3 -12 -7 11 2 4 5 -15 19 -6 ∞ (c) i =2 8 9 10 1 3 -12 -7 11 2 4 5 -15 6 (f) i =5 8 9 10 1 3 -12 -7 11 2 4 5 -15 16 12 -8 6 (e) i =4 8 9 10 1 3 -12 -7 11 2 4 5 -15 19 7 12 -6 (d) i =3

(f) i =5 (i) (g) i =6 (h) i =7 8 9 10 1 3 -12 -7 11 2 4 5 -15 6 8 9 10 6 (f) i =5 8 9 10 1 3 -12 -7 11 2 4 5 -15 -3 (g) i =6 (h) i =7 8 9 10 1 3 -12 -7 11 2 4 5 -15 7 -5 -18 6 8 9 10 1 3 -12 -7 11 2 4 5 -15 7 -5 -18 6 (i)

Thank you