동적계획법과 최적화 문제 Dynamic Programming을 사용한 최적화 문제를 해결하는 알고리즘 설계 절차

Slides:



Advertisements
Similar presentations
주사위를 이용한 땅 따먹기 청솔초 영재학급 4 학년 장 택 민 목차 1. 제작 동기와 원리 2. 필요한 도구 3. 게임규칙 설명 4. 게임 분석 및 전략 1. 제작 동기와 원리 2. 필요한 도구 3. 게임규칙 설명 4. 게임 분석 및 전략.
Advertisements

프로젝트 학습 중간 보고서 군포초등학교부설 지역공동 영재학급 용호초등학교5학년 이창민.
아름다운 이들의 행복한 길음안나의 집.
Windows Programming 담당교수: 이상정 교수님 발표자 : 김인태 학번 :
(사단법인)이주노동희망센터·보리샬 꼴르노커띠 학교설립추진위원회
금속의 종류와 액체의 성질에 따른 금속의 부식 창의적 산출물 연구 보고서 부명 초등 학교 임재윤 지도교사 노지은선생님
15 장. 알고리즘의 설계 알고리즘 설계 학습목표 기본 패턴 패턴의 한계점 일곱 가지 패턴의 알고리즘 설계 기법을 이해한다.
컴퓨터 개론 및 실습 강의 9.
이산수학(Discrete Mathematics)
Shortest Path Algorithm
쉽게 배우는 알고리즘 10장. 문자열 매칭.
제 6 장 그래프 6.1 그래프의 정의 6.2 용어 및 표현법 6.3 그래프의 표현 방법 6.4 그래프의 순회와 신장 트리
사회복지법인 실무자 교육.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 1 강원대학교 컴퓨터과학전공 문양세.
Dynamic Programming.
10장 정렬.
Ch.04 Greedy Method (탐욕적 방법)
쉽게 배우는 알고리즘 3장. 정렬Sorting
CHAP 10 : 그래프 C로 쉽게 풀어쓴 자료구조 생능출판사 학기 데이터구조.
CHAP 10:그래프 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 10 : 그래프 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 62).
ALGORiTHM Algorithm 2000 서울산업대학교 전자계산학과.
Dynamic Programming.
 Branch-and-Bound (분기한정)
알고리즘(Algorithm) – Greedy Method (탐욕적 방법)
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
그래프(graph) 연결되어 있는 객체 간의 관계를 표현하는 자료구조 가장 일반적인 자료구조 형태
정렬과 합병.
9장. 동적 프로그래밍Dynamic Programming (DP)
1.고객맞이 상황 응대자세 화법 중점사항 매장 밖 에 서 도보 고객 고객 방향 쪽으로 바른 자세를 취한다
영원한 복음.
예비군 훈련장 약도 ◈ 찾아 가는 길 ◈ (2) 비봉 중,고등학교 (3) 길 건너 제 2819부대 1대대 화성시 예비군 훈련장
목차 INDEX 1. 회원가입 및 로그인 2. 업체정보 3. 제조검사 신청 4. 인보이스 5. 검사진행현황(현장검사 신청)
동적 계획(Dynamic Programming)
4. 관계 데이터베이스 (Relational Database)- 7, 8장
Ch.03 Dynamic Programming (동적 프로그래밍 or 동적 계획법)
Formatted Input/Output
 Dynamic Programming (동적 프로그래밍)
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
[CPA340] Algorithms and Practice Youn-Hee Han
Dynamic Programming.
4. 관계 데이터 모델.
CHAP 2:순환.
Chapter 11. 배열과 포인터.
스크립트 작성.
5장 동적계획법 (Dynamic Programming)
Chapter 4 변수 및 바인딩.
동적계획법과 최적화 문제 Dynamic Programming을 사용한 최적화 문제를 해결하는 알고리즘 설계 절차
동적계획법과 최적화 문제 Dynamic Programming을 사용한 최적화 문제를 해결하는 알고리즘 설계 절차
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
adopted from KNK C Programming : A Modern Approach
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 10 : 그래프.
식물의 성장조건 만 든 이 : 김지혁 지도교사 : 김경순선생님.
 Dynamic Programming (동적 프로그래밍)
알고리즘 강의 슬라이드 2 분할정복 제 2 장 분할정복 도경구역, 알고리즘, 사이텍미디어, 1999.
DP 기반 최단경로 – 자료 구조 및 전략 (1/4) 주어진 그래프에 대한 W:인접행렬(adjacent matrix) 표현 W
이산수학(Discrete Mathematics)
(제작자: 임현수)모둠:임현수,유시연,유한민
6월 1주 주간메뉴표 NEW 엄마손 조식 쉐프 삼촌 중식 참새 방앗간 석식 ◎원산지 안내 : 쌀(국내산)
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
알고리즘(Algorithm) – Divide and Conquer (분할정복)
Traveling Salesman Problem – 개요 (1/2)
제 4장 그리디 알고리즘.
책을 읽읍시다  탈향 진지하게 설명해드림 1303 김소희 1309박지호 1315이지수.
2016년 제1차 운영위원회 평택시건강가정 ∙다문화가족지원센터
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
Traveling Salesman Problem – 개요 (1/2)
Traveling Salesman Problem – 개요 (1/2)
Presentation transcript:

동적계획법과 최적화 문제 Dynamic Programming을 사용한 최적화 문제를 해결하는 알고리즘 설계 절차 1단계: 문제의 입력에 대해서 최적(optimal)의 해답을 주는 재귀적 속성(recursive property)을 설정 2단계: 상향적으로 최적의 해답을 계산 예] Floyd 알고리즘에서 D, P 계산 3단계(Optional): 상향적으로 최적의 해답을 구축 예] Floyd 알고리즘에서 경로 출력 (path(index q, r)) Note: 이항 계수를 구하는 알고리즘 3.2는 최적화 문제가 아니다.

동적계획법과 최적화 문제 [주의]모든 최적화 문제를 동적 프로그래밍으로 해결할 수 있는 것은 아니다. 주어진 문제에 대해 최적의 원칙이 적용될 수 있어야 동적 프로그래밍으로 해결할 수 있다. 어떤 문제의 사례에 대한 최적 해가 그 사례를 분할한 부분사례에 대한 최적 해를 항상 포함하고 있으면, 그 문제는 최적의 원칙(The Principle of Optimality)이 적용된다 라고 한다.

최적의 원칙 (The Principle of Optimality) [예] 최단경로를 구하는 문제에서, vk를 vi에서 vj로 가는 최적 경로 상의 중간 정점이라고 할 때, - vi에서 vk 까지의 부분 경로: vi에서 vk 까지에 대한 최단경로 구하는 문제의 최적해 - vk에서 vj 까지의 부분 경로: vk에서 vj 까지에 대한 최단경로 구하는 문제의 최적해 - 즉, 어떠한 사례에 대한 최적 해는 모든 부분사례에 대한 최적해를 포함 하기 때문에 최적의 원칙을 준수한다고 볼 수 있다. 이는 재귀적 속성이 가져야 할 기본 원리 재귀적 속성이 만들어지면 Dynamic Programming을 사용하여 주어진 문제를 풀 수 있다.

최적의 원칙 (The Principle of Optimality) 주어진 다음의 그래프에서 v2에서 v1으로 가는 최종적인 최단 경로는 다음과 같다. v2  v4  v5  v1 위 최단 경로 중 v2에서 v5 까지 가는 부분 경로는 다음과 같으며, v2  v4  v5 위 부분 경로 역시 v2에서 v5 까지의 최단경로이다. 모든 경우에 대해 위와 같은 성질이 만족하면 “최적의 원칙”을 만족하게 되며, 또한 동적 프로그램 알고리즘을 구축할 수 있다. v5 v1 v4 v2 v3 3 5 1 9 2 4

최적의 원칙이 적용되지 않는 예제 최장경로(Longest Path) 문제 v1 v2 v3 v4 가정: 문제에 대한 해를 단순 경로 (Simple Path)로 제한 v2 3 v3 v1 v4 1 2 4 v1에서 v4로의 최장경로는 [v1, v3, v2, v4]가 된다. Length([v1, v3, v2, v4])=8 그러나, 이 경로의 부분 경로인 v1에서 v3으로의 최장경로는 [v1, v3]이 아니고, [v1, v2, v3]이다. Length([v1, v3])=1 Length([v1, v2, v3])=4 따라서 최장경로 문제는 최적의 원칙이 적용되지 않는다.

연쇄행렬곱셈 (Matrix-Chain Multiplication)(1/3) i  j 행렬과 j  k 행렬을 곱하기 위해서는 일반적으로 i  j  k번 만큼의 기본적인 곱셈이 필요하다. j번의 곱셈을 총

연쇄행렬곱셈 (Matrix-Chain Multiplication)(2/3) 연쇄적으로 행렬을 곱할 때, 어떤 행렬곱셈을 먼저 수행하느냐에 따라서 필요한 기본적인 곱셈의 횟수가 달라지게 된다. 예를 들어서, 다음 연쇄행렬곱셈을 생각해 보자: A1  A2  A3 A1의 크기는 10  100이고, A2의 크기는 100  5이고, A3의 크기는 5  50라고 하자. A1  A2를 먼저 계산한다면, 기본적인 곱셈의 총 횟수는 7,500회 (10 * 100 * 5) + (10 * 5 * 50) = 5,000 + 2,500 = 7,500 A2  A3를 먼저 계산한다면, 기본적인 곱셈의 총 횟수는 75,000회 (100 * 5 * 50) + (10 * 100 * 50) = 25,000 + 50,000 = 75,000

연쇄행렬곱셈 (Matrix-Chain Multiplication)(3/3)  알고리즘 개발 목표: n개의 행렬(A1 , A2 ,…, An) 을 연쇄적으로 곱할 때 기본적인 곱셈의 횟수가 가장 적게 되는 최적의 순서를 결정

연쇄행렬곱셈 – Brute-Force Algorithm 알고리즘: 가능한 모든 순서를 모두 고려해 보고, 그 중에서 곱셈 연산의 수가 가장 최소인 것을 택한다. 시간복잡도 분석: 최소한 지수(exponential-time) 시간 증명: n개의 행렬(A1 , A2 ,…, An)을 곱할 수 있는 모든 순서의 가지 수: tn 만약 A1이 마지막으로 곱하는 행렬이라고 하면, 행렬 A2 ,…, An을 곱하는 데는 tn-1개의 가지수가 있을 것이다. An이 마지막으로 곱하는 행렬이라고 하면, 행렬 A1,…, An-1을 곱하는 데는 또한 tn-1개의 가지수가 있을 것이다. 그러면, tn  tn-1 + tn-1 = 2 tn-1이고, t2= 1이라는 사실은 쉽게 알 수 있다. 따라서 tn  2tn-1  22tn-2  …  2n-2t2 = 2n-2 이다.

연쇄행렬곱셈 –최적의 원칙 A1 ((((A2 A3) A4) A5) A6) (A2 A3) A4 최적의 원칙(Principle of Optimality)이 성립하는가?  n개의 행렬을 곱하는 최적의 순서는 n개의 행렬 중 일부 부분집합에 속하는 행렬을 곱하는 최적의 순서를 항상 포함한다. 예를 들어, 6개의 행렬(A1 , A2 ,…, A6)을 곱한다고 가정할 때 최적해가 다음과 같다면, 3개의 행렬(A2 , A3 , A4)을 곱하는 최적의 순서는 다음과 같다.  그러므로, “최적의 원칙”을 만족하게 되며, 또한 동적 프로그램 알고리즘 을 구축할 수 있다. A1 ((((A2 A3) A4) A5) A6) (A2 A3) A4

DP 기반 연쇄행렬곱셈 – 설계 (1/2) n개의 행렬(A1 , A2 ,…, An)을 연쇄적으로 곱할 때, dk를 행렬 Ak의 열(column)의 수라고 정의하면 dk-1는 행렬 Ak-1의 열의 수 자연히 Ak의 행(row)의 수는 dk-1가 된다. A1의 행의 수는 d0라고 하자. 그렇다면, 간단하게 (A1A2)A3의 곱셈 연산 횟수는? d0d1d2 + d0d2d3

DP 기반 연쇄행렬곱셈 – 설계 (2/2) 우선, 다음의 M[i][j]를 정의 M[i][j] = Ai부터 Aj까지의 행렬을 곱하는데 필요한 곱셈의 최소 횟수 (if 1  i < j  n) = 0 (if i == j ) 따라서, 최적의 순서에 대한 곱셈의 최소 횟수는 다음과 같다.

DP 기반 연쇄행렬곱셈 – 설계 (2/2) 그러면, 다음과 같이 재귀적 속성을 구축할 수 있다. 일반화된 재귀적 속성 k = i, i+1, ..., j-2, j-1 M[i][j] = Ai부터 Aj까지의 행렬을 곱하는데 필요한 곱셈의 최소 횟수 (if 1  i < j  n) = 0 (if i == j )

DP 기반 연쇄행렬곱셈 – 재귀식 적용 예 d0 d1 d1 d2 d2 d3 d3 d4 d4 d5 d5 d6 위와 같은 6개의 행렬의 부분집합인 3개의 행렬(A4 , A5 , A6)을 곱하는 순서는 다음과 같이 2가지 경우가 있다. 1. A4 (A5 A6) 2. (A4 A5) A6 그러므로, 3개의 행렬(A4 , A5 , A6)을 곱하는 최적의 순서에 대한 최소 곱셈의 수는 다음과 같다.

DP 기반 연쇄행렬곱셈 – 재귀식 적용 예 대각선 1 대각선 2 대각선 3 대각선 4 대각선 5 즉, 행렬 M은 M[i][i]을 모두 0으로 세팅한 이후 대각선 1, 대각선 2, 대각선 3, … 순으로 각 원소를 계산한다.

DP 기반 연쇄행렬곱셈 – 최적 순서의 구축 (A1 A2 A3 A4 A5 A6) (A1(A2 A3 A4 A5 A6)) 최적 순서를 얻기 위해서는 M[i][j]를 계산할 때 최소값을 주는 k값을 P[i][j]에 기억한다. 예: P[2][5] = 4인 경우의 최적 순서는 (A2 A3 A4)A5이다. 구축한 P는 다음과 같다. 따라서, 최적의 행렬 곱셈 순서는 (A1((((A2 A3) A4) A5) A6))이다. (A1(A2 A3 A4 A5 A6)) (A1((A2 A3 A4 A5) A6)) (A1(((A2 A3 A4) A5) A6)) (A1((((A2 A3) A4) A5) A6)) (A1 A2 A3 A4 A5 A6)

DP 기반 연쇄행렬곱셈 – 알고리즘 (1/2) 문제: n개의 행렬을 곱하는데 필요한 기본적인 곱셈 횟수의 최소치를 결정하고, 그 최소치를 구하는 순서를 결정하라. 입력: 행렬의 수 n, 배열 d[0..n] (d[i-1]  d[i]는 i번째 행렬의 ”행의 수 * 열의 수”를 나타낸다.) 출력: 기본적인 곱셈 횟수의 최소치를 나타내는 minmult; 최적의 순서를 얻을 수 있는 배열 P (여기서 P[i][j]는 행렬 i부터 j까지가 최적 순서로 갈라지는 기점을 나타낸다.)

DP 기반 연쇄행렬곱셈 – 알고리즘 (2/2) [알고리즘 3.6](p.110) int minmult(int n, int[] d, index[][] P){ index i, j, k, diagonal; int[][] M = new int[1..n][1..n]; for(i=1; i <= n; i++) M[i][i] = 0; for(diagonal = 1; diagonal <= n-1; diagonal++) for(i=1; i <= n-diagonal; i++) { // i: row j = i + diagonal; // j: column M[i][j] = minimum (M[i][k]+M[k+1][j]+d[i-1]*d[k]*d[j]); ikj-1 P[i][j] = 최소치에 해당하는 k의 값 } return M[1][n];

DP 기반 연쇄행렬곱셈 – 알고리즘 분석 단위연산: 각 k을 얻기 위하여 실행되는 명령문(instruction), 여기서 최소값인 지를 알아보는 비교문도 포함한다. 입력크기: 곱하려는 행렬의 수 n 분석: j = i + diagonal이므로, k-루프를 수행하는 횟수 = i-루프를 수행하는 횟수 = n – diagonal diagonal의 범위는 1 ~ (n-1)이므로, 모든 경우 시간 복잡도는…

DP 기반 연쇄행렬곱셈 – 최적 해의 출력 문제: n개의 행렬을 곱하는 최적의 순서를 출력하시오. 입력: 정적인 입력  n과 앞서 구한 2차원 배열 P 동적인 입력  i, j(i번째 부터 j번째 까지의 행렬 곱셈을 의미) 출력: 최적의 순서 [알고리즘3.7] (p. 112): 복잡도 분석: T(n)  (n)  Why? void order(index i, index j){ if (i == j) System.out.print(“A” + i); else { k = P[i][j]; System.out.print(“(”); order(i,k); order(k+1,j); System.out.print(“)”); }

DP 기반 연쇄행렬곱셈 – 개선된 솔루션 Yao(1982)  (n2) Hu and Shing(1982, 1984)  (n lg n)