Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 23 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
23
Dung lượng
58,56 KB
File đính kèm
quy hoach dong.rar
(56 KB)
Nội dung
Chương 1: TỔNG QUAN VỀ PHƯƠNG PHÁP QUY HOẠCH ĐỘNG 1.1 Giới thiệu chung Quy hoạch động (Dynamic Programming) phương pháp hiệu giải nhiều toán tin học, đặc biệt toán tối ưu Những toán thường có nhiều nghiệm chấp nhận nghiệm có giá trị đánh giá Mục tiêu đặt tìm nghiệm tối ưu, nghiệm có giá trị đánh giá lớn nhỏ (tối ưu) Ví dụ tìm đường ngắn hai đỉnh đồ thị, tìm chuỗi chung dài hai chuỗi, tìm chuỗi tăng dài nhất,… Số lượng toán giải lập trình động lớn Ví dụ riêng kì thi Olympic quốc tế Tin học 2004 có tới ba sáu giải quy hoạch động Quy hoạch động 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 toán có dùng chung toán “cháu” Quy hoạch động giải toán “cháu” dùng chung lần lưu lời giải chúng bảng sau khỏi phải tính lại gặp lại toán cháu Quy hoạch động áp dụng cho toán tối ưu hóa (optimization problem) Bốn bước qui hoạch động: đặ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 toán Các thành phần quy hoạch động : + Tiểu cấu trúc tối ưu - Một toán có tính chất tiểu cấu trúc tối ưu lời giải tối ưu chứa lời giải tối ưu toán + Những toán trùng lắp - Khi giải thuật đệ quy gặp lại toán nhiều lần, ta bảo toán tối ưu hóa có toán trùng lặp Chuỗi chung dài LCS : O(m+n) Bài toán túi (Knapsack): Bài toán túi dễ dàng giải M không lớn, M lớn thời gian chạy trở nên chấp nhận Phương pháp làm việc M trọng lượng/kích thước số thực thay số nguyên Giải thuật qui hoạch động để giải toán túi có thời gian chạy tỉ lệ với NM Giải thuật Warshall [O(V3 )- Giải thuật Floyd [O(V3 )] : thể áp dụng chiến lược quy hoạch động tính toán vào hệ thức truy hồi lại không xây dựng thành giải thuật đệ quy Thay vào giải thuật lặp với hỗ trợ ma trận để lưu trữ kết trung gian Giải thuật tham lam Các giải thuật tối ưu hóa thường qua số bước với tập khả lựa chọn bước Một giải thuật tham lam thường chọn khả mà xem tốt lúc Tức là, giải thuật chọn khả tối ưu cục với hy vọng dẫn đến lời giải tối ưu toàn cục VD : +Bài toán xếp lịch cho hoạt động + Bài toán túi dạng phân số + Bài toán mã Huffman+ Giải thuật Prim để tính bao trùm tối thiểu Hai thành phần giải thuật tham lam : + Tính chất lựa chọn tham lam : Lựa chọn thực giải thuật tham lam tùy thuộc vào lựa chọn làm bây giờ, không tùy thuộc vào lựa chọn tương lai hay lời giải toán Như vậy, giải thuật tham lam tiến hành theo kiểu từ xuống, thực lúc lựa chọn tham lam + Tiểu cấu trúc tối ưu: Một tóan có tính chất tiểu cấu trúc tối ưu lời giải tối ưu chứa lời giải tối ưu cho toán Dùng giải thuật tham lam cho toán túi dạng phân số qui hoạch động cho toán túi dạng 0-1 Giải thuật tham lam cho toán xếp lịch hoạt động: Hoạt động chọn thủ tục GREEDY-ACTIVITY-SELECTER thường hoạt động với thời điểm kết thúc sớm mà xếp lịch cách hợp lệ Hoạt động chọn theo cách “tham lam” theo nghĩa để lại hội để xếp lịch cho nhiều hoạt độngkhác Giải thuật tham lam không thiết đem lại lời giải tối ưu Tuy nhiên thủ tục GREEDY-ACTIVITY-SELECTOR thường tìm lời giải tối ưu cho thể toán xếp lịch hoạt động Bài toán túi dạng phân số (knapsack) : O(n) + Giải thuật HUFFMAN (dùng phổ biến hữu hiệu cho việc nén liệu) tập n ký tự : O(nlgn) + Bài toán tô màu đồ thị : Đầu tiên ta cố tô cho nhiều đỉnh với màu đầu tiên, dùng màu tô đỉnh chưa tô cho tô nhiều đỉnh tốt Và trình lặp lại với màu khác đỉnh tô màu Độ phức tạp thủ tục SAME_COLOR: O(n) Nếu m số màu dùng để tô đồ thị thủ tục SAME_COLOR gọi tất m lần Do đó, độ phức tạp toàn giải thuật: m* O(n) Vì m thường số nhỏ=>độ phức tạp tuyến tính Ứng dụng : xếp lịch thi học kỳ , gán tần số lĩnh vực vô tuyến ,điện thoại di động Giải thuật quay lui : “bước hướng lời giải đầy đủ ghi lại thông tin bước mà sau bị tháo gỡ xóa phát bước không dẫn đến lời giải đầy đủ, tức bước dẫn đến “tình bế tắc”(deadend) (Hành vi gọi quay lui - backtracking.) VD : toán tám hậu ,bài toán mã tuần Một phương pháp tổng quát để giải vấn đề: thiết kế giải thuật tìm lời giải cho tóan bám theo tập qui luật tính toán xác định mà cách thử sửa sai Khuôn mẫu thông thường phân rã trình thử sửa sai thành công tác phận Thường công tác phận diễn tả theo lối đệ quy cách thuận tiện bao gồm việc thăm dò số hữu hạn công tác con.Ta coi toàn trình trình tìm kiếm mà cấu tạo duyệt qua công tác Tìm tất lời giải : Một lời giải tìm thấy ghi lại, ta tục xét ứng viên kế trình chọn ứng viên cách có hệ thống Thời gian tính toán giải thuật quay lui thường hàm mũ (exponential) Nếu nút không gian trạng thái có trung bình α nút con, chiều dài lối lời giải N, số nút tỉ lệ với αN Giải thuật nhánh cận (branch-and-bound) Ý tưởng nhánh cận: Trong trình tìm kiếm lối tốt (tổng trọng số nhỏ nhất) cho toán TSP, có kỹ thuật tỉa nhánh quan trọng kết thúc tìm kiếm thấy thành công Giả sử lối đơn có chi phí x tìm thấy Thì thật vô ích để duyệt tiếp lối chưa đầy đủ mà chi phí lớn x Điều thực cách không gọi đệ quy thủ tục visit lối chưa-đầy-đủ hành lớn chi phí lối đầy đủ tốt Rõ ràng ta không bỏ sót lối chi phí nhỏ ta bám sát chiến lược Kỹ thuật tính cận (bound) lời giải chưa-đầy-đủ để hạn chế số lời giải phải dò tìm gọi giải thuật nhánh cận Giải thuật áp dụng có chi phí gắn vào lối Bài toán người thương gia du hành (TSP) + Bài toán Chu trình Hamilton(HCP) : Để giải toán (HCP), ta cải biên giải thuật tìm kiếm theo chiều sâu trước (DFS) để giải thuật sinh lối đơn mà qua đỉnh đồ thị NP-Complete P : Tập hợp tất toán giải giải thuật tất định thời gian đa thức NP: tập hợp tất toán mà giải giải thuật không tất định thời gian đa thức VD : Bài toán có tồn lối dài từ đỉnh x đến đỉnh y ; Bài toán thỏa mãn mạch logic CSP toán thuộc lớp NP Tất định : giải thuật làm gì, có việc thực VD : Xếp thứ tự phương pháp chèn thuộc lớp P có độ phức tạp đa thức O(N2 ) Không tất định: giải thuật gặp lựa chọn nhiều khả năng, có quyền “tiên đóan” để biết chọn khả thích đáng VD : Cho A mảng số nguyên Một giải thuật không tất định NSORT(A, n) thứ tự số theo thứ tự tăng xuất chúng theo thứ tự Sự phân giải giải thuật không tất định thực song song hóa không hạn chế Mỗi lần có bước lựa chọn phải thực hiện, giải thuật tạo nhiều Mỗi thực cho khả lựa chọn Như nhiều khả thực lúc : +Bản kết thúc thành công làm kết thúc tất trình tính tóan khác + Nếu kết thúc thất bại kết thúc mà NP-complete : Có danh sách toán mà biết thuộc lớp NP không rõ thuộc lớp P hay không Tức là, ta giải chúng dễ dàng máy không tất định chưa tìm thấy giải thuật hữu hiệu chạy máy tính thông thường để giải toán chúng.Những toán NP lại có thêm tính chất:“Nếu toán giải thời gian đa thức tất toán thuộc lớp NP giải thời gian đa thức máy tất định.” Đây toán NP-complete Để chứng minh toán thuộc loại NP NP-đầy đủ, ta cần chứng tỏ toán NP-đầy đủ biết khả thu giảm đa thức toán Một số toán NP-đầy đủ : - Bài toán thỏa mãn mạch logic CSP : Nếu tồn giải thuật thời gian đa thức để giải toán thỏa mãn mạch logic tất toán lớp NP giải thời gian đa thức Bài toán phân hoạch số: Cho tập số nguyên, phân hoạch chúng thành hai tập mà có tổng trị số ? - Bài toán qui hoạch nguyên: Cho toán qui hoạch tuyến tính, liệu có tồn lời giải toàn số nguyên - Xếp lịch công việc đa xử lý : Cho kỳ hạn tập công tác có chiều dài thời gian khác phải thực thi hai xử lý Vấn đề xếp để thực thi tất công tác cho thỏa mãn kỳ hạn không - Bài toán phủ đỉnh (VERTEX COVER): Cho đồ thị số nguyên N, kiếm tập nhỏ N đỉnh mà chạm hết cạnh đồ thị - Bài toán xếp thùng (BIN PACKING): cho n đồ mà phải đặt vào thùng có sức chứa L Món đồ i đòi hỏi li đơn vị sức chứa thùng Mục đích xác định số thùng cần để chứa tất n đồ đó.? Bài toán người thương gia du hành (TSP): cho tập thành phố khoảng cách cặp thành phố, tìm lộ trình qua tất thành phố cho tổng khoảng cách lộ trình nhỏ M+? Bài toán chu trình Hamilton (HCP): Cho đồ thị, tìm chu trình đơn mà qua tất đỉnh Bài toán NP-đầy đủ lãnh vực : giải tích số, thứ tự tìm kiếm, xử lý dòng ký tự, Mô hình hóa hình học, xử lý đồ thị Sự đóng góp quan trọng lý thuyết NP-đầy đủ là: cung cấp chế để xác định toán lãnh vực “dễ” hay “khó”.Một số kỹ thuật để đối phó với toán NP-đầy đủ : + Dùng “giải thuật xấp xỉ để tìm lời giải xấp xỉ tối ưu (near-optimal) + Dựa vào hiệu trường hợp trung bình để phát triển giải thuật mà tìm lời giải số trường hợp đó, không làm việc trường hợp+ Sử dụng giải thuật có độ phức tạp hàm mũ hữu hiệu, ví dụ giải thuật quay lui+ Đưa heuristic vào giải thuật để tăng thêm hiệu giải thuật+ Sử dụng metaheuristic Heuristic tri thức toán cụ thể sử dụng để dẫn dắt trình tìm lời giải giải thuật Nhờ thêm vào heuristic mà giải thuật trở nên hữu hiệu Meta heuristic loại heuristic tổng quát áp dụng cho nhiều lớp toán.Gần meta heuristic lãnh vực nghiên cứu phát triển mạnh mẽ, với đời nhiều meta heuristic như:- giải thuật di truyền - giải thuật mô luyện kim - tìm kiếm tabu (Tabu search) … Bốn lớp toán phân theo độ khó: Những toán bất khả : Đây toán chưa có giải thuật để giải VD: Bài toán định xem chương trình có dừng máy Turing + Những toán khó giải : toán mà không tồn giải thuật thời gian đa thức để giải chúng Chỉ tồn giải thuật thời gian hàm mũ để giải chúng +Những toán NP-đầy đủ : Những toán NP-đầy đủ lớp đặc biệt lớp toán NP+ Những toán P Cách đơn giản để tìm nghiệm tối ưu toán duyệt hết toàn tập nghiệm toán (vét cạn) Cách áp dụng tập nghiệm nhỏ, kích thước vài chục byte Khi gặp toán với tập nghiệm lớn phương pháp không đáp ứng yêu cầu mặt thời gian tính toán Nếu tìm hệ thức thể chất quy hoạch động toán khéo tổ chức liệu ta xử lí tập liệu lớn Quy hoạch động chia để trị phương pháp giải toán cách tổ hợp lời giải toán Phương pháp quy hoạch động nguyên lí tối ưu nhà toán học Mỹ Richard Bellman (1920 - 1984) đề xuất vào năm 50 kỷ 20 Phương pháp áp dụng để giải hàng loạt toán thực tế trình kỹ thuật công nghệ, tổ chức sản xuất, kế hoạch hóa kinh tế,… Tuy nhiên cần lưu ý có số toán mà cách giải quy hoạch động tỏ ta không thích hợp Ưu điểm Điểm khác quy hoạch động phương pháp phân rã : • Phương pháp phân rã giải toán theo hướng top-down, nghĩa để giải toán ban đầu, ta phải giải tất toán Đây phương pháp hay, nhiên phương pháp gặp hạn chế mặt thời gian, tốc độ phải tính tính lại nhiều lần số toán giống • Phương pháp quy hoạch động sử dụng nguyên lý bottom-up, nghĩa "đi từ lên" Đầu tiên, ta phải toán đơn giản nhất, tìm nghiệm Sau kết hợp toán lại để tìm lời giải cho toán lớn giải toán yêu cầu Với phương pháp này, toán sau giải xong lưu trữ lại đem sử dụng cần Do tiết kiệm nhớ cải thiện tốc độ Hạn chế Không phải lúc việc kết hợp toán cho ta kết toán lớn Hay nói cách khác việc tìm kiếm "công thức truy hồi" khó khăn Số lượng toán cần lưu trữ lớn, không 1.2 chấp nhận liệu nhớ máy tính không cho phép Thuật toán chia để trị Đối với nhiều thuật toán đệ quy, nguyên lý chia để trị (divide and conquer) thường đóng vai trò chủ đạo việc thiết kế thuật toán Để giải toán lớn, ta chia làm nhiều toán dạng với để giải độc lập Khi giải toán P với kích thước ban đầu gặp trở ngại kích thước lớn, người ta thường nghĩ đến việc giải toán tương tự với kích thước nhỏ (gọi toán P) Tư tưởng chia để trị thường nhắc tới hình ảnh “bẻ dần đũa để bẻ gãy bó đũa” Chia để trị thực “tách” toán ban đầu thành toán độc lập, toán sinh sau lần “tách” gọi mức Những toán sinh sau mức (thấp hơn) tiến hành gặp toán nhỏ đến mức dễ dàng giải Sau giải toán tổ hợp dần lời giải từ toán nhỏ đến toán ban đầu Thủ tục đệ quy cách thường dùng hiệu để thực thuật toán chia để trị Quá trình đệ quy xếp dần toán vào ngăn xếp nhớ thực giải toán theo thứ tự ngược lại từ toán đơn giản đỉnh ngăn xếp giải toán ban đầu đáy ngăn xếp Ví dụ: Tìm số hạng thứ N dãy Fibonacci Công thức đệ quy (truy hồi) dãy Fibonaci: F(1) = 1, F(2) = 1, F(N) = F(N-1) + F(N-2) với N > Lời giải Xây dựng hàm F() để tính số hạng thứ N dãy Fibonacci theo định nghĩa toán học dãy Function F(N:integer): longint; Begin If (N=1) or (N=2) then F:=1 Else F:=F(N-1)+F(N-2); End; Với cách gọi F(N), sinh lời gọi toán nhiều thời điểm khác Ngăn xếp chứa biến tương ứng với lời gọi hàm nhanh chóng tăng nhanh dễ dẫn tới tràn ngăn xếp Ví dụ gọi F(5), gọi F(5) F(4) + F(3) (F(3) + F(2)) + (F(2) + F(1)) ((F(2) + F(1)) + F(2)) + F(2) + F(1) Như ba lần gọi F(2) Khi N = 40, số lần gọi F(2) tăng tới 63245986 lần Thời gian thực chương trình lâu số lần gọi hàm 1.3 lớn, gần tăng theo hàm mũ Nguyên lý tối ưu Bellman Trong thực tế, ta thường gặp số toán tối ưu loại sau: Có đại lượng f hình thành trình gồm nhiều giai đoạn ta quan tâm đến kết cuối giá trị f phải lớn nhỏ nhất, ta gọi chung giá trị tối ưu f Giá trị f phụ thuộc vào đại lượng xuất toán mà giá trị chúng gọi trạng thái hệ thống phụ thuộc vào cách thức đạt giá trị f giai đoạn mà cách thức gọi điều khiển Đại lượng f thường gọi hàm mục tiêu trình đạt giá trị tối ưu f gọi trình điều khiển tối ưu Có thể tóm lược nguyên lí quy hoạch động Bellman phát biểu sau: Quy hoạch động lớp toán mà định bước thứ i phụ thuộc vào định bước xử lí trước sau Chú ý nguyên lý thừa nhận mà không chứng minh Phương pháp tìm điều khiển tối ưu theo nguyên lý Bellman thường 1.4 gọi quy hoạch động Đặc điểm chung phương pháp quy hoạch động Phương pháp quy hoạch động dùng để giải toán tối ưu có chất đệ quy, tức việc tìm phương án tối ưu cho toán đưa tìm phương án tối ưu số hữu hạn toán Phương pháp quy hoạch động giống phương pháp chia để trị chỗ: lời giải toán tổ hợp từ lời giải toán Trong phương pháp quy hoạch động, nguyên lý thể rõ Khi cần phải giải toán nào, ta giải toán lưu trữ lời giải hay đáp số chúng với mục đích sử dụng lại theo phối hợp để giải toán tổng quát “Chia để trị” phân chia toán ban đầu thành toán độc lập (hiểu theo nghĩa phân chia có cấu trúc dạng cây), giải toán thường đệ quy, sau tổ hợp lời giải chúng để lời giải toán ban đầu Quy hoạch động phân chia toán thành toán con, toán phụ thuộc nhau, toán tham chiếu tới số toán mức (gọi toán gối lên nhau, phân chia cấu trúc dạng F5 F3 F4 F1 F2 Hình 1.1 Đồ thị mô tả quan hệ toán toán tìm số hạng thứ năm dãy Fibonacci Đồ thị không đồ thị có hướng phi chu trình Mỗi toán có toán gối lên tượng có toán đồng thời sử dụng để giải toán khác với kích thước lớn Ví dụ F3 = F1 + F2 F4 = F2 + F3 nên việc tính số F3 F4 phải tính F2 Mặt khác F3 F4 cần cho tính F5 để tính F5 cần phải tính F2 hai lần Điều tính toán áp dụng chỗ có toán gối xuất tiêu phí thời gian để tìm lại kết tối ưu toán giải lúc trước Để tránh điều này, thay cho việc giải lại toán con, lưu kết toán giải Khi giải toán sau (mức cao hơn), khôi phục lại kết lưu sử dụng chúng Cách tiếp cận gọi cách ghi nhớ (lưu trữ vào nhớ máy tính kết tính để phục vụ cho việc tính kết tiếp theo) Ghi nhớ đặc trưng đẹp đẽ quy hoạch động Người ta gọi cách tiếp cận cách lập bảng phương án lưu trữ kết tính để cần sử dụng lại Nếu ta chắn lời giải không cần thiết nữa, ta xóa để tiết kiệm không gian nhớ Trong số trường hợp, ta tính lời giải cho toán mà ta biết trước cần đến Bài toán tối ưu P cần đến lập trình động có hai đặc điểm sau đây: • Bài toán P thỏa mãn nguyên lí tối ưu Bellman Khi người ta nói toán P có cấu trúc tối ưu, nghĩa sử dụng lời giải tối ưu toán từ mức thấp để tìm dần lời giải tối ưu cho toán • mức cao hơn, cuối lời giải tối ưu cho toán toàn thể \ Bài toán P có toán phủ chồng (gối) lên Nghĩa không gian toán “hẹp” không tạo thành dạng hình (tree) Nếu gọi hai toán sinh từ toán hai toán mức mô tả hình ảnh toán phủ chồng lên là: giải hai toán mức chúng đòi hỏi tham chiếu số toán thuộc mức chúng Quy hoạch động phương pháp phân tích thiết kế thuật toán cho phép giảm bớt thời gian thực khai thác tốt hai đặc điểm nêu Tuy nhiên thông thường quy hoạch động lại đòi hỏi nhiều không gian nhớ (để thực ghi nhớ) Ngày nay, với mở rộng nhớ máy tính nhiều phần mềm lập trình cho phép sử dụng nhớ rộng rãi phương pháp quy hoạch động có nhiều khả giải toán trước khó giải hạn chế nhớ máy tính 1.5 Ý tưởng nội dung thuật toán quy hoạch động 1.5.1 Các khái niệm • Bài toán giải theo phương pháp quy hoạch động gọi toán quy • hoạch động Công thức phối hợp nghiệm toán để có nghiệm • toán lớn gọi công thức truy hồi quy hoạch động Tập toán nhỏ có lời giải để từ giải • toán lớn gọi sở quy hoạch động Không gian lưu trữ lời giải toán để tìm cách phối hợp chúng gọi bảng phương án quy hoạch động 1.5.2 Ý tưởng Quy hoạch động việc giải toán nhỏ (bài toán sở) để từ bước giải toán lớn hơn, giải toán lớn (bài toán ban đầu) Vậy ý tưởng quy hoạch động : Tránh tính toán lại thứ hai lần, mà lưu giữ kết tìm kiếm vào bảng làm giả thiết cho việc tìm kiếm kết trường hợp sau Chúng ta làm đầy dần giá trị bảng kết trường hợp trước giải Kết cuối kết toán cần giải Nói cách khác phương pháp quy hoạch động thể sức mạnh nguyên lý chia để trị đến cao độ Tư tưởng thuật toán quy hoạch động đơn giản Tuy nhiên áp dụng thuật toán vào trường hợp cụ thể lại không dễ dàng (điều tương tự nguyên tắc Dirichlet toán học) 1.5.3 Nội dung Quy hoạch động kỹ thuật thiết kế bottom-up (từ lên) Nó bắt đầu với trường hợp nhỏ (thường đơn giản giải ngay) Bằng cách tổ hợp kết có (không phải tính lại) trường hợp con, đạt tới kết trường hợp có kích thước lớn dần lên tổng quát hơn, cuối đạt tới lời giải trường hợp tổng quát Trong số trường hợp, giải toán A, trước hết ta tìm họ toán A(p) phụ thuộc tham số p (có thể p véc tơ) mà A(p0)=A với p0 trạng thái ban đầu toán A Sau tìm cách giải họ toán A(p) với tham số p cách áp dụng nguyên lý tối ưu Bellman Cuối cho p = p0 nhận kết toán A ban đầu 1.6 Các bước thực Bước 1: Lập hệ thức Dựa vào nguyên lý tối ưu tìm cách chia trình giải toán thành giai đoạn, sau tìm hệ thức biểu diễn tương quan định bước xử lý với bước xử lý trước Hoặc tìm cách phân rã toán thành “bài toán con” tương tự có kích thước nhỏ hơn, tìm hệ thức nêu quan hệ kết toán kích thước cho với kết “bài toán con” kiểu có kích thước nhỏ dạng hàm thủ tục đệ quy Khi có hệ thức tương quan xây dựng thuật giải, nhiên hệ thức thường biểu thức đệ quy, dễ gây tượng tràn miền nhớ ta tổ chức chương trình trực tiếp đệ quy Bước 2: Tổ chức liệu chương trình Tổ chức liệu cho đạt yêu cầu sau: a) Dữ liệu tính toán dần theo bước b) Dữ liệu lưu trữ để giảm lượng tính toán lặp lại c) Kích thước miền nhớ dành cho lưu trữ liệu nhỏ tốt, kiểu liệu chọn phù hợp, nên chọn đơn giản dễ truy cập Bước 3: Làm tốt Làm tốt thuật toán cách thu gọn hệ thức giảm kích thước miền nhớ Thường tìm cách dùng mảng chiều thay cho mảng hai chiều giá trị dòng (hoặc cột) mảng hai chiều phụ thuộc dòng (hoặc cột) kề trước Trong số trường hợp thay mảng hai chiều với giá trị phần tử nhận giá trị 0, mảng hai chiều cách dùng kỹ thuật quản lý bit KẾT LUẬN CHƯƠNG Phương pháp quy hoạch động phương pháp hay dùng để giải tập tin học, đặc biệt tập kỳ thi học sinh giỏi số tập thực tế Khi giải toán phương pháp quy hoạch động, phải thực hai yêu cầu quan trọng sau: • Tìm công thức truy hồi xác định nghiệm toán qua nghiệm • toán nhỏ Với toán cụ thể, ta đề phương án lưu trữ nghiệm cách hợp lý để từ truy cập cách thuận tiện Cho đến nay, chưa có định lý cho biết cách xác toán giải hiệu quy hoạch động Tuy nhiên để biết toán giải quy hoạch động hay không, ta tự đặt câu hỏi: "Một nghiệm tối ưu toán lớn có phải phối hợp nghiệm tối ưu toán hay không?" “Liệu lưu trữ nghiệm toán hình thức để phối hợp tìm nghiệm toán lớn” Việc tìm công thức truy hồi tìm cách phân rã toán nhiều đòi hỏi phân tích tổng hợp công phu, dễ sai sót, khó nhận thích hợp, đòi hỏi nhiều thời gian suy nghĩ Đồng thời lúc kết hợp lời giải toán cho kết toán lớn Khi bảng lưu trữ đòi hỏi mảng hai, ba chiều… khó xử lý liệu với kích cỡ chiều lớn hàng trăm Trong ngành khoa học máy tính, quy hoạch động phương pháp giảm thời gian chạy thuật toán thể tính chất toán gối (overlapping subproblem) cấu trúc tối ưu (optimal substructure) Nhà toán học Richard Bellman phát minh phương pháp quy hoạch động vào năm 1953 Ngành thành lập chủ đề kỹ nghệ phân tích hệ thống tổ chức IEEE thừa nhận Tổng quan Hình Tìm đường ngắn sử dụng cấu trúc tối ưu; đường lượn sóng đại diện cho đường ngắn hai đỉnh mà nối Cấu trúc tối ưu có nghĩa lời giải tối ưu cho toán sử dụng để tìm lời giải tối ưu cho toán toà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 Nói chung, ta giải toán với cấu trúc tối ưu quy trình ba bước: Chia toá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 Hình Đồ thị toán cho dãy Fibonacci Đây cấu trúc câymà đồ thị có hướng phi chu trình mô tả quan hệ toán gối Nói toán có toán trùng có nghĩa toán sử dụng để giải nhiều toán lớn khác Ví dụ, dãy Fibonacci, F3 = F1 + F2 F4 = F2 + F3 — tính số phải tính F2 Vì tính F5 cần đến F3 F4, cách tính F5 cách ngây thơ phải tính F2 hai lần nhiều Điều áp dụng có mặt toán gối nhau: cách tiếp cận ngây thơ tốn thời gian tính toán lại lời giải tối ưu cho toán mà giải Để tránh việc đó, ta lưu trữ lời giải toán giải Do vậy, sau ta cần giải lại toán đó, ta lấy sử dụng kết tính toán Hướng tiếp cận gọi lưu trữ (trong tiếng Anh gọi memoization, memorization, dù từ hợp nghĩa) Nếu ta chắn lời giải không cần thiết nữa, ta xóa để tiết kiệm không gian nhớ Trong số trường hợp, ta tính lời giải cho toán mà ta biết trước cần đến Tóm lại, quy hoạch động sử dụng: • Các toán gối • Cấu trúc tối ưu • Memoization Quy hoạch động thường dùng hai cách tiếp cận: • top-down (Từ xuống): Bài toán chia thành toán con, toán giải lời giải ghi nhớ để phòng trường hợp cần dùng lại chúng Đây đệ quy lưu trữ kết hợp với • bottom-up (Từ lên): Tất toán cần đến giải trước, sau dùng để xây dựng lời giải cho toán lớn Cách tiếp cận tốt không gian nhớ dùng cho ngăn xếp số lời gọi hàm Tuy nhiên, việc xác định tất toán cần thiết cho việc giải toán cho trước không trực giác Một số ngôn ngữ lập trình hàm, tiếng Haskell, tự động lưu trữ kết lời gọi hàm với tập đối số (argument) cụ thể, để tăng tốc cách đánh giá call-by-name (cơ chế gọi call-by-need) Việc hàm hiệu ứng phụ, tính chất luôn ngôn ngữ Haskell ngôn ngữ lập trình mệnh lệnh, chẳng hạn Pascal, C, C++, Java Ví dụ[sửa | sửa mã nguồn] Dãy Fibonacci[sửa | sửa mã nguồn] Một cài đặt đơn giản hàm tính phần tử thứ n dãy Fibonacci, trực tiếp dựa theo định nghĩa toán học Cài đặt thực nhiều tính toán thừa.: function fib(n) if n = or n = return n else return fib(n − 1) + fib(n − 2) Lưu ý ta gọi, chẳng hạn, fib(5), ta tạo lời gọi hàm, hàm giá trị gọi nhiều lần: fib(5) fib(4) + fib(3) (fib(3) + fib(2)) + (fib(2) + fib(1)) ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) (((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) Cụ thể, fib(2) tính hai lần Trong ví dụ lớn hơn, có nhiều giá trị fib, hay toán tính lại, dẫn đến thuật toán có thời gian lũy thừa Bây giờ, giả sử ta có đối tượng ánh xạ đơn giản, ánh xạ giá trị fib tính tới kết giá trị Ta sửa đổi hàm sau để sử dụng cập nhật ánh xạ Hàm thu đòi hỏi thời gian chạy O(n) thay thời gian chạy lũy thừa: var m:= map(0 → 1, → 1) function fib(n) if n not in keys(m) m[n]:= fib(n − 1) + fib(n − 2) return m[n] Đây cách tiếp cận từ xuống, trước hết ta chia toán thành toán nhỏ hơn, giải chúng lưu trữ kết Trong trường hợp này, ta giảm từ chỗ hàm sử dụng không gian tuyến tính (O(n)) xuống sử dụng không gian cách sử dụng cách tiếp cận từ lên Cách tính giá trị nhỏ fibtrước, từ xây dựng giá trị lớn hơn: function fib(n) var previousFib:= 1, currentFib:= repeat n − times var newFib:= previousFib + currentFib previousFib:= currentFib currentFib:= newFib return currentFib Phiên bottom-up gần với vòng lặp mệnh lệnh đơn giản dùng cho việc tính hàm Fibonacci có môn học nhập môn khoa học máy tính Trong hai ví dụ trên, ta tính fib(2) lần, sử dụng để tính fib(4) fib(3), thay tính lần cần tính fib(4) hay fib(3) Bàn cờ[sửa | sửa mã nguồn] Xét bàn cờ hình vuông n × n hàm chi phí c(i, j) trả chi phí liên quan đến ô i,j (i số hàng, j số cột) Ví dụ: bàn cờ × 5: + -+ -+ -+ -+ -+ 5|6|7|4|7|8| + -| -| -| -| -+ 4|7|6|1|1|4| + -| -| -| -| -+ 3|3|5|7|8|2| + -| -| -| -| -+ 2|2|6|7|0|2| + -| -| -| -| -+ 1|7|3|5|6|1| + -+ -+ -+ -+ -+ Trong ví dụ, ta có chẳng hạn c(1, 3) = Giả sử ta có quân cờ xuất phát ô hàng (hàng 1), ta cần tìm đường ngắn (tổng chi phí ô qua nhỏ nhất) để tới hàng cuối (hàng n), với điều kiện quân cờ tiến thẳng tiến theo đường chéo sang trái sang phải Nghĩa là, quân cờ ô (1,3) nhảy sang ba ô (2,2), (2,3) (2,4) + -+ -+ -+ -+ -+ 5| | | | | | + -| -| -| -| -+ 4| | | | | | + -| -| -| -| -+ 3| | | | | | + -| -| -| -| -+ 2| |x|x|x| | + -| -| -| -| -+ 1| | |O| | | + -+ -+ -+ -+ -+ Bài toán thể tính chất cấu trúc tối ưu Nghĩa là, lời giải cho toán lớn phụ thuộc vào lời giải cho toán Ta định nghĩa hàm q(i, j) sau: q(i, j) = chi phí tối thiểu để đến ô (i, j) Nếu ta tìm giá trị hàm tất ô nằm hàng n, ta chọn lấy giá trị nhỏ lần ngược đường để có đường ngắn Dễ thấy q(i, j) chi phí tối thiểu để đến ô ba ô nằm (do đến (i,j) từ ô này) cộng thêm c(i, j) Ví dụ: + -+ -+ -+ -+ -+ 5| | | | | | + -| -| -| -| -+ 4| | |A| | | + -| -| -| -| -+ 3| |B|C|D| | + -| -| -| -| -+ 2| | | | | | + -| -| -| -| -+ 1| | | | | | + -+ -+ -+ -+ -+ Bây giờ, ta định nghĩa q(i, j) cách thức hơn: Phương trình dễ hiểu Dòng trường hợp đặc biệt, dòng có mục đích dọn dẹp cho tính chất đệ quy Dòng thứ hai mô tả xảy hàng đầu tiên, để ta có xuất phát điểm Dòng thứ ba, phần đệ quy, phần quan trọng Về bản, giống với ví dụ A,B,C,D Từ định nghĩa này, ta dễ dàng tạo đoạn mã đệ quy để tính q(i, j) Trong đoạn mã giả sau, n kích thước bàn cờ, c(i, j) hàm chi phí, min() trả giá trị nhỏ giá trị nằm ngoặc: function minCost(i, j) if j = or j = n + return infinity else if i = return c(i, j) else return min(minCost(i-1, j-1), minCost(i-1, j), minCost(i-1, j+1)) + c(i, j) Cần lưu ý hàm tính chi phí đường đường đích thực Ta nói đến phần sau Cũng ví dụ dãy Fibonacci, hàm chạy rất lâu phải tốn hàng núi thời gian để tính tính lại đường ngắn Tuy nhiên, ta tính nhanh nhiều hàm thực công việc lưu trữ giá trị tính (trong mảng) Hoặc, ta nhanh tính toán theo kiểu từ lên mảng hai chiều q[i, j] Tại sao? Đơn giản ta tính toán đường lần, ta chọn cần tính toán trước Ta cần biết đường thực Vấn đề giải cách sử dụng mảng nữa: "mảng nút đứng trước" p[i, j] Mảng lưu dấu vết chuyện đường từ hướng tới Xét đoạn mã sau: function computeShortestPathArrays() for x from to n q[1, x]:= c(1, x) for y from to n q[y, 0]:= infinity q[y, n + 1]:= infinity for y from to n for x from to n m:= min(q[y-1, x-1], q[y-1, x], q[y-1, x+1]) q[y, x]:= m + c(y, x) c[y, x]:= q[y, x] if m = q[y-1, x-1] p[y, x]:= -1 else if m = q[y-1, x] p[y, x]:= else p[y, x]:= Bây giờ, vấn đề đơn giản lại xác định cực tiểu in function computeShortestPath() computeShortestPathArrays() minIndex:= min:= q[n, 1] for i from to n if q[n, i] < minIndex:= i min:= q[n, i] printPath(n, minIndex) function printPath(y, x) print(x) print("[...]... trước đây khó giải quy t do hạn chế bộ nhớ máy tính 1.5 Ý tưởng và nội dung của thuật toán quy hoạch động 1.5.1 Các khái niệm • Bài toán giải theo phương pháp quy hoạch động gọi là bài toán quy • hoạch động Công thức phối hợp nghiệm của các bài toán con để có nghiệm của • bài toán lớn gọi là công thức truy hồi của quy hoạch động Tập các bài toán nhỏ nhất có ngay lời giải để từ đó giải quy t các bài •... lớn hơn gọi là cơ sở quy hoạch động Không gian lưu trữ lời giải các bài toán con để tìm cách phối hợp chúng gọi là bảng phương án của quy hoạch động 1.5.2 Ý tưởng Quy hoạch động bắt đầu từ việc giải các bài toán nhỏ nhất (bài toán cơ sở) để từ đó từng bước giải quy t những bài toán lớn hơn, cho tới khi giải được bài toán lớn nhất (bài toán ban đầu) Vậy ý tưởng cơ bản của quy hoạch động là : Tránh tính... dưới chúng Quy hoạch động là một phương pháp phân tích và thiết kế thuật toán cho phép giảm bớt thời gian thực hiện khi khai thác tốt hai đặc điểm nêu trên Tuy nhiên thông thường quy hoạch động lại đòi hỏi nhiều không gian bộ nhớ hơn (để thực hiện ghi nhớ) Ngày nay, với sự mở rộng bộ nhớ máy tính và nhiều phần mềm lập trình mới cho phép sử dụng bộ nhớ rộng rãi hơn thì phương pháp quy hoạch động càng... kết quả của bài toán cần giải Nói cách khác phương pháp quy hoạch động đã thể hiện sức mạnh của nguyên lý chia để trị đến cao độ Tư tưởng của thuật toán quy hoạch động khá đơn giản Tuy nhiên khi áp dụng thuật toán vào trường hợp cụ thể lại không dễ dàng (điều này cũng tương tự như nguyên tắc Dirichlet trong toán học) 1.5.3 Nội dung Quy hoạch động là kỹ thuật thiết kế bottom-up (từ dưới lên) Nó được... hai chiều mới bằng cách dùng kỹ thuật quản lý bit KẾT LUẬN CHƯƠNG 1 Phương pháp quy hoạch động là phương pháp hay được dùng để giải các bài tập tin học, đặc biệt các bài tập trong các kỳ thi học sinh giỏi và một số bài tập trong thực tế Khi giải bài toán bằng phương pháp quy hoạch động, chúng ta phải thực hiện hai yêu cầu quan trọng sau: • Tìm công thức truy hồi xác định nghiệm bài toán qua nghiệm các... lý để từ đó có thể truy cập một cách thuận tiện nhất Cho đến nay, vẫn chưa có một định lý nào cho biết một cách chính xác những bài toán nào có thể giải quy t hiệu quả bằng quy hoạch động Tuy nhiên để biết được bài toán có thể giải bằng quy hoạch động hay không, ta có thể tự đặt câu hỏi: "Một nghiệm tối ưu của bài toán lớn có phải là sự phối hợp các nghiệm tối ưu của các bài toán con hay không?" và... mà ta biết trước rằng sẽ cần đến Tóm lại, quy hoạch động sử dụng: • Các bài toán con gối nhau • Cấu trúc con tối ưu • Memoization Quy hoạch động thường dùng một trong hai cách tiếp cận: • top-down (Từ trên xuống): Bài toán được chia thành các bài toán con, các bài toán con này được giải và lời giải được ghi nhớ để phòng trường hợp cần dùng lại chúng Đây là đệ quy và lưu trữ được kết hợp với nhau • bottom-up... nhau (overlapping subproblem) và cấu trúc con tối ưu (optimal substructure) Nhà toán học Richard Bellman đã phát minh phương pháp quy hoạch động vào năm 1953 Ngành này đã được thành lập như là một chủ đề về kỹ nghệ và phân tích hệ thống đã được tổ chức IEEE thừa nhận Tổng quan Hình 1 Tìm đường đi ngắn nhất sử dụng cấu trúc con tối ưu; một đường lượn sóng đại diện cho một đường đi ngắn nhất giữa hai.. .hoạch động, nguyên lý này càng được thể hiện rõ Khi không biết cần phải giải quy t những bài toán con nào, ta sẽ đi giải quy t các bài toán con và lưu trữ những lời giải hay đáp số của chúng với mục đích sử dụng lại theo một sự phối hợp nào đó để giải quy t những bài toán tổng quát hơn “Chia để trị” sẽ phân chia bài toán ban đầu thành... mục đích dọn dẹp cho tính chất đệ quy Dòng thứ hai mô tả những gì xảy ra tại hàng đầu tiên, để ta có xuất phát điểm Dòng thứ ba, phần đệ quy, là phần quan trọng nhất Về cơ bản, nó giống với ví dụ A,B,C,D Từ định nghĩa này, ta có thể dễ dàng tạo một đoạn mã đệ quy để tính q(i, j) Trong đoạn mã giả sau, n là kích thước của bàn cờ, c(i, j) là hàm chi phí, và min() trả về giá trị nhỏ nhất của các giá trị