Nếu có thể chứng minh rằng một thuật toán dựa trên phương pháp tham lam cho ra kết quả tối ưu toàn cục của một lớp bài toán nào đó, thì khi ấy thuật toán ấy thường sẽ được lựa chọn, vì n
Trang 1LỜI CẢM ƠN
Để hoàn thành tốt đồ án này, lời đầu tiên em xin cám ơn Ban Giám Hiệu trường Đại Học Công Nghệ Thông Tin & Truyền Thông đã tạo điều kiện cho em được học tập tại trường, và đặc biệt em xin gửi lời cám ơn chân thành nhất đến thầy Ts.Nguyễn Hải Minh giảng viên Trường Công Nghệ Thông Tin & truyền thông đã trang bị cho em những kiến thức chuyên môn, quan tâm và tận tình hướng dẫn, giúp
đỡ em hoàn thành một cách tốt nhất trong đợt làm đồ án này
Bên cạnh đó để hoàn thành tốt đồ án này em cũng đã nhận được nhiều sự giúp đỡ những lời động viiên quý báu của bạn bè, các anh chị em xin chân thành cảm ơn
Tuy nhiên do thời gian hạn hẹp, cũng như lượng kiến thức còn hạn chế nên bài báo cáo của em sẽ khó tránh khỏi những thiếu sót Em rất mong nhận được sự thông cảm và sự chỉ bảo tận tình của quý Thầy Cô và các bạn để thực hiện tốt đồ án này Một lần nữa em xin chân thành cảm ơn
Thái Nguyên, ngày….tháng… năm 2017
Sinh viên thực hiện
Triệu Bùi Nam
Trang 2LỜI CAM ĐOAN
Tôi xin cam đoan bài đồ án tốt nghiệp là do chính tôi thực iện, số liệu và kết quả nghiên cứu trong luận văn này là trung thực và chưa hề được sử dụng
để bảo vệ một học vị nào Các thông tin trích dẫn trong đồ án đã được chỉ rõ nguồn gốc rõ ràng và được phép công bố
Xin chân thành cảm ơn !
Thái Nguyên, ngày….tháng… năm 2017
Sinh viên thực hiện
Triệu Bùi Nam
Trang 3MỤC LỤC
LỜI CẢM ƠN 1
LỜI CAM ĐOAN 2
MỤC LỤC 3
DANH MỤC HÌNH ẢNH 5
LỜI NÓI ĐẦU 6
CHƯƠNG 1 TÌM HIỂU PHƯƠNG PHÁP THAM LAM 8
1.1 Khái niệm 8
1.2 Ý tưởng 8
1.3 Đặc trưng của phương pháp tham lam 9
1.4 Thiết kế thuật toán dựa trên ý tưởng phương pháp tham lam 9
1.4.1 Các thành phần quyết định tham lam 10
1.4.2 Sơ đồ chung để giải các bài toán bằng giải thuật tham lam 11
1.4.3 Lược đồ giải thuật tham lam 12
1.4.4 Thiết kế một thuật toán dựa trên ý tưởng tham lam 13
1.4.5 Tiến trình thực hiện phương pháp tham lam 13
1.5 Một số bài toán đặc trưng 15
1.5.1 Bài toán lựa chọn công việc 15
1.5.2 Bài toán người du lịch 18
1.5.3 Bài toán cái ba lô 21
1.5.4 Bài toán băng nhạc 22
1.6 Phương pháp tham lam trong tương quan với phương pháp khác - Phương pháp quy hoạch động 25
1.6.1 Phương pháp quy hoạch động 25
1.6.2 Phương pháp tham lam trong tương quan với phương pháp quy hoạch động 25
CHƯƠNG 2 BÀI TOÁN TRẢ TIỀN CỦA MÁY ATM 28
2.1 Bài toán ban đầu 28
2.1.1 Phát biểu bài toán 28
2.1.2 Phân tích thiết kế thuật toán 28
Trang 42.2 Áp dụng trong thực tế 30
2.2.1 Mô tả bài toán thực tế 30
2.2.2 Xây dựng thuật toán 31
CHƯƠNG 3 CÀI ĐẶT CHƯƠNG TRÌNH DEMO 48
3.1 Mô tả chương trình 48
3.2 Giao diện chương trình 48
KẾT LUẬN 51
TÀI LIỆU THAM KHẢO 52
Trang 5DANH MỤC HÌNH ẢNH
Hình 3.1: Giao diện chương trình 48 Hình 3.2: Kết quả rút tiền 1 49 Hình 3.3: Kết quả rút tiền 2 50
Trang 6LỜI NÓI ĐẦU
Có nhiều phương pháp được dùng để thiết kế thuật toán như: chia để trị, vét cạn, quy hoạch động trong đó, mỗi phương pháp chỉ áp dụng cho những lớp bài toán phù hợp Phương pháp tham lam cũng là một trong số các phương pháp phổ biến thường được vận dụng trong thiết kế thuật toán
Phương pháp tham lam gợi ý chúng ta tìm một trật tự hợp lí để duyệt dữ liệu nhằm đạt được mục tiêu một cách chắc chắn và nhanh chóng Thông thường dữ liệu được duyệt theo một trong hai trật tự tăng hay giảm theo một tiêu chí nào đấy
Phương pháp tham lam xây dựng các thuật toán để giải các bài toán tối ưu dựa trên tư tưởng tối ưu cục bộ theo một chiến lược tư duy kiểu con người, nhằm nhanh chóng đạt đến một lời giải "tốt" Nếu có thể chứng minh rằng một thuật toán dựa trên phương pháp tham lam cho ra kết quả tối ưu toàn cục của một lớp bài toán nào đó, thì khi ấy thuật toán ấy thường sẽ được lựa chọn, vì nó chạy nhanh hơn các phương pháp tối ưu hóa khác như quy hoạch động
Một số thuật toán dựa trên tư tưởng phương pháp tham lam đã thực sự tìm ra được phương án tối ưu như: thuật toán Kruscal tìm cây khung cực tiểu, thuật toán Prim dành cho bài toán cây bao trùm nhỏ nhất, thuật toán Dijkstra dành cho bài toán đường đi ngắn nhất và thuật toán tìm cây Huffman tối ưu
Là một sinh viên trường Đại học CNTT và TT, em thấy việc ứng dụng phương pháp tham lam trong thiết kế thuật toán là một mảng kiến thức rất hay và hữu ích đối với những ai đam mê thiết kế thuật toán Vì vậy, em mong muốn tìm hiểu về phương pháp tham lam và ứng dụng phương pháp tham lam vào một bài toán cụ thể để có thể hiểu rõ phương pháp này và nhằm tạo ra một nguồn tư liệu quan trọng cho những người quan tâm đến phương pháp này
Từ những lí do trên, em quyết định lựa chọn đề tài cho đồ án tốt nghiệp là
“Nghiên cứu thuật toán tham lam (Greedy) và ứng dụng để giải bài toán trả tiền của ATM” với chương trình demo xây dựng trên ngôn ngữ C#
Em xin chân thành cảm ơn thầy Ts.Nguyễn Hải Minh, người đã hướng dẫn
và giúp đỡ em trong quá trình thực hiện đề tài
Mặc dù đã rất cố gắng để hoàn thành công việc, xong do thời gian có hạn và bản thân chưa thực sự hoàn thiện trong việc thu thập thông tin thực tế, phân tích hệ
Trang 7thống thông tin, tập hợp tài liệu in ấn và lập trình do đó bài báo cáo của em còn nhiều thiếu sót cần được bổ sung
Em rất mong được sự góp ý và chỉ bảo chân thành của thầy hướng dẫn cùng toàn thể các thầy cô trong khoa để đề tài của em được hoàn thiện tốt hơn
Em xin chân thành cảm ơn!
Thái nguyên, tháng 5 năm 2017
Sinh viên thực hiện
Triệu Bùi Nam
Trang 8CHƯƠNG 1 TÌM HIỂU PHƯƠNG PHÁP THAM LAM
1.1 Khái niệm
Các bài toán trên thực thế có muôn hình muôn vẻ, không thể đưa ra một cách thức chung để tìm giải thuật cho mọi bài toán Các phương pháp vét cạn (exhaustivesearch), chia để trị (divide and conquer), quy hoạch động (dynamic programming) và tham lam (greedy) là những “chiến lược” kinh điển để tìm giải thuật cho các bài toán
Tham lam (greedy) là một phương pháp giải các bài toán tối ưu Các thuật toán tham lam dựa vào sự đánh giá tối ưu cục bộ để đưa ra quyết định tức thì tại mỗi bước lựa chọn, với hy vọng cuối cùng sẽ tìm ra được phương án tối ưu tổng thể Chẳng hạn áp dụng giải thuật tham lam với bài toán hành trình của người bán hàng ta có giải thuật sau: "Ở mỗi bước hãy đi đến thành phố gần thành phố hiện tại nhất"
ở mỗi bước là quyết định tối ưu cục bộ Tùy theo từng bài toán mà ta đưa ra tiêu chuẩn lựa chọn quyết định cho thích hợp
Các thuật toán tham lam nói chung là đơn giản và hiệu quả (vì các tính toán
để tìm ra quyết định tối ưu cục bộ thường là đơn giản) Tuy nhiên, các thuật toán tham lam có thể không tìm được nghiệm tối ưu, nói chung nó chỉ cho ra nghiệm gần tối ưu, nghiệm tương đối tốt Nhưng cũng có nhiều thuật toán được thiết kế theo kỹ thuật tham lam cho ta nghiệm tối ưu, chẳng hạn thuật toán Dijkstra tìm đường đi ngắn nhất từ một đỉnh tới các đỉnh còn lại trong đồ thị định hướng, các thuật toán Prim và Kruskal tìm cây bao chùm ngắn nhất trong đồ thị vô hướng
Trang 91.3 Đặc trưng của phương pháp tham lam
Phương pháp tham lam gợi ý chúng ta tìm một trật tự hợp lí để duyệt dữ liệu nhằm đạt được mục tiêu một cách chắc chắn và nhanh chóng Thông thường, dữ liệu được duyệt theo một trong hai trật tự là tăng hoặc giảm dần theo một chỉ tiêu nào đó Một số bài toán đòi hỏi những dạng thức cải biên của hai dạng nói trên
Thuật toán tham lam có trường hợp luôn tìm ra đúng phương án tối ưu, có trường hợp không Nhưng trong trường hợp thuật toán tham lam không tìm ra đúng phương án tối ưu, chúng ta thường thu được một phương án khả dĩ chấp nhận được
Với một bài toán có nhiều thuật toán để giải quyết, thông thường thuật toán tham lam có tốc độ tốt hơn hẳn so với các thuật toán tối ưu tổng thể
Đặc trưng của thuật toán tham lam thường thể hiện bởi: trong mỗi bước, việc
xử lí sẽ tuân theo một sự lựa chọn trước, không kể đến tình trạng không tốt có thể xảy ra khi thực hiện lựa chọn lúc đầu
1.4 Thiết kế thuật toán dựa trên ý tưởng phương pháp tham lam
Khác với các kỹ thuật thiết kế thuật toán như chia để trị, liệt kê, quy hoạch động mà chúng ta đã biết, rất khó để đưa ra một quy trình chung để tiếp cận bài toán, tìm thuật toán cũng như cài đặt thuật toán tham lam
Giải thuật tham lam (Greedy algorithm) là một thuật toán giải quyết một bài toán theo kiểu metaheuristic để tìm kiếm lựa chọn tối ưu cục bộ ở mỗi bước đi với
hi vọng tìm được tối ưu toàn cục Chẳng hạn áp dụng giải thuật tham lam với bài toán hành trình của người bán hàng ta có giải thuật sau: “Ở mỗi bước hãy tìm đến thành phố gần thành phố hiện tại nhất”
Nói chung, giải thuật tham lam thường có 5 thành phần:
1 Một tập các ứng viên để từ đó tạo ra lời giải
2 Một hàm lựa chọn để theo đó chọn ứng viên tốt nhất để bổ sung vào lời giải
3 Một hàm khả thi dùng để quyết định nếu một ứng viên có thể được dùng
để xây dựng lời giải
4 Một hàm mục tiêu ấn định giá trị của lời giải hoặc một lời giải chưa hoàn chỉnh
5 Một hàm đánh giá chỉ ra khi nào ta tìm ra một lời giải hoàn chỉnh
Trang 101.4.1 Các thành phần quyết định tham lam
Tính chất lựa chọn tham lam
Thành phần then chốt trước tiên là tính lựa chọn tham lam: một giải pháp tối
ưu toàn cục có thể đạt được bằng cách lựa chọn tối ưu cục bộ (tham lam) Nói một cách khác, khi có nhiều sự lựa chọn thì ta lựa chọn phương án nào tốt nhất ở hiện tại trong bài toán hiện tại, mà không cần quan tâm đến kết quả các bài toán con của nó
Thuộc tính lựa chọn tham lam thường đạt được hiệu lực trong việc thực hiện lựa chọn của ta trong bài toán con Ví dụ, trong bài toán chọn hoạt động, giả sử rằng
ta có các hoạt động được sắp xếp sẵn theo thứ tự tăng dần của thời điểm kết thúc, ta cần kiểm tra mỗi một hoạt động Nó thường là trường hợp mà được xử lý trước khi đưa vào hay sử dụng một cấu trúc dữ liệu thích hợp (thường một hàng đợi ưu thế),
ta có thể thực hiện các lựa chọn tham lam nhanh chóng, vì vậy đưa ra một thuật toán hiệu quả
Chúng ta có thể lựa chọn giải pháp nào được cho là tốt nhất ở thời điểm hiện tại và sau đó giải bài toán con nảy sinh từ việc lựa chọn vừa rồi Lựa chọn của thuật toán tham lam có thể phụ thuộc vào các lựa chọn trước đó Nhưng nó không thể phụ thuộc vào một lựa chọn nào trong tương lai hay phụ thuộc vào lời giải của các bài toán con Thuật toán tiến triển theo kiểu thực hiện các lựa chọn theo một vòng lặp, cùng lúc đó thu nhỏ bài toán đã cho về một bài toán con nhỏ hơn Giải thuật tham lam quyết định sớm và thay đổi đường đi của thuật toán theo quyết định đó, và không bao giờ xét lại các quyết định cũ Đối với một số bài toán, đây có thể là một thuật toán không chính xác
Cấu trúc con tối ưu
Một bài toán có cấu trúc con tối ưu nếu giải pháp tối ưu cho bài toán này chứa trong nó các giải pháp tối ưu cho các bài toán con Thuộc tính này là điểm để quyết định ta có thể giải quyết bài toán bằng phương pháp quy hoạch động cũng như tham lam được hay không Như một ví dụ của cấu trúc con tối ưu, quay về cách
ta chứng minh rằng nếu một giải pháp tối ưu đối với bài toán con Sij có chứa một hoạt động ak,sau đó nó cũng phải chứa các giải pháp tối ưu đối với các bài toán Sik
và Skj Cấu trúc con tối ưu này được đưa ra, ta nói rằng nếu biết hoạt động nào sử dụng như ak, ta có thể xây dựng một giải pháp tối ưu đối với Sij bằng việc lựa chọn
Trang 11cùng với tất cả hoạt động của các giải pháp tối ưu đối với các bài toán con Sik và
Skj Dựa trên sự quan sát này của cấu trúc con tối ưu, ta có thể đưa ra công thức đệ quy mà nó định rõ giá trị của một giải pháp tối ưu
Ta thường sử dụng thêm cấu trúc con tối ưu gần như trực tiếp, khi áp dụng
nó đối với các giải thuật tham lam Ta không cần thiết cho rằng đi đến một bài toán con bằng cách thực hiện lựa chọn tham lam trong bài toán tối ưu Ta cần làm là cho rằng một giải pháp tối ưu đối với bài toán con, kết hợp với lựa chọn tham lam vừa được thực hiện, mang lại một giải pháp tối ưu đối với bài toán ban đầu Sự phối hợp hoàn toàn sử dụng phương pháp quy nạp đối với các bài toán con để chứng minh rằng việc sử dụng lựa chọn tham lam tại mỗi bước tạo ra một giải pháp tối ưu
Một bài toán được gọi là có cấu trúc tối ưu nếu một lời giải tối ưu của bài toán con chứa lời giải tối ưu của bài toán lớn hơn
1.4.2 Sơ đồ chung để giải các bài toán bằng giải thuật tham lam
Dạng các bài toán giải bằng phương pháp tham lam
Giả sử phải chọn một tập con R của các phần tử của một tập S
=(s1+,s2,…,sn) sao cho tập R thỏa mãn một điều kiện ràng buộc W(R) nào đó, và một hàm mục tiêu
Z(R) đạt giá trị tối ưu
Ví dụ bài toán tối ưu tổ hợp:
Cho hàm f(X) xác định trên một tập hữu hạn các phần tử D Hàm f(X) được gọi là hàm mục tiêu
Mỗi phần tử X D có dạng X = (x1, x2, ,xn) được gọi là một phương án Cần tìm một phương án X* D sao cho f(X*) đạt min(max) Phương án X* như thế được gọi là phương án tối ưu
Sơ đồ chung để giải các bài toán bằng giải thuật tham lam
Bước 1: Chọn một phần tử s có lợi nhất cho lời giải trong bước đó sao cho phần tử này cùng với lời giải tối ưu của bài toán con với tập con S – {s} với ràng buộc W(R-{s}) là lời giải tối ưu cho bài toán
Bước 2: Tiếp tục tìm phần tử tiếp theo có lợi nhất với tập con S=S-{s} với ràng buộc W(R-{s}) và hàm mục tiêu Z = Z (R-{s}) Cho đến khi không tìm được
Trang 121.4.3 Lược đồ giải thuật tham lam
Tư tưởng của phương pháp tham lam
Ta xây dựng tập S dần từng bước, bắt đầu từ tập rỗng Tại mỗi bước ta sẽ chọn một phần tử “tốt nhất” trong các phần tử còn lại của A để đưa vào S Việc lựa chọn một phần tử như thế ở mỗi bước được hướng dẫn bởi hàm chọn Phần tử được chọn sẽ được loại khỏi tập A Nếu khi thêm phần tử được chọn vào tập S mà S vẫn còn thỏa mãn các điều kiện của bài toán thì ta mở rộng S bằng cách thêm vào phần
Lược đồ tổng quát như sau:
Procedure Greedy(A, S) // A là một tập các ứng cử viên, S là tập quyết định – nghiệm
Trang 13Trong lược đồ tổng quát trên, Select là hàm chọn, nó cho phép ta chọn từ tập
A một phần tử được xem là tốt nhất, nhiều hứa hẹn nhất là thành viên của tập nghiệm
1.4.4 Thiết kế một thuật toán dựa trên ý tưởng tham lam
Khi tiếp cận bài toán và tìm thuật toán tham lam thì cần khảo sát kĩ bài toán
để tìm ra các tính chất đặc biệt mà ở đó ta có thể đưa ra quyết định tức thời tại từng bước dựa vào sự đánh giá tối ưu cục bộ
Ý tưởng của phương pháp tham lam trong thiết kế thuật toán được tiến hành là: Xác định trật tự xử lí để có lợi nhất, sắp xếp dữ liệu theo trật tự đó, xử lí dữ liệu theo trật tự đã nêu
1.4.5 Tiến trình thực hiện phương pháp tham lam
Thuật toán tham lam có được một giải pháp tối ưu cho một bài toán bằng cách thực hiện một chuỗi các lựa chọn Đối với mỗi quyết định chỉ ra trong thuật toán, sự lựa chọn này dường như tốt nhất tại thời điểm được chọn Chiến lược phỏng đoán này không luôn tạo ra giải pháp tối ưu, nhưng thỉnh thoảng nó giải quyết được
Quy trình thực hiện để phát triển thuật toán tham lam đi qua từng bước như sau:
1 Xác định cấu trúc con tối ưu
2 Xây dựng giải pháp đệ quy
3 Chứng minh: tại mỗi bước đệ qui, lựa chọn tham lam là một trong những lựa chọn cho kết quả tối ưu
4 Chỉ ra: sau mỗi lựa chọn tham lam, một trong những bài toán con sẽ rỗng
5 Xây dựng giải pháp đệ quy cho chiến lược tham lam
6 Khử đệ quy
Qua các bước này, ta đã thấy chi tiết cơ bản nguồn gốc quy hoạch động của thuật toán tham lam Trong thực tế, ta thường tổ chức hiệu quả các bước trên khi thiết kế giải thuật tham lam Ta phát triển cấu trúc con với một cái nhìn hướng đến thực hiện lựa chọn tham lam mà để lại một bài toán con được giải quyết một cách tối ưu
Trang 14Ví dụ - bài toán chọn hoạt động:
Bài toán sắp xếp lịch cho nhiều hoạt động với ý nghĩa để có thể sử dụng chung một tài nguyên (mỗi thời điểm chỉ có một hoạt động sử dụng tài nguyên chung), với mục tiêu là sắp xếp sao càng có nhiều hoạt động tương thích sử dụng tài nguyên càng tốt
Giả sử ta có một tập hợp S = {a1, a2, , an } là tập các hoạt động muốn sử dụng tài nguyên, ví dụ một hội trường, chỉ mỗi một hoạt động tại mỗi thời điểm Mỗi hoạt động ai sẽ có thời điểm bắt đầu là si và thời điểm kết thúc là fi, với điều kiện 0 ≤ si < fi < ∞ Nếu hoạt động ai được chọn, thì nó sẽ độc chiếm tài nguyên trong khoảng thời gian [si, fi) Hoạt động ai và aj được gọi là tương thích lẫn nhau nếu như khoảng thời gian [si, fi) và [aj, fj) là không giao nhau (Ví dụ ai và aj là tương thích nếu si ≥ fj hoặc sj ≥ fi ) Trong bài toán chọn hoạt động ta phải chọn tập con lớn nhất của các hoạt động tương thích lẫn nhau Chẳng hạn, xem tập S của các hoạt động sau, mà ta có thể sắp xếp tăng dần theo thời điểm kết thúc
Ta sẽ giải quyết bài toán này trong một vài bước Bắt đầu bởi việc đưa ra công thức của giải pháp quy hoạch động đối với bài toán này trong đó ta tổng hợp các giải pháp tối ưu đối với hai bài toán con để thiết lập giải pháp tối ưu của bài toán gốc Ta có các lựa chọn khi quyết định các bài toán để sử dụng trong một giải pháp tối ưu Sau đó, ta sẽ nhận thấy rằng ta chỉ cần một lựa chọn duy nhất - lựa chọn tham lam - và sau khi ta lựa chọn chỉ còn một bài toán con, một bài toán con còn lại sẽ rỗng
Dựa trên những nhận xét này, ta sẽ xây dựng một giải thuật tham lam đệ quy
để giải quyết bài toán lập lịch hoạt động Ta sẽ hoàn thành quá trình xây dựng giải
Trang 15thuật tham lam bởi việc biến đổi giải thuật đệ quy sang giải thuật lặp Mặc dù những bước ta thực hiện trong phần này thể hiện mối liên quan nhiều hơn là tiêu biểu cho
sự phát triển của phương pháp tham lam, chúng minh hoạ cho mối quan hệ của phương pháp tham lam và quy hoạch động
Ta trước tiên định nghĩa bài toán con Sij, mà cả hai i và j khác nhau Ta đã thấy rằng nếu ta luôn thực hiện lựa chọn tham lam, ta có thể giới hạn các bài toán con được thành lập bởi Si,n+1
Như một sự lựa chọn, ta có thể tạo nên cấu trúc con tối ưu với một lựa chọn tham lam có nghĩa Điều đó là, ta có thể bỏ qua chỉ số dưới thứ hai và định nghĩa các bài toán con của công thức Si = {ak S : fi ≤ Sk} Sau đó, ta có thể chứng minh rằng một lựa chọn tham lam (hoạt động đầu tiên am để kết thúc Si ), kết hợp với một giải pháp tối ưu để đi đến tập còn lại Sm của các hoạt động tương thích, mang lại một giải pháp tối ưu đối với Si Tổng quát hơn, ta thiết kế thuật toán tham lam theo chuỗi các bước:
1 Tìm lựa chọn sao cho bước tiếp theo chỉ việc giải quyết một bài toán con
2 Chứng minh rằng với sự lựa chọn tham lam tại mỗi bước ta luôn tìm được một giải pháp tối ưu của bài toán ban đầu
3 Chỉ ra rằng, với sự lựa chọn tham lam tại mỗi bước, giải pháp tối ưu của bài toán con còn lại kết hợp vớisự lựa chọn tham lam này sẽ đi đến một giải pháp tối ưu cho bài toán ban đầu
Có thể nói một cách như thế nào nếu một giải thuật tham lam sẽ giải quyết được một bài toán tối ưu riêng biệt? Không có cách tổng quát, nhưng chiến lược lựa chọn tham lam và cấu trúc con tối ưu là hai thành phần then chốt Nếu ta có thể chứng minh rằng bài toán có các thuộc tính này, sau đó ta thuận lợi trong cách xây dựng một thuật toán tham lam cho nó
1.5 Một số bài toán đặc trưng
1.5.1 Bài toán lựa chọn công việc
Phát biểu bài toán
Giả sử rằng ta có một tập S = { 1,2, , n} của n công việc sử dụng cùng một tài nguyên, ví dụ như một phòng họp, tại một thời điểm chỉ có một công việc được
Trang 16tiến hành Các công việc i được bắt đầu tại thời điểm s i và kết thúc tại thời điểm f i
với si ≤ f i Nếu được chọn, công việc i sẽ chiếm khoảng thời gian là [s i , f i )
Hãy lựa chọn các công việc không mâu thuẫn nhau (nghĩa là hoạt động i và j
là tương thích nếu khoảng thời gian [s i , f i ] và [s j , f j ] không phủ lấp lên nhau(tức
là i và j là tương thích nếu s i >= f j hay s j >= f i ) sao cho số các công việc được chọn là nhiều nhất
Xác định bài toán
INPUT: Thời gian khởi đầu s[1 n]; Thời gian kết thúc f[1 n]
OUTPUT: Lựa chọn các công việc không mâu thuẫn nhau sao cho số công việc được chọn là nhiều nhất
Tính chất lời giải
Giả sử dãy công việc được sắp xếp tăng dần theo thời điểm kết thúc :
f 1 f 2 f n
1 Luôn tồn tại một lời giải tối ưu chứa công việc thứ nhất
2 Nếu A S là lời giải tối của bài toán có chứa việc 1 thì A – {1} là lời giải tối ưu của bài toán với tập S’ gồm các công việc bắt đầu từ thời điểm f 1 trở đi
Các bước của thuật giải tham lam
1 Xác định cấu trúc tối ưu của bài toán Tìm cấu trúc tối ưu để xây dựng một lời giải tối ưu cho bài toán từ những lời giải tối ưu của các bài toán con
Gọi S i j là tập con của các hoạt động trong S có thể bắt đầu sau khi hoạt động
a i kết thúc và trước khi hoạt động a j bắt đầu
S i j chứa các hoạt động tương thích với a i và a j và cũng tương thích với tất cả các hoạt động kết thúc không muộn hơn và bắt đầu không sớm hơn bắt đầu của a j
Giả sử các hoạt động được sắp xếp theo thứ tự tăng thời gian kết thúc của các hoạt động
Để tìm cấu trúc con cho bài toán xếp lịch, khảo sát các bài toán con S i j khác rỗng và giả thuyết lời giải S i j chứa một số hoạt động a k sao cho:
f i < s k < f k < s j
Trang 17Từ a k có thể chia thành hai bài toán con: S i k và S k j , mỗi bài toán con chứa một tập con các hoạt động S i j Lời giải cho S i j là tổ hợp của lời giải S i k và S k j
cùng với chính hoạt động a k
Giả sử có một lời giải tối ưu A i j cho tập S i j (có chứa hoạt động a k ) Khi đó các lời giải a i k của tập S i k và a k j của tập S k j mà được dùng cho lời giải tối ưu cho tập S i j cũng phải tối ưu
2 Xây dựng lời giải đệ qui
Tìm các tập con kích cỡ tối đa A i k và A k j chứa các hoạt động tương thích nhau cho mỗi bài toán con
Tạo tập kích cỡ tối đa A i j chứa các hoạt động tương thích
A i j = A i k {a k } A k j
Đặt c[i,j] là số hoạt động của một tập con kích cỡ tối đa chứa các hoạt động tương thích trong S i j:
Ta có công thức đệ qui để tìm c[i, j]
Chọn hoạt động a m trong S i j có thời gian hoàn thành sớm nhất, rồi tìm lời giải cho bài toán con S m j Hoạt động được chọn theo cách tham lam nghĩa là nó làm tối đa thời gian còn lại chƣa được xếp lịch để được xếp lịch cho nhiều hoạt động khác
Loại bỏ những hoạt động chƣa được xếp lịch (bị trùng lặp)
Lặp lại quá trình trên
3 Chứng minh với bất kỳ lời gọi đệ qui, một lựa chọn tối ưu là một lựa chọn tham lam Vì vậy nó luôn đảm bảo để tạo một lựa chọn tham lam
Chứng minh giải thuật sử dụng hai thuộc tính sau:
Bài toán có cấu trúc tối ưu
Thuật giải thỏa mãn thuộc tính chọn tham lam
Một bài toán thể hiện cấu trúc tối ưu nếu lời giải tối ưu của bài toán lớn luôn chứa trong nó những lời giải tối ưu của bài toán con
Trang 18Nếu A S là lời giải tối của bài toán có chứa việc một thì A’ = A – {1} là lời giải tối ưu của bài toán với tập S’ gồm các công việc bắt đầu từ thời điểm f 1 trở
đi (nghĩa là S’={i S: s i f 1 })
Tạo lựa chọn tốt nhất tại một thời điểm, giải các bài toán con được phát sinh
từ lựa chọn đó
Lựa chọn được tạo ra bởi giải thuật tham lam có thể phụ thuộc vào những lựa chọn ở xa nhưng nó không thể phụ thuộc vào bất kỳ lựa chọn sẽ được phát sinh hay những lời giải của bài toán con
4 Chỉ ra rằng duy nhất một bài toán con sau khi chọn tham lam là khác rỗng
5 Phát triển lời giải đệ qui để thực hiện giải thuật tham lam
Giải thuật tham lam giải bài toán lựa chọn công việc
1.5.2 Bài toán người du lịch
Phát biểu bài toán
Một người du lịch muốn tham quan n thành phố T1, T2,…,Tn Xuất phát từ một thành phố nào đó người du lịch muốn đi qua tất cả các thành phố còn lại, mỗi thành phố đi qua đúng một lần rồi quay lại đúng thành phố xuất phát Giả thiết luôn
có đường đi giữa hai thành phố bất kì
Gọi CP(i,j) là chi phí đi từ thành phố Ti đến Tj Hãy tìm hành trình thỏa mãn yêu cầu bài toán sao cho chi phí là nhỏ nhất
Trang 19Xác định bài toán
INPUT: n thành phố, CP(i,j) _ chi phí đi từ thành phố Ti đến Tj
OUTPUT: Hành trình tối ưu và chi phí tương ứng
Ý tưởng
Đây là bài toán tìm chu trình có trọng số nhỏ nhất trong một đơn đồ thị vô hướng có trọng số
Thuật toán tham lam cho bài toán là chọn thành phố có chi phí nhỏ nhất tính
từ thành phố hiện thời đến thành phố chưa qua
Xây dựng thuật toán
- COST := COST + Cvw ;//Cập nhật chi phí
// Chuyến đi hoàn thành - khi hành trình trở về thành phố xuất phát ban đầu TOUR := TOUR + <v,u> ;
Trang 20Mô tả như hình dưới đây:
Trang 211.5.3 Bài toán cái ba lô
Phát biểu bài toán
Có n vật, mỗi vật i, i{1, ,n} được đặc trưng bởi trọng lượng wi(kg) và giá trị vi(US) Có một chiếc túi xách có khả năng mang m(kg) Giả sử wi , vi, m N*
i{1, ,n}
Hãy chọn vật xếp vào ba lô sao cho ba lô thu được có giá trị nhất
Phân tích thiết kế thuật toán
Các wi của n vật có thể được biểu diễn bằng mảng: w=(w1, w2,…,wn)
Bước 1: Tính đơn giá cho các loại đồ vật
Bước 2: Xét các loại đồ vật theo thứ tự đơn giá từ lớn đến nhỏ
Bước 3: Với mỗi đồ vật được xét sẽ lấy một số lượng tối đa mà trọng lượng còn lại của ba lô cho phép
Bước 4: Xác định trọng luợng còn lại của ba lô và quay lại bước 3 cho đến khi không còn có thể chọn được đồ vật nào nữa
Minh họa:
Ta có một ba lô có trọng lượng là 37 và 4 loại đồ vật với trọng lượng và giá trị tương ứng được cho trong bảng:
Trang 22Từ bảng đã cho ta tính đơn giá cho các loại đồ vật và sắp xếp các loại đồ vật này theo thứ tự đơn giá giảm dần ta có bảng:
Theo đó thì thứ tự ưu tiên để chọn đồ vật là: B, A, D và cuối cùng là C Vật B được xét đầu tiên và ta chọn tối đa 3 cái vì mỗi cái vì trọng lượng mỗi cái là 10 và ba lô có trọng lượng 37 Sau khi đã chọn 3 vât loại B, trọng lượng còn lại trong ba lô là 37 - 3*10 = 7
Xét đến vật A, vì A có trọng lượng 15 mà trọng lượng còn lại của ba lô chỉ còn 7 nên không thể chọn vật A
Xét vật D và ta thấy có thể chọn 1 vật D, khi đó trọng lượng còn lại của ba lô
1.5.4 Bài toán băng nhạc
Phát biểu bài toán
Người ta cần ghi N bài hát, được mã số từ 1 đến N, vào một băng nhạc có thời lượng tính theo phút đủ chứa toàn bộ các bài hát đã cho Với mỗi bài hát ta biết thời lượng phát của mỗi bài hát đó Băng sẽ được lắp vào một máy phát nhạc đặt trong một siêu thị Khách hàng muốn nghe bài hát nào chỉ cần nhấn phím tương ứng
Trang 23với bài hát đó Để tìm và phát bài hát thứ I trên băng, máy xuất phát từ đầu cuộn băng, quay băng để bỏ qua i-1 bài ghi trước đó Thời gian quay băng bỏ qua mỗi bài hát và thời gian phát bài hát đó được tính là như nhau Tính trung bình, các bài hát trong một ngày được khách hàng lựa chọn với số lần ( tần suất ) là như nhau Hãy tìm cách ghi các bài trên băng sao cho tổng thời gian quay băng trong mỗi ngày là ít nhất
Dữ liệu vào được ghi trong tệp văn bản tên BANGNHAC.INP
- Dòng đầu tiên là số tự nhiên N cho biết số lượng bài hát
- Tiếp đến là N số nguyên dương thể hiện dung lượng tính theo phút của mỗi bài Mỗi đơn vị dữ liệu cách nhau qua dấu cách
Ví dụ dưới đây cho biết có N = 3 bài hát:
- Bài 1 phát trong thời gian 7 phút
- Bài 2 phát trong thời gian 2 phút
- Bài 3 phát trong thời gian 3 phút
Dữ liệu ra được ghi trong tệp văn bản BANGNHAC.OUT theo dạng thức sau:
- N dòng đầu tiên thể hiện trật tự ghi bài hát trên băng: m ỗi dòng gồm hai số nguyên dương j và d cách nhau bởi dấu cách, trong đó j là mã số của bài hát cần ghi, d là thời gian tìm và phát bài đó theo trật tự ghi này
- Dòng thứ n + 1 ghi tổng số thời gian quay băng nếu mỗi bài hát được phát một lần trong ngày
Với ví dụ trên, kết quả thu được sẽ như sau:
- Cần ghi lần lượt trên băng các bài theo trật tự : bài 2, bài 3, bài 1;
- Để tìm và phát bài 2 cần 2 phút;
- Để tìm và phát bài 3 cần 5 phút;
- Để tìm và phát bài 1 cần 12 phút;
Trang 24Phân tích thiết kế thuật toán
Giả sử ta có ba bài hát với số phút lần lượt như sau:
Ta xét vài tình huống ghi băng để rút ra kết luận cần thiết
Vậy phương án tối ưu sẽ là ghi bài 2 rồi đến bài 3, cuối cùng ghi bài 1 Tổng thời gian theo phương án này là 19 phút
Để có phương án tối ưu ta chỉ cần ghi băng theo trật tự tăng dần của thời lượng Bài toán được cho với giả thiết băng đủ lớn để ghi được toàn bộ các bài Dễ dàng sửa chương trình để vận dụng cho trường hợp dung lượng tăng hạn chế trong
M phút Chương trình sắp xếp dữ liệu theo chỉ dẫn
Một cách đơn giản để tìm lời giải trên là vét cạn các hoán vị, nhưng khi đó chi phí thời gian là quá lớn Ta sẽ xác định trước một trật tự và xử lý dữ liệu theo trật tự này
Mô tả thuật toán:
Input : (a1, a2, , an)
Output : Hoán vị b = (k1, ,kn) ; min = D(b) = Min {D(K) : K ∈ Σ };
Định hướng cho thuật toán tham lam trong trường hợp này là các Tj được tính theo trật tự tăng dần của a, phần tử ai được chọn trong mỗi bước thêm vào chính là min của {ai , ,an} Khi đó, lời giải tìm được sẽ là lời giải tối ưu
Thuật toán tham lam có thể mô tả như sau :
record_greedy(a,b,n)
* Khởi động b[i] = i,∀i; min = 0;t = 0;
Trang 25* for (i = 1 → n)
- Chọn j = arcmin(a,n,i); // a[j] = min{a[i], a[n]};
- b[i] ↔ b[j]; // Đổi chỗ
- a[i] ↔ a[j]; // Đổi chỗ
- Cập nhật lại giá trị min;
t = t + a[i]; min = min + t;
* return min;
1.6 Phương pháp tham lam trong tương quan với phương pháp khác - Phương pháp quy hoạch động
1.6.1 Phương pháp quy hoạch động
Quy hoạch động là một phương pháp rất hiệu quả để giải các bài toán tối ưu
tổ hợp Ý tưởng cơ bản của phương pháp này là: để có lời giải của bài toán tối ưu kích thước n, ta giải các bài toán tương tự có kích thước nhỏ hơn và phối hợp lời giải của chúng để được lời giải của bài toán ban đầu Đó chính là tư tưởng chia để trị một cách rất nghiêm ngặt
Không phải bài toán nào cũng có thể giải bằng quy hoạch động Để giải được bằng quy hoạch động, bài toán thoả mãn nguyên lý tối ưu Bellman: mọi dãy con của một dãy tối ưu cũng phải là dãy tối ưu
Thông thường hàm mục tiêu của bài toán được xây dựng từ một hàm có dạng: f(n) = max(f(k)+g(n)), trong đó k là một số giá trị phù hợp nhỏ hơn n
Hàm f(n) được gọi là hàm quy hoạch động Việc tính giá trị hàm f được hiện
từ dưới lên, tức là các giá trị n nhỏ được tính trước Tất cả các kết quả được lưu vào bảng để phục vụ cho việc tính hàm quy hoạch động với các giá trị n lớn hơn
1.6.2 Phương pháp tham lam trong tương quan với phương pháp quy hoạch động
Phương pháp tham lam và phương pháp quy hoạch động giống nhau là đều được sử dụng để giải các bài toán tối ưu và để giải bài toán đều xuất phát từ việc giải các bài toán con
Điểm khác nhau giữa phương pháp tham lam và phương pháp quy hoạch động là phương pháp tham lam có thành phần then chốt trước tiên là tính lựa chọn tham lam: một giải pháp tối ưu toàn cục có thể đạt được bằng cách lựa chọn tối ưu
Trang 26phương án nào tốt nhất ở hiện tại, mà không cần quan tâm đến kết quả các bài toán con của nó Đây là chỗ khác nhau giữa các thuật toán tham lam và quy hoạch động Trong quy hoạch động tại mỗi bước ta thực hiện một lựa chọn, nhưng sự lựa chọn phụ thuộc vào các giải pháp cho các bài toán con Do đó, ta giải quyết một cách tiêu biểu các bài toán quy hoạch động theo kiểu từ dưới lên, nghĩa là lần lượt xử lý những bài toán con nhỏ hơn đến những bài toán con lớn hơn Trong giải thuật tham lam, ta thực hiện cách chọn bất kỳ dường như tốt nhất ngay lập tức và sau đó giải quyết bài toán con xuất hiện sau khi lựa chọn được thực hiện Lựa chọn được thực hiện bởi một thuật toán tham lam có lẽ phụ thuộc vào các lựa chọn cho đến giờ, nhưng nó không thể phụ thuộc vào những lựa chọn bất kỳ trong tương lai hay những giải pháp cho các bài toán con Vì vậy, không giống quy hoạch động, nó giải quyết các bài toán con từ dưới lên, một chiến lược tham lam thường giải quyết theo kiểu từ trên xuống, thực hiện một lựa chọn tham lam sau một chọn lựa khác, liên tục rút gọn từng trường hợp bài toán đã cho thành một bài toán nhỏ hơn
Chúng ta có thể lựa chọn giải pháp nào được cho là tốt nhất ở thời điểm hiện tại và sau đó giải bài toán con nảy sinh từ việc lựa chọn vừa rồi Lựa chọn của thuật toán tham lam có thể phụ thuộc vào các lựa chọn trước đó Nhưng nó không thể phụ thuộc vào một lựa chọn nào trong tương lai hay phụ thuộc vào lời giải của các bài toán con Thuật toán tiến triển theo kiểu thực hiện các lựa chọn theo một vòng lặp, cùng lúc đó thu nhỏ bài toán đã cho về một bài toán con nhỏ hơn Đấy là điểm khác nhau giữa thuật toán này và giải thuật quy hoạch động Giải thuật quy hoạch động duyệt hết và luôn đảm bảo tìm thấy lời giải Tại mỗi bước của thuật toán, quy hoạch động đưa ra quyết định dựa vào các quyết định của bước trước, và có thể xét lại đường đi của bước trước hướng tới lời giải Giải thuật tham lam quyết định sớm và thay đổi đường đi của thuật toán theo quyết định đó, và không bao giờ xét lại các quyết định
cũ Đối với một số bài toán, đây có thể là một thuật toán không chính xác
Thành phần thứ hai, đó là cấu trúc con tối ưu Đối với phương pháp tham lam, một nghiệm tối ưu có thể nhận được bằng cách gia tăng các nghiệm thành phần
đã được xây dựng với một nghiệm tối ưu của bài toán con còn lại Có nghĩa là một nghiệm tối ưu sẽ chứa các nghiệm tối ưu đối với các bài toán con kích thước nhỏ hơn Sự khác nhau cơ bản giữa các thuật toán quy hoạch động và các thuật toán