Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 67 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
67
Dung lượng
1,12 MB
Nội dung
TRƯỜNG CAO ĐẲNG CNTT HỮU NGHỊ ViỆT - HÀN KHOA KHOA HỌC MÁY TÍNH -*** - THUẬTTOÁN (Algorithms) Nguyễn Thanh Cẩm Nội Dung C1 THUẬTTOÁN VÀ ĐỘ PHỨC TẠP C2 CHIA ĐỂ TRỊ C3 QUYHOẠCHĐỘNG C4 THUẬTTOÁN THAM LAM C5 THUẬTTOÁN QUAY LUI Nguyễn Thanh QUYHOẠCHĐỘNG Chia để trị thiết kế thuậttoán theo kiểu từ xuống (top-down) Quyhoạchđộng trình tiếp cận thuậttoán theo trình ngược lại, thiết kế theo kiểu từ lên (bottom-up) Điểm khác quyhoạchđộng với phương pháp chia để trị là: toán không độc lập với nhau, nghĩa toán có chung toán nhỏ Trong tình đó, phương pháp chia để trị tỏ không hiệu quả, phải lặp lặp lại việc giải toán chung Quyhoạchđộng giải toán lần lời giải toán ghi nhận, nhằm thoát khỏi việc giải lại toán ta cần lời giải Nguyễn Thanh QUYHOẠCHĐỘNG Trong ngành khoa học máy tính, quyhoạchđộng phương pháp giảm thời gian chạy thuậttoá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 quyhoạchđộng vào năm 1953 Nguyễn Thanh QUYHOẠCHĐỘNG 2.1 Thuậttoánquyhoạchđộng tổng quát 2.2 Một số thí dụ minh họa 2.2.1 Bài toán thực dãy phép nhân ma trận 2.2.2 Bài toán tìm đường ngắn thuậttoán Floy 2.2.3 Bài toándãy lớn 2.2.4 Bài toándãy chung dài Nguyễn Thanh 3.1 Thuậttoánquyhoạchđộng tổng quát Để giải toánquyhoạch động, cần tiến hành công việc sau: Tìm nghiệm toán (các trường hợp riêng) đơn giản Tìm công thức (hoặc quy tắc) xây dựng nghiệm toán thông qua nghiệm toán cỡ nhỏ Tạo bảng để lưu giữ nghiệm toán Sau tính nghiệm toán theo công thức tìm lưu vào bảng Từ bảng làm đầy, tìm cách xây dựng nghiệm toán cho Nguyễn Thanh 3.1 Thuậttoánquyhoạchđộng tổng quát Việc phát triển giải thuật dựa quyhoạchđộng chia làm giai đoạn: Phân rã: Chia toán cần giải thành toán nhỏ có dạng với toán ban đầu cho toán kích thước nhỏ giải cách trực tiếp Bản thân toán xuất phát coi toán có kích thước lớn họ toán Ghi nhận lời giải: Lưu trữ lời giải toán vào bảng Việc làm cần thiết lời giải toán thường sử dụng lại nhiều lần, điều nâng cao hiệu giải thuật giải lặp lại toán nhiều lần Tổng hợp lời giải: Lần lượt từ lời giải toán kích thước nhỏ tìm cách xây dựng lời giải toán kích thước lớn hơn, thu lời giải toán xuất phát (là toán có kích thước lớn nhất) Nguyễn Thanh 3.1 Thuậttoánquyhoạchđộng tổng quát Có hai tính chất quan trọng mà toán tối ưu cần phải thoả mãn để áp dụng quyhoạchđộng để giải là: Cấu trúc tối ưu: Để giải toán đặt cách tối ưu, toán phải giải cách tối ưu Số lượng toán phải không lớn Rất nhiều toán NP (xem [1] trang 234) – khó giải nhờ quyhoạch động, việc làm không hiệu số lượng toán tăng theo hàm mũ Một đòi hỏi quan trọng quyhoạchđộng tổng số toán cần giải không lớn, phải bị chặn đa thức kích thước liệu vào Nguyễn Thanh QUYHOẠCHĐỘNG 2.1 Thuậttoánquyhoạchđộng tổng quát 2.2 Một số thí dụ minh họa 2.2.1 Bài toán thực dãy phép nhân ma trận 2.2.2 Bài toán tìm đường ngắn thuậttoán Floy 2.2.3 Bài toándãy lớn 2.2.4 Bài toándãy chung dài Nguyễn Thanh 3.2 Một số thí dụ minh họa 3.2.1 Bài toán thực dãy phép nhân ma trận 3.2.2 Bài toán tìm đường ngắn thuậttoán Floy 3.2.3 Bài toándãy lớn 3.2.4 Bài toándãy chung dài Nguyễn Thanh 3.2.3 Bài toándãy lớn Lưu ý để tính ei, i = 1, 2, …, n, ta sử dụng công thức đệ quy sau: e1 = a1; ei = max {ai, ei-1 + }, i > Ví dụ: cho dãy a = (3, 2, -7, 3, -5, 5, 3) dãy lớn dãy b = (3,-5,5,3) Từ đó, ta có thuậttoán sau để giải toán đặt ra: Nguyễn Thanh 3.2.3 Bài toándãy lớn void Maxsub(a); { smax = a[1]; // smax - tổng dãy lớn maxendhere = a[1]; s=1; //vị trí đầu dãy imax = 1; // imax - vị trí kết thúc dãy lớn for( i = 2;i v) maxendhere = u else {maxendhere = v;s=i}; if (maxendhere > smax) { smax = maxendhere; imax = i; } Else {smax=0;imax=i} } } Dễ thấy thuậttoán Maxsub có thời gian tính O(n) Nguyễn Thanh 3.2 Một số thí dụ minh họa 3.2.1 Bài toán thực dãy phép nhân ma trận 3.2.2 Bài toán tìm đường ngắn thuậttoán Floy 3.2.3 Bài toándãy lớn 3.2.4 Bài toándãy chung dài Nguyễn Thanh 3.2.4 Bài toándãy chung dài Bài toán: Cho hai dãy số nguyên a = (a1, a2, …, am) b = (b1, b2, …, bn) Cần tìm dãy số nguyên c = (c1, c2,…, ck) cho c ⊆ a, c ⊆ b c có độ dài lớn Ví dụ: a = (3, 5, 1, 3, 5, 5, 3) b = (1, 5, 3, 5, 3, 1) dãy chung dài c = (5, 3, 5, 3) c = (1, 3, 5, 3) c = (1, 5, 5, 3) Nguyễn Thanh 3.2.4 Bài toándãy chung dài Thiết kế thuật toán: Thuậttoán đơn giản: Duyệt tất dãydãy a kiểm tra dãy có phải dãy b, giữ lại dãy dài Mỗi dãy a tương ứng với dãy số tập k phần tử tập số {1, 2, …, m}, có tất 2m dãy a Nguyễn Thanh 3.2.4 Bài toándãy chung dài Áp dụng quyhoạch động: Nếu m = n = 0, ta thấy dãy dài dãy rổng Nếu m >0 n >0 ta gọi: (a1, a2,…, ai) dãydãy a có độ dài i với 0