Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
21
Dung lượng
4,18 MB
Nội dung
TRƯỜNG ĐẠI HỌC GIAO THƠNG VẬN TẢI TP HỒ CHÍ MINH KHOA CƠNG NGHỆ THƠNG TIN THUYẾT TRÌNH PHÂN TÍCH THIẾT KẾ GIẢI THUẬT CHƯƠNG 3: PHÂN TÍCH ĐỘ PHỨC TẠP CỦA MỘT SỐ GIẢI THUẬT TRÊN CẤU TRÚC DỮ LIỆU NHĨM 7: 20H1120138 – HỒNG ANH KIỆT 20H1120174 – TRƯƠNG ĐÌNH THIỆN 20H1120114 – ĐẶNG HỒNG GIA ĐẠT Giảng viên hướng dẫn: Trần Tuấn Anh Thành phố Hồ Chí Minh – 2022 QUY HOẠCH ĐỘNG 1.Giới thiệu: Quy hoạch động phương pháp giảm thời gian chạy thuật tốn thể tính chất toán gối (overlapping subproblem) cấu trúc tối ưu (optimal substructure) Cấu trúc tối ưu có nghĩa lời giải tối ưu cho tốn sử dụng để tìm lời giải tối ưu cho tốn tồn cục Ví dụ, đường ngắn tới đỉnh đồ thị tìm thấy cách: trước hết tính đường ngắn tới đích từ tất đỉnh kề nó, dùng kết để chọn đường toàn cục tốt nhất, hình sau Nói chung, ta giải toán với cấu trúc tối ưu quy trình ba bước: Chia tốn thành toán nhỏ Giải toán cách tối ưu cách sử dụng đệ quy quy trình ba bước Sử dụng kết tối ưu để xây dựng lời giải tối ưu cho toán ban đầu Các toán giải cách chia chúng thành toán nhỏ hơn, tiếp tục thế, ta đến trường hợp đơn giản dễ tìm lời giải 2.Quy hoạch động thường áp dụng sau: • Quy động hoạch (dynamic programming) giải toán cách kết hợp lời giải toán toán xét • Phương pháp khả dụng toán không độc lập nhau, tức tốn có dung chung tốn “cháu” (subsubproblem) • Quy hoạch động giải tốn cháu dung chung lần lưu lời giải chúng bảng sau khỏi phải tính lại gặp tốn • Quy hoạch động thường áp dụng cho toán tối ưu hóa (optimization problem) 3.Q trình xây dựng giải thuật quy hoạch động: (Gồm bước) Đặc trưng hóa cấu trúc lời giải tối ưu Định nghĩa giá trị lời giải tối ưu cách đệ quy Tính trị lời giải tối ưu theo kiểu từ lên Cấu tạo lời giải tối ưu từ thơng tin tính tốn PHẦN I: NHÂN MA TRẬN Giới thiệu toán nhân ma trận: Cho ma trận A(p,q) B(q,r) Khi nhân ma trận độ phức tạp số phép nhân số (p*q*r) Phép nhân tính giao hốn có tính kết hợp VD: A1*A2*A3 = A1*(A2*A3) = (A1*A2)*A3 Nên với phép nhân từ ma trận trở lên với cách kếp hợp khác có độ phức tạp khác VD: A1(10x100), A2(100x5), A3(5x50) A1*(A2*A3) có 100x5x50 + 10x100x50 = 25000 + 50000 = 75000 phép nhân số (A1*A2)*A3 có 10x100x5 + 10x5x50 = 5000 + 2500 = 7500 phép nhân số (giảm 10 lần) Mục tiêu quy hoạch động toán nhân n ma trận tìm cách kết hợp phép nhân cho tổng số phép nhân số nhỏ (phép nhân vô hướng) Độ phức tạp: Nhân ma trận: Với ma trận AA kích thước (m×n)(m×n) ma trận BB kích thước (n×p)(n×p) Độ phức tạp thuật tốn để tính BB O(m×n×p)O(m×n×p) Ghi chú: Đối với phép nhân ma trận vng kích thước (n×n), có thuật tốn nhân ma trận Strassen với độ phức tạp O(nlog27)≈O(n2.807) theo tư tưởng chia nhỏ ma trận (tương tự cách nhân nhanh số lớn) Tuy nhiên cài đặt phức tạp thực tế với giá trị n thường gặp, cách không chạy nhanh nhân ma trận thông thường O(n3) Lũy thừa ma trận: Với ma trận vng A cấp n, thuật tốn tính Ak có độ phức tạp O(n3×log k) Cách giải toán theo phương pháp quy hoạch động: Cho dãy ma trận A1, A 2,…,An, ma trận Ai có kích thước Pi-1 x Pi Đầu vào: dãy kích thước P0, P1,…, Pn Đầu ra: dãy tích ma trận A1, A2,…,An kết hợp với dấu ngoặc cho tích ma trận có tổng số phép tính vơ hướng nhỏ Gọi A i…j (i < j) tích A i*Ai+1*…*Aj Ta chia tích Ai*Ai+1*…*Aj = (Ai*Ai+1*…*Ak)*(Ak+1*Ak+2*…*Aj) Tức Ai…j = Ai…k * Ak+1…j Có (j - i) cách chia (ứng với k = i,…, j -1) Để tối ưu hố tích Ai…j A i…k Ak+1…j phải tối ưu Đặt m[i, j] số nhỏ phép nhân số để tính tích A i…j Như m[1, n] số nhỏ phép nhân số để tính tích A 1…n Muốn cho m[1, n] nhỏ m[i, j] phải nhỏ Vì Ai…j tính Ai…k * A k+1…j, ta có cơng thức: m[i, j] = 0, i = j m[i, j] = {m[i, k] + m[k+1, j] + Pi-1*Pk*Pj}, với i s[1, 2] = tương tự cho m[2, 3], m[3, 4] m[4, 5] m[2, 4] = min{m[2, 2] + m[3, 4] + P1*P2*P4; m[2, 3] + m[4, 4] + P1*P3*P4} = min{0 + 54 + 4*3*3; 72 + + 4*6*3} = min{90; 144} = 90 k = => s[2, 4] = Nhân ma trận A1, A 2, A3, A 4, A5: A1…A5: s[1, 5] = => ((A1*A2*A3*A4)*A5) A1…A4: s[1, 4] = => (((A1*A2)*(A3*A4))*A5) A1…A2: s[1, 2] = => (A1*A2) A3…A4: s[3, 4] = => (A3*A4) Code: Tạo bảng: Tra bảng: Full code: Và kết quả: PHẦN II: TÌM XÂU CON CHUNG DÀI NHẤT Giới thiệu toán xâu chung dài (LCS – Longest common subsequence): Bài toán xâu chung dài (lớn nhất) toán kinh điển cho việc ứng dụng thuật toán quy hoạch động để giải Chương tìm hiểu Dynamic Programming Có thể nói, tốn hay giúp hiểu QHD, cấu trúc ma trận mảng hai chiều Bài toán phát biểu sau: Viết chương trình nhập vào hai xâu kí tự, in độ dài xâu chung lớn xâu chung hai xâu vừa nhập Ví dụ: hai xâu “BACDB” “BDCB”, xâu chung lớn có độ dài “BCB” Như có hai điểm cần ý tốn là: Tìm độ dài xâu chung dài In xâu tìm hình Ý tưởng giải tốn: 2.1 Tìm độ dài xâu lớn nhất: Bài toán nhỏ việc so sánh phần từ nằm xâu, chúng ta ghi nhận kết quả: Công thứu quy hoạch động toán xâu chung lớn nhất: Nếu A[i] == B[j] L[i][j] = L[i-1][j-1] + Ngược lại L[i][j] = max (L[i-1][j], L[i][j-1]) Trong đó: A, B hai xâu cần xét i, j tương ứng số hàng cột mảng kết L Hàm max hàm để tìm số lớn hai số, trường hợp hai số lấy số – L[i-1][j-1] Để dễ hiểu xem minh họa đây: Công thức: Nếu A [i] == B [j] : L [i] [j] == L [i-1] [j-1] + Ngược lại : L [i] == max (L [i-1] [j], L [i] [j-1]) Xét hai xâu: BACDB BDCB L[][] “” B A C D B “” 0 0 0 B 1 1 D 1 2 C 1 2 B 1 2 Kết quả: BCB Chú ý: độ dài hàng i trước, số cột j sau Mảng lưu kết mảng hai chiều có kích thước L[n+1][m+1] n, m độ dài hai xâu a b Sở dĩ phải tăng thêm đơn vị (n+1, m+1) để lưu thêm hàng, cột có giá trị = Tức chưa có phần tử số chung Giá trị L[n][m] độ dài xâu chung lớn ta cần tìm 2.2 Truy vết xâu chung: Truy vết để tìm in xâu hình dựa vào bảng kết mà ta tìm phần Bắt đầu từ vị trí L[n][m] dừng lại L[i][j] == Bắt đầu duyệt từ i = n, j = m Phần tử thứ i xâu a a[i-1], thứ j xâu b b[j-1] Nếu a[i-1] == b[j-1] ta lưu lại chung a[i-1] giảm i j đơn vị Nếu a[i-1] != b[j-1] có trường hợp: - Nếu L[i-1][j] >= L[i][j-1] giảm i đơn vị - Ngược lại giảm j đơn vị Nếu thấy khó hiểu, bạn xem hình phía Màu green trường hợp a[i-1] == b[j-1], màu blue trường hợp a[i-1] != b[j-1] 3 Phân tích độ phức tạp: Khảo sát độ phức tạp số phép gán: Gọi F(i,j) LCS hai tiền tố A1 i B1 j Khi ta maximize F(i,j) theo F(i−1,j) F(i,j−1) Nếu Ai=Bj ta cập nhật F(i,j) theo F(i−1,j−1)+1 Kết tốn F(m,n) Vậy ta có độ phức tạp tóan theo phương pháp quy hoạch động O(nm) 4 Code xâu chung dài C/C++: Và kết chương trình trên: PHẦN III: BÀI TOÁN XẾP BALO 1.Giới thiệu tốn xếp balo: Bài tốn xếp ba lơ (cịn biết đến với tên gọi toán túi ) tốn tối ưu hóa tổ hợp Bài toán đặt tên từ vấn đề chọn quan trọng nhét vừa vào túi (với giới hạn khối lượng) để mang theo chuyến Các toán tương tự thường xuất kinh doanh, toán tổ hợp, lý thuyết độ phức tạp tính tốn, mật mã học tốn ứng dụng 2.Cách giải toán phương pháp quy hoạch động: -Cho balo đựng trọng lượng W n loại đồ vật, đồ vật i có trọng lượng gi giá trị vi Tất loại đồ vật có số lượng khơng hạn chế Tìm cách lựa chọn đồ vật đựng vào balo, chọn loại đồ vật nào, loại lấy cho tổng trọng lượng không vượt W tổng giá trị lớn 3.Xây dựng công thức truy hội để giải tốn: • Giả sử X[k,V] số lượng đồ vật k chọn,F[k,V] tổng giá trị k đồ vật chọn V trọng lượng lại balo, k=1 n, V=0 W • F[n,W]=F(X)=x1*v1+x2*v2+….+xn*vn->Max • Trong trường hợp đơn giản nhất, có đồ vật, ta tính X[1,V] F[1,V] với V từ đến W sau: • X[1,V] = V/g1 F[1,V] = X[1,V] * v1 • Giả sử ta tính F[k-1,U], có thêm đồ vật thứ k, ta tính F[k,V], với V từ đến W Cách tính sau: Nếu ta chọn xk đồ vật loại k, trọng lượng cịn lại balo dành cho k-1 đồ vật từ đến k-1 U = V-xk*vk, với xk thay đổi từ đến yk = V/gk ta chọn xk cho F[k,V] lớn Ta có cơng thức truy hồi sau: • X[1,V] = V/g1 F[1,V] = X[1,V] * v1 • F[k,V] = Max(F[k-1,V-xk*gk]+xk*vk) với xk chạy từ đến V/gk • Sau xác định F[k,V] X[k,V] xk ứng với giá trị F[k,V] chọn công thức • Để lưu giá trị trung gian q trình tính F[k,V] X[k,V] theo cơng thức truy hồi trên, ta sử dụng bảng gồm n dòng từ đến n, dòng thứ k ứng với đồ vật loại k W+1 cột từ đến W, cột thứ V ứng với trọng lượng V • Mỗi cột V bao gồm hai cột nhỏ, cột bên trái lưu F[k,V], cột bên phải lưu X[k,V] Trong lập trình ta tổ chức hai bảng tách rời F X Ví dụ: Cho tốn balo với trọng lượng W=9, loại đồ vật cho bảng sau: Đồ vật Trọng lượng (gi) Giá trị (vi) 5 Tóm tắt bảng sau: ĐV gi vi X[1,V] = V DIV g1 F[1,V] = X[1,V] * v1 F[k,V] = Max(F[k-1, V-xk*gk] + xk*vk) với xk chạy từ đến V DIV gk V K 0 0 0 4 8 2 0 0 0 5 0 0 0 0 0 0 1 1 1 2 0 2 3 0 Chúng ta tra bảng tính để xác định phương án: Khởi đầu, trọng lượng lại balo V=W Xét đồ vật từ n đến 1, với đồ vật k, ứng với trọng lượng lại V balo, X[k,V]>0 chọn X[k,v] đồ vật loại k tính lại V= V – X[k,V]*gk Ví dụ, bảng trên, ta xét đồ vật từ đến Khởi đầu V =W = Với k = 5, X[5,9] = nên ta khơng chọn đồ vật loại Với k = 4, X[4,9] = nên ta chọn đồ vật loại Tính lại V= - 3*2=3 Với k = 3, X[3,3] = nên ta khơng chọn đồ vật loại Với k = 2, X[2,3] = nên ta khơng chọn đồ vật loại Với k = 1, X[1,3] = nên ta chọn đồ vật loại Tính lại V = – 1*3=0 Vậy tổng trọng lượng vật chọn * + 1*3 = Tổng giá trị vật chọn * + * = 13 Độ phức tạp toán balo: Gọi chi phí c1, , cn giá trị tương ứng v1, , Ta cần cực đại hóa tổng giá trị với điều kiện tổng chi phí khơng vượt q C Khi đó, với i ≤ C, đặt A(i) giá trị lớn đạt với tổng chi phí khơng vượt q i Rõ ràng, A(C) đáp số toán Định nghĩa A(i) cách đệ quy sau: A(0) = A(i) = max { vj + A(i − cj),A(i) | cj ≤ i } Ở đây, giá trị lớn tập rỗng lấy Tính dần kết từ A(0) tới A(C), ta lời giải Do việc tính A(i) đòi hỏi xem xét n đồ vật (tất giá trị tính từ trước), có C giá trị A(i) cần tính, nên thời gian chạy lời giải quy hoạch động O( nC) Điều không mâu thuẫn với thực tế tốn xếp ba lơ NP-đầy đủ, C, không n, không thuộc mức đa thức theo độ dài đầu vào cho toán Độ dài đầu vào toán tỉ lệ thuận với số bit C, khơng tỉ lệ với C Một giải pháp quy hoạch động tương tự cho toán xếp ba lô 0-1 chạy thời gian giả-đa thức Cũng trên, gọi chi phí c1, , cn giá trị tương ứng v1, , Ta cần cực đại hóa tổng giá trị với điều kiện tổng chi phí khơng vượt q C Định nghĩa hàm đệ quy A(i, j) giá trị lớn đạt với chi phí khơng vượt j sử dụng đồ vật khoảng từ x1 tới xi A(i,j) định nghĩa đệ quy sau: f[i][j]:= giá trị lớn lấy được; v[i]:= giá trị đồ vật thứ i; w[i]:=trọng lượng đồ vật thứ i NOTES: Đây tốn khơng giới hạn đồ vật f[i][j]=max(f[i-1][j],v[i]+f[i][j-w[i]]) // lấy vật thứ i lấy thêm nên ta có f[i][j-w[i]]:= trừ trọng lượng đồ vật thứ i lấy thêm // i đồ vật không giới hạn A(0, j) = A(i, 0) = A(i, j) = A(i - 1, j) if ci > j A(i, j) = max(A(i - 1, j), vi + A(i - 1, j - ci)) if ci ≤ j Để có lời giải, ta tính A( n, C) Để làm điều này, ta dùng bảng để lưu tính tốn trước Cách giải chạy thời gian O( nC) không gian O( nC), ta giảm độ phức tạp không gian xuống O(C) số sửa đổi nhỏ Code toán xếp balo: Kết chạy toán xếp balo cho ví dụ trên: PHẦN IV: Đánh giá tổng quan thuật toán quy hoạch động: Quy hoạch động (Dynamic programming) kỹ thuật nhằm đơn giản hóa việc tính tốn cơng thức truy hồi cách lưu trữ toàn hay phần kết tính tốn bước với mục đích sử dụng lại Đối với dạng toán, độ phức tạp thường O(n) Tuy nhiên, sử dụng số biện pháp để giảm độ phức tạp, giảm thời gian chạy Đầu tiên phải kể đến việc tối ưu hoá cấu trúc Biện pháp áp dụng rộng rãi nhiều lĩnh vực Đương nhiên, việc dễ dàng mà địi hỏi mức độ hiểu biết kinh nghiệm định Cách thứ hai lưu trữ lại đáp án tốn (memoization), nhằm hạn chế việc tính tốn Chúng ta có hai hướng tiếp cận chính, từ xuống từ lên Từ xuống (topdown) hướng tiếp cận mà toán phức tạp Từ lên (bottom-up) hướng tiếp cận mà giải toán cần thiết trước tiếp xúc với toán phức tạp ... green trường hợp a[i-1] == b[j-1], màu blue trường hợp a[i-1] != b[j-1] 3 Phân tích độ phức tạp: Khảo sát độ phức tạp số phép gán: Gọi F(i,j) LCS hai tiền tố A1 i B1 j Khi ta maximize F(i,j) theo... dụng lại Đối với dạng toán, độ phức tạp thường O(n) Tuy nhiên, sử dụng số biện pháp để giảm độ phức tạp, giảm thời gian chạy Đầu tiên phải kể đến việc tối ưu hố cấu trúc Biện pháp áp dụng rộng... hoạch động thường áp dụng cho tốn tối ưu hóa (optimization problem) 3.Quá trình xây dựng giải thuật quy hoạch động: (Gồm bước) Đặc trưng hóa cấu trúc lời giải tối ưu Định nghĩa giá trị lời giải