1. Trang chủ
  2. » Thể loại khác

Tài liệu môn học - Application of Algo. chapter05

26 135 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 26
Dung lượng 404,63 KB

Nội dung

Tài liệu môn học - Application of Algo. chapter05 tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn v...

Quy hoạch động (Dynamic Programming) Khoa Công Nghệ Thông Tin, Trường Đại Học Thủy Lợi Ngày tháng năm 2017 / 26 Sơ đồ chung Tương tự thuật tốn Chia để trị Các tốn khơng độc lập Giải toán lưu trữ lời giải bảng để sử dụng sau Chia để trị giải toán theo cách tiếp cận từ xuống quy hoạch động giải toán theo cách từ lên Quy hoạch động dành riêng cho toán tối ưu / 26 Sơ đồ chung - bước Chia thành toán con: xác định cấu trúc toán Những toán nhỏ giải cách trực tiếp Dễ dàng kết hợp giải pháp cho toán Lưu trữ lời giải cho toán con: tránh phải giải lại nhiều lần toán Kết hợp Từ lên Thiết lập giải pháp cho toán từ giải pháp tốn / 26 Sơ đồ chung Để đạt hiệu Số lượng toán phải giới hạn đa thức kích thước đầu vào Các tốn phải giải tối ưu / 26 Mảng lớn Cho mảng số: A = a1 , , an Một mảng A A[i, j] = , , aj có trọng số w (A[i, j]) = jk=i ak Tìm mảng A có trọng số lớn Example Chuỗi: -2, 11, -4, 13, -5, Chuỗi trọng số lớn 11, -4, 13 có trọng số 20 / 26 Mảng lớn Si trọng số mảng lớn kết thúc vị trí (phần tử cuối mảng ) S1 = a1 Với i > 1: Si = Si−1 + , Si−1 < , ngược lại Giá trị mục tiêu tối ưu maxi∈{1, ,n} {Si } / 26 Tập độc lập trọng số lớn Cây Cho T = (V , E ) r gốc Với nút v ∈ V w (v ): trọng số v f (v ): cha v , theo quy ước f (r ) = null T (v ): T có gốc v Children(v ): tập v Một tập độc lập T tập S ⊆ V cho v f (v ) thuộc S, ∀v ∈ V \ {r } Tìm tập độc lập T có tổng trọng số lớn / 26 Tập độc lập trọng số lớn Cây Đặt S(v ) trọng số tập độc lập lớn T (v ), ∀v ∈ V Đặt S(v ) trọng số tập độc lập lớn T (v ) \ {v } (không xét v ) S(v ) = x∈Children(v ) S(x), ∀v S(v ) = max{S(v ), w (v ) + ∈V x∈Children(v ) S(x)}, ∀v ∈V Nếu v lá, S(v ) = w (v ) S(v ) = / 26 Tập độc lập trọng số lớn Cây Algorithm 1: MaxIndependentSetOnTree(T = (V , E )) Q ← ∅; foreach v ∈ V deg (v ) ← Children(v ); if deg (v ) = then Enqueue(v , Q); S(v ) ← w (v ); S(v ) ← 0; while Q = ∅ v ← Dequeue(Q); T ← w (v ) + x∈Children(v ) S(x); T ← x∈Children(v ) S(x); if T > T then S(v ) ← T ; sel(v ) ← true; else S(v ) ← T ; sel(v ) ← false; S(v ) ← T ; u ← parent(v ); deg (u) ← deg (u) − 1; if deg (u) = then Enqueue(u, Q); / 26 Tập độc lập trọng số lớn Cây Algorithm 2: printSol(v ) if sel(v ) = true then print(v ); foreach x ∈ Children(v ) printSolExclude(x); else foreach x ∈ Children(v ) printSol(x); Algorithm 3: printSolExclude(v ) foreach x ∈ Children(v ) printSol(x); 10 / 26 Tập độc lập trọng số lớn Cây Cài đặt n = 0; while ( true ){ int u = in nextInt (); if ( u == -2) break ; n ++; mID2Index put (u , n -1); int wu = in nextInt (); int pu = in nextInt (); mID2Weight put (u , wu ); mID2Parent put (u , pu ); } p = new int [ n ]; w = new int [ n ]; id = new int [ n ]; 12 / 26 Tập độc lập trọng số lớn Cây Cài đặt for ( int k : mID2Index keySet ()){ int u = mID2Index get ( k ); id [ u ] = k ; int wu = mID2Weight get ( k ); int pu = mID2Parent get ( k ); if ( pu >= 0) pu = mID2Index get ( pu ); p [ u ] = pu ; w [ u ] = wu ; } in close (); } catch ( Exception ex ){ ex pr in t St ac k Tr ac e (); } } 13 / 26 Tập độc lập trọng số lớn Cây Cài đặt public void solve (){ int [] m = new int [ n ]; // m [ i ] is the MIDS on subtree rooted at i int [] me = new int [ n ]; // me [ i ] is the MIDS on subtree rooted at // i excluding node i int [] d = new int [ n ]; // d [ i ] is the degree of node i // ( number of children of node i ) for ( int i = 0; i < n ; i ++) d [ i ] = 0; for ( int i = 0; i < n ; i ++){ int pi = p [ i ]; if ( pi >= 0) d [ pi ]++; } Queue Q = new LinkedList (); for ( int i = 0; i < n ; i ++){ m [ i ] = w [ i ]; me [ i ] = 0; if ( d [ i ] == 0) Q add ( i ); } 14 / 26 Tập độc lập trọng số lớn Cây Cài đặt while ( Q size () > 0){ int j = ( int ) Q remove (); int i = p [ j ]; if ( i >= 0){ me [ i ] += m [ j ]; m [ i ] += me [ j ]; d [ i ] - -; if ( d [ i ] == 0){ m [ i ] = me [ i ] > m [ i ] ? me [ i ] : m [ i ]; Q add ( i ); } } } int max = -1; for ( int i = 0; i < n ; i ++) max = max > m [ i ] ? max : m [ i ]; System out println ( " result = " + max ); } public static void main ( String [] args ) { M a x I n d e p e n d e n t S e t O n T r e e s MIST = new M a x I n d e p e n d e n t S e t O n T r e e s (); MIST readData ( " data \\ week7 \\ M a x I n d e p e n d e n t S e t O n T r e e s \\ MIST txt " ); MIST solve (); } } 15 / 26 Chuỗi chung dài Đặt X = x1 , , xn chuỗi, chuỗi X tạo nên cách loại bỏ vài phần tử từ X Chiều dài chuỗi số lượng phần tử chuỗi Bài tốn: cho hai chuỗi X = x1 , , xn Y = y1 , , ym , tìm chuỗi chung dài X Y 16 / 26 Chuỗi chung dài S(i, j) chuỗi dài x1 , xi y1 , , yj , ∀0 ≤ i ≤ n, ≤ j ≤ m S(0, j) = 0, ∀0 ≤ j ≤ m S(i, 0) = 0, ∀0 ≤ i ≤ n với i > 0, j > 0: S(i, j) = S(i − 1, j − 1) + 1, max{S(i − 1, j), S(i, j − 1)}, xi = yj ngược lại Giá trị mục tiêu tối ưu S(n, m) 17 / 26 Chuỗi chung dài Algorithm 4: LCS(X , Y ) Input: Hai chuỗi X = x1 , , xn Y = y1 , , ym Output: Độ dài chuỗi chung dài x y foreach j = 0, , m S(0, j) ← 0; foreach i = 0, , n S(i, 0) ← 0; foreach i = 1, , n foreach j = 1, , m if xi = yj then S(i, j) ← S(i − 1, j − 1) + 1; else S(i, j) ← max{S(i − 1, j), S(i, j − 1)}; return S(n, m); 18 / 26 Chuỗi chung dài - Cài đặt package week7 ; import java util Scanner ; import java io File ; import java util ArrayList ; public class L o n g e s t C o m m o n S u b s e q u e n c e { private int [] a ; private int [] b ; public void readData ( String fn ) { try { Scanner in = new Scanner ( new File ( fn )); ArrayList < Integer > ta = new ArrayList < Integer >(); while ( true ) { int x = in nextInt (); if ( x == -1) break ; ta add ( x ); } a = new int [ ta size () + 1]; for ( int i = 0; i < ta size (); i ++) a [ i + 1] = ta get ( i ); ta clear (); } 19 / 26 Chuỗi chung dài - Cài đặt while ( true ) { int x = in nextInt (); if ( x == -1) break ; ta add ( x ); } b = new int [ ta size () + 1]; for ( int i = 0; i < ta size (); i ++) b [ i + 1] = ta get ( i ); in close (); } catch ( Exception ex ) { ex pr in t St ac k Tr ac e (); } } 20 / 26 Chuỗi chung dài - Cài đặt public void solve () { int [][] S = new int [ a length ][ b length ]; char [][] traces = new char [ a length ][ b length ]; for ( int i = 0; i < a length ; i ++) for ( int j = 0; j < b length ; j ++) traces [ i ][ j ] = 0; for ( int i = 0; i < a length ; i ++) S [ i ][0] = 0; for ( int i = 0; i < b length ; i ++) S [0][ i ] = 0; 9 for ( int i = 1; i < a length ; i ++) { for ( int j = 1; j < b length ; j ++) { if ( a [ i ] == b [ j ]) { S [ i ][ j ] = S [i -1][ j -1] + 1; traces [ i ][ j ] = ’D ’; // diagonal } else { if ( S [i -1][ j ] > S [ i ][ j -1]) { S [ i ][ j ] = S [i -1][ j ]; traces [ i ][ j ] = ’U ’; // move up } else { S [ i ][ j ] = S [ i ][ j - 1]; traces [ i ][ j ] = ’L ’; // move left } } } } 21 / 26 Chuỗi chung dài - Cài đặt System out println ( " Result = " + S [ a length - 1][ b length - 1]); int i = a length - 1; int j = b length - 1; while ( i >= && j >= 1) { if ( traces [ i ][ j ] == ’D ’) { System out println ( i + " ," + j + " > " + a [ i ]); i = i -1; j = j -1; } else { if ( traces [ i ][ j ] == ’U ’ ){ i = i -1; } else { j = j -1; } } } } public static void main ( String [] args ) { L o n g e s t C o m m o n S u b s e q u e n c e LCSS = new L o n g e s t C o m m o n S u b s e q u e n c e (); LCSS readData ( " data \\ week7 \\ L o n g e s t C o m m o n S u b s e q u e n c e \\ LCSS txt " ); LCSS solve (); } } 22 / 26 Bài toán Khoảng-Cách-Biến-Đổi Đầu vào: chuỗi X = x1 , , xn Y = y1 , , ym thao tác X Chèn ký tự vào sau vị trí i Xóa ký tự vị trí i Thay ký tự ký tự khác Tìm chuỗi thao tác với chiều dài nhỏ để biến X thành Y (khoảng cách X Y ) 23 / 26 Bài toán Khoảng-Cách-Biến-Đổi Với ≤ i ≤ n ≤ j ≤ m, d(i, j) khoảng cách hai chuỗi x1 , , xi y1 , , yj d(0, 0) = d(0, j) = j, ∀j = 1, , m d(i, 0) = i, ∀i = 1, , n d(i, j) = min{d(i − 1, j − 1) + δ(i, j), d(i − 1, j) + 1, d(i, j − 1) + 1} với δ(i, j) = , if xi = yj , otherwise 24 / 26 Khoảng-Cách-Biến-Đổi Algorithm 5: EditDistance(X , Y ) Input: Hai chuỗi X = x1 , , xn Y = y1 , , ym Output: Số lượng thao tác nhỏ để biến X thành Y foreach j = 1, , m d(0, j) ← j; foreach i = 1, , n d(i, 0) ← i; d(0, 0) ← 0; foreach i = 1, , n foreach j = 1, , m δ ← 1; if xi = yj then δ ← 0; d(i, j) = max{d(i − 1, j − 1) + δ, d(i − 1, j) + 1, d(i, j − 1) + 1}; return d(n, m); 25 / 26 Bài tập Gold Nurses Chuỗi lớn Tháp Babylon Marble Cut Mạng giao tiếp 26 / 26 ... == b [ j ]) { S [ i ][ j ] = S [i -1 ][ j -1 ] + 1; traces [ i ][ j ] = ’D ’; // diagonal } else { if ( S [i -1 ][ j ] > S [ i ][ j -1 ]) { S [ i ][ j ] = S [i -1 ][ j ]; traces [ i ][ j ] = ’U ’;... ][ j - 1]; traces [ i ][ j ] = ’L ’; // move left } } } } 21 / 26 Chuỗi chung dài - Cài đặt System out println ( " Result = " + S [ a length - 1][ b length - 1]); int i = a length - 1; int... có trọng số w (A[i, j]) = jk=i ak Tìm mảng A có trọng số lớn Example Chuỗi: -2 , 11, -4 , 13, -5 , Chuỗi trọng số lớn 11, -4 , 13 có trọng số 20 / 26 Mảng lớn Si trọng số mảng lớn kết thúc vị trí (phần

Ngày đăng: 21/12/2017, 12:33

TỪ KHÓA LIÊN QUAN