1. Trang chủ
  2. » Giáo án - Bài giảng

THUẬT TOÁN CHƯƠNG 3 QUY HOẠCH ĐỘNG SLIDE GIẢNG DẠY

67 936 3

Đ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 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ẬT TOÁN (Algorithms) Nguyễn Thanh Cẩm Nội Dung C1 THUẬT TOÁN VÀ ĐỘ PHỨC TẠP C2 CHIA ĐỂ TRỊ C3 QUY HOẠCH ĐỘNG C4 THUẬT TOÁN THAM LAM C5 THUẬT TOÁN QUAY LUI Nguyễn Thanh QUY HOẠCH ĐỘNG  Chia để trị thiết kế thuật toán theo kiểu từ xuống (top-down)  Quy hoạch động trình tiếp cận thuật toán theo trình ngược lại, thiết kế theo kiểu từ lên (bottom-up)  Điểm khác quy hoạ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 Quy hoạ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 QUY HOẠCH ĐỘNG  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 Nguyễn Thanh QUY HOẠCH ĐỘNG 2.1 Thuật toán quy hoạ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ật toán Floy 2.2.3 Bài toán dãy lớn 2.2.4 Bài toán dãy chung dài Nguyễn Thanh 3.1 Thuật toán quy hoạch động tổng quát  Để giải toán quy hoạ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ật toán quy hoạch động tổng quát  Việc phát triển giải thuật dựa quy hoạ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ật toán quy hoạ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 quy hoạ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ờ quy hoạ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 quy hoạ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 QUY HOẠCH ĐỘNG 2.1 Thuật toán quy hoạ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ật toán Floy 2.2.3 Bài toán dãy lớn 2.2.4 Bài toán dã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ật toán Floy 3.2.3 Bài toán dãy lớn 3.2.4 Bài toán dãy chung dài Nguyễn Thanh 3.2.3 Bài toán dã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ật toán sau để giải toán đặt ra: Nguyễn Thanh 3.2.3 Bài toán dã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ật toá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ật toán Floy 3.2.3 Bài toán dãy lớn 3.2.4 Bài toán dãy chung dài Nguyễn Thanh 3.2.4 Bài toán dã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án dãy chung dài  Thiết kế thuật toán: Thuật toán đơn giản:  Duyệt tất dãy dã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án dãy chung dài  Áp dụng quy hoạ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ãy dãy a có độ dài i với 0

Ngày đăng: 23/06/2017, 16:02

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w