Quy hoạch động là dùng kĩ thuật đi từ dưới lên. Xuất phát từ trường hợp đơn giản nhất, có thể tìm ngay ra nghiệm bằng cách kết hợp nghiệm của chúng, ta nhận được nghiệm của bài toán cỡ lớn hơn.
PHƯƠNG PHÁP QUY HOẠCH ĐỘNG TRONG VIỆC GIẢI MỘT LỚP “CÁC BÀI TOÁN TỐI ƯU ” L NG C HƯNG(*) TÓM TẮT Phương pháp quy hoạch động kĩ thuật áp dụng để giải tốn tìm phương án tối ưu Vậy ý tưởng phương pháp quy hoạch động thật đơn giản : Để tránh việc tính lại thứ hai lần , ta lưu giữ kết tìm vào mảng làm giả thiết cho việc tìm kiếm kết cho trường hợp sau Chúng ta làm đầy dần giá trị bảng Bởi kết trường hợp trước giải Kết cuối kết cần giải Quy hoạch động dùng kĩ thuật từ lên Xuất phát từ trường hợp đơn giản , tìm nghiệm cách kết hợp nghiệm chúng , ta nhận nghiệm toán cỡ lớn Cứ ta nhận đủ nghiệm toán cần tìm Trong trình “ Từ lên “ sử dụng bảng lưu giữ lời giải toán giải Khi giải toán cần đến nghiệm tốn nhỏ ta việc tìm kiếm bảng Chính mà thuật tốn “ Quy hoạch động “ có hiệu ABSTRACT Dynamic programming is the method of solving complex problems for optimal solutions The ideas behind Dynamic programming are very simple: In order to avoid recalculating everything, we store the solutions to the subproblems in a table which is used as a fundamental theory to solve new problems We will build up the values of the table by adding the solved results of the previous problems Therefore, the solution to a given optimal problem can be obtained by the combination of optimal solutions to its subproblems In another word, Dynamic programming holds the strengths of the “divide and rule” principle to high esteem Dynamic programming applies the Bottom-up approach On solving the simpler problems, we can use the solutions to build on and arrive at solutions to bigger problems Hence, we can formulate a complex calculation as a recursive series of simpler calculations In this approach, we can refer to a tabular form of the results of the solved subproblems When we have to find out the solutions to the simpler subproblems ,we just look them up in the table That is why Dynamic programming algorithm is very efficient ĐẶT VẤN ĐỀ Phương pháp quy hoạch động (dynamic programming) kĩ thuật áp dụng để giải lớp tốn , đặc biệt tốn tìm phương án tối ưu là: “các tốn tìm giá trị nhỏ giá trị lớn nhất” Ta giải thích ý qua tốn sau: (*) Th.S, Khoa Công nghệ thông tin, Trường Đại học Sài Gòn Cho dãy N số nguyên A1, A2,…,An Hãy tìm cách xóa số hạng để dãy cịn lại đơn điệu hay nói cách khác: Hãy chọn số nhiều số hạng cho dãy B gồm số hạng theo thứ tự xuất dãy A [1 n] đơn điệu Quá trình chọn dãy B điều khiển qua n giai đoạn để đạt mục tiêu số hạng số dãy B nhiều Điều khiển giai đoạn i thể việc chọn hay không chọn Ai vào dãy B Giả sử ta có dãy: 10 Nếu ta chọn 10 ta có chọn số hạng bỏ qua 10 ta chọn số hạng: Khi giải toán cách “Chia để trị”, chuyển việc giải tốn kích thước lớn việc giải nhiều tốn kiểu có kích thước nhỏ thuật tốn thường thể chương trình đệ quy, thực tế, nhiều kết trung gian phải tính lại nhiều lần Vậy ý tưởng phương pháp quy hoạch động thật đơn giản: để tránh việc tính lại thứ hai lần, ta lưu giữ kết tìm vào mảng làm giả thiết cho việc tìm kiếm kết cho trường hợp sau Chúng ta làm đầy dần giá trị bảng Bởi kết trường hợp trước giải Kết cuối kết 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 độ” PHƯƠNG PHÁP Phương pháp quy hoạch động dùng kĩ thuật từ lên (bottom up) Xuất phát từ trường hợp đơn giản nhất, tìm nghiệm cách kết hợp nghiệm chúng, ta nhận nghiệm toán c lớn Cứ ta nhận đủ nghiệm tốn cần tìm.Trong q trình “từ lên”, sử dụng bảng lưu giữ lời giải toán giải mà khơng cần quan tâm sử dụng đâu sau Khi giải toán ta cần đến nghiệm toán nhỏ ta việc tìm kiếm bảng khơng cần phải giải lại Chính mà thuật tốn “Quy hoạch động” có hiệu 2.1 Ưu điểm phương pháp quy hoạch động - Chương trình chạy nhanh 2.2 Phạm vi hoạt động phương pháp quy hoạch động - Tìm nghiệm tốn tối ưu - Các tốn có cơng thức truy hồi 2.3 Hạn chế phương pháp quy hoạch động Phương pháp quy hoạch động không đem lại hiệu trường hợp sau: - Khơng tìm cơng thức truy hồi - Việc tìm cơng thức, phương trình truy tốn tìm cách phân rã tố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 thời gian suy nghĩ Đồng thời khơng phải lúc kết hợp việc giải toán cho kết toán lớn - Khi bảng lưu trữ đòi hỏi mảng hai chiều , ba chiều …thì xử lí liệu với kích c chiều lớn đến hàng trăm - Có tốn khơng thể giải quy hoạch động Như vậy, ta 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 bước (i-1) trước đó” “Một cấu hình tối ưu cấu hình tối ưu” CẤU TRÚC CHUNG CỦA CHƯƠNG TRÌNH CHÍNH BEGIN {Chương trình chính} Chuẩn bị đọc liệu khởi gán số giá trị Tạo bảng Tra bảng ghi kết END SƠ ĐỒ THUẬT TOÁN CỦA QUY HOẠCH ĐỘNG 4.1.Tính nghiệm tối ưu tốn trường hợp đơn giản 4.2 Lập hệ thức Lập hệ thức biểu thị tương quan định bước xử lí với bước xử lí trước Hệ thức hàm đệ quy gây tràn miền nhớ tổ chức thực trực tiếp đệ quy Ta gọi hệ thức phương trình đệ quy (hay phương trình truy tốn) Một cách xây dựng phương trình truy toán: Ta chia việc giải toán thành n giai đoạn Mỗi giai đoạn i có trạng thái ban đầu t(i) chịu tác động điều khiển d(i) biến thành trạng thái t(i+1) giai đoạn thứ (i+1) ( i= 1,2,3,…,n) Theo nguyên lý Bellman việc tối ưu giai đoạn cuối không làm ảnh hưởng kết toán cách từ lên, với trạng thái ban đầu t(n) sau làm giai đoạn n tốt nhất, ta có trạng thái cho giai đoạn (n-1) t(n-1) tác động điều khiển giai đoạn (n-1) d(n-1), tiếp tục xét đến giai đoạn (n-1) Sau tối ưu giai đoạn (n-1) ta lại có t(n-2) d(n-2) lại tối ưu giai đoạn (n-2) ,… Cho đến giai đoạn từ n đến tối ưu coi hồn thành toán Gọi giá trị tối ưu toán tính đến giai đoạn thứ k Fk, giá trị tối ưu tốn tính riêng giai đoạn k Gk Thì: Fk=Fk-1 + Gk Hay : Fk(t(k))=Max{ Gk(t(k),d(k))+Fk-1(t(k-1))} (*) d(k) 4.3 Tổ chức liệu chương trình - Tổ chức liệu tính tốn dần theo bước Nên tìm cách khử đệ quy Thơng thường tốn hay gặp đòi hỏi mảng chiều, hai chiều, ba chiều - Tạo bảng để lưu giữ nghiệm tốn Sau tính nghiệm tốn lớn theo cơng thức (Hàm đệ quy) lưu trữ vào bảng tìm nghiệm toán - Các giá trị Fk thường lưu trữ bảng chiều, hai chiều, ba chiều - Cần lưu ý giá trị khởi tạo ban đầu bảng cho thích hợp, kết toán nhỏ giải (trường hợp đơn giản nhất) F1(t(1)) = Max{ G1(t(1),d(1))+F0(t(0))} d(1) - Dựa vào phương trình truy tốn (*) giá trị bảng để tìm dần giá trị cịn lại bảng - Ngồi cịn cần mảng lưu trữ nghiệm tương ứng với giá trị tối ưu giai đoạn - Dựa vào bảng lưu trữ nghiệm bảng giá trị tối ưu giai xây dựng, tìm kết tốn theo u cầu 4.4 Làm tốt Làm tốt thuật toán cách thu gọn hệ thức quy hoạch động giảm thiểu kích thước nhớ Thường tìm cách dùng mảng chiều thay cho mảng hai chiều giá trị dòng ( cột) mảng hai chiều phụ thuộc dịng (hoặc cột) kề trước MỘT VÀI BÀI TỐN ÁP DỤNG B C M HO Cần cắm K bó hoa khác vào N lọ xếp thẳng hàng cho hoa có số hiệu nhỏ đặt trước hoa có số hiệu lớn Với loại hoa i biết giá trị thẩm mĩ cắm hoa vào lọ j V[i][j] Các số liệu số tự nhiên ghi cách dấu cách dịng Tìm phương án cắm hoa cho giá trị thẩm mĩ cao Dữ l ệu v : Cho tập tin văn có tên HOA.INP có cấu trúc : - Dịng hai giá trị K N - Từ dòng thứ hai trở giá trị V[i][j] vớii :1 K,j :1 N ; 1KN100 Dữ l ệu : Ghi vào File văn có tên HOA.OUT gồm hai dịng: - Dòng tổng giá trị thẩm mĩ phương án cắm hoa tối ưu - Từ dòng thứ hai hai dãy K số hiệu lọ chọn cho bó hoa Thí dụ: Hướng giải: HOA.INP 6 4 2 10 10 10 HOA.OUT 24 Ta dùng phương pháp quy hoạch động để giải toán này: Ta tiến hành sau: 5.1 Lập hệ thức: Gọi b[i][j] giá trị thẫm mĩ cắm i bó hoa vào j lọ, ta thấy: 5.1.1 Nếu số bó hoa nhiểu số lọ (i>j) khơng có cách cắm 5.1.2 Nếu số bó hoa số lọ có cách bó vào lọ 5.1.3 Ta xét trường hợp số bó hoa số lọ (ib[i][j-1] ta phải thực hai thao tác sau : + Đặt trị : b[i][j]=b[i-1][j-1]+V[i][j] ghi nhận việc chọn lọ hoa j phương án , cụ thể lấy phương án cắm hoa [i-1][j-1] bổ sung thêm việc chọn lọ hoa j sau : - Đặt L[i][j]=L[i-1][j-1] đánh dấu phần tử thứ j mảng L[i][j] + Nếu b[i-1][j-1]+V[i][j]b[i] cũ phải thực hai thao tác : - Đặt L[i]=L[i-1] cũ đánh dấu phần tử thứ j mảng L[i] + Nếu b[ -1] cũ +V[i][j] b[i] cũ ta khơng phải làm bảo lưu phương án cũ Biểu thức so sánh cho biết cập nhật mảng T từ bước thứ j-1 qua bước thứ j ta phải tính từ lên ,nghĩa tính dần theo chiều giảm i=j Để đánh dấu lọ hoa ta dùng mảng L[MN] phần tử dãy 15 bit ta đánh dấu cho 15*8=120 lọ hoa Khi cần đánh dấu lọ hoa thư j dãy L[i] ta bật bit thư j Khi cần xem lọ thư j có chọn hay khơng ta gọi hàm Getbit Mô ả bằ g gô gữ C hư sau #include #include #define max 100 #define fi "CAMHOA.INP" #define fo "CAMHOA.OUT" int k,n,v[max][max],b[max][max],kq,vt[max]; // -// b[i][j] giá trị thẩm mỹ cắm i bó hoa vào j lọ // -void doc(){ FILE *f =fopen(fi,"rt"); fscanf(f,"%d%d",&k,&n); inti=0,j=0; for(i=1;i