Việc nắm được các kĩ thuật để có những chiến lược phù hợp trongthiết kế và đánh giá thuật toán là cần thiết, nó giúp chúng ta có thể tìm ra đượcnhữngthuật toán cho bài toán được yêu cầu
Trang 1ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
Trang 2ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
LUẬN VĂN THẠC SĨ KHOA HỌC
NGƯỜI HƯỚNG DẪN KHOA HỌC: TS Nguyễn Thị Hồng Minh
Hà Nội – 2016
Trang 3Lời cảm ơn
Em xin gửi lời cảm ơn tới các Thầy giáo, Cô giáo, Cán bộ khoa Toán - Cơ
- Tin học, trường Đại học khoa học tự nhiên, Đại học Quốc gia Hà Nội đã tận tình dạy dỗ và giúp đỡ em trong suốt thời gian học cao học
Trong quá trình thực hiện luận văn này cũng như trong suốt những năm học vừa qua, em đã nhận được sự chỉ bảo và hướng dẫn nhiệt tình của TS Nguyễn Thị Hồng Minh Em xin gửi tới Cô lời cảm ơn chân thành nhất
Em cũng xin gửi lời cảm ơn tới gia đình, bạn bè đã động viên, khuyến khích và tạo điều kiện cho em trong quá trình học tập và thực hiện luận văn này
Mặc dù đã cố gắng để hoàn thành luận văn, nhưng do hạn chế về kinh nghiệm và thời gian, nên luận văn không thể tránh khỏi những thiếu sót Em mong nhận được sự cảm thông và những ý kiến đóng góp của các Thầy, Cô và các bạn
Hà Nội, tháng 11 năm 2016
Học viên
Lã Ngọc Hải
Trang 4Mục lục
Mở đầu 1
Chương 1 Tổng quan về thiết kế thuật toán và thuật toán online 3
1.1 Thiết kế thuật toán 3
1.1.1 Định nghĩa thuật toán 3
1.1.2 Các đặc trưng cơ bản của thuật toán 6
1.1.3 Các dạng biểu diễn thuật toán 6
1.1.4 Các phương pháp thiết kế thuật toán 7
1.2 Thuật toán trực tuyến (Thuật toán online) 8
1.2.1 Giới thiệu 8
1.2.2 Phân tích cạnh tranh 12
1.2.3 Một số bài toán điển hình 13
Chương 2 Bài toán k-server và thuật toán hàm công việcError! Bookmark not defined
2.1 Bài toán k-server Error! Bookmark not defined
2.1.1 Định nghĩa Error! Bookmark not defined
2.1.2 Tính online của bài toán k-server Error! Bookmark not defined
2.1.3 Một số bài toán liên quan Error! Bookmark not defined
2.2 Một số hướng giải quyết bài toán k-serverError! Bookmark not defined
2.2.1 Thuật toán tham lam Error! Bookmark not defined
2.2.2 Thuật toán ngẫu nhiên RANDOM-SlackError! Bookmark not defined
2.2.3 Thuật toán ngẫu nhiên Hamornic Error! Bookmark not defined
2.3 Thuật toán hàm công việc (WFA) giải quyết bài toán k-serverError! Bookmark not defined
2.3.1 Thuật toán hàm công việc Error! Bookmark not defined
2.3.2 Thuật toán hàm công việc cải tiến Error! Bookmark not defined
Chương 3 Ứng dụng của bài toán k-server Error! Bookmark not defined
3.1 Bài toán Error! Bookmark not defined
3.1.1 Đặt bài toán Error! Bookmark not defined
3.1.2 Bài toán tổng quát Error! Bookmark not defined
3.2 Phân tích yêu cầu bài toán Error! Bookmark not defined
Trang 53.3 Thiết kế chương trình Error! Bookmark not defined 3.3.1 Phần cứng Error! Bookmark not defined 3.3.2 Kết quả thực nghiệm Error! Bookmark not defined
Kết luận Error! Bookmark not defined Tài liệu tham khảo 18
Trang 6Mở đầu
Thiết kế và đánh giá thuật toán là một trong những lĩnh vực quan trọng của khoa học máy tính Để giải được một bài toán trên máy tính, điều không thể thiếu là phải có thuật toán cho bài toán đó Lớp các bài toán được đặt ra từ các ngành khoa học kỹ thuật, các lĩnh vực hoạt động của con người là rất đa dạng và phong phú Có thể có nhiều kĩ thuật khác nhau để thiết kế các thuật toán cùng đưa ra lời giải đúng và chính xác cho một bài toán, nhưng với hiệu quả thực hiện khác nhau Việc nắm được các kĩ thuật để có những chiến lược phù hợp trongthiết kế và đánh giá thuật toán là cần thiết, nó giúp chúng ta có thể tìm ra đượcnhữngthuật toán cho bài toán được yêu cầu và từ đó xác định được thuật toán tốt và phù hợp nhất.Một thuật toán tốt sẽ giúp chúng ta giải được bài toán một cách chính xác, đồng thời giảm thiểu thời gian và sử dụng không gian, theo nghĩa tài nguyên máy,một cách hợp lí trong quá trìnhtính toán
Những nghiên cứu về các kĩ thuật, phương pháp thiết kế thuật toán đã được quan tâm từ rất sớm và mang lại nhiều lợi ích trong khoa học tính toán và thông tin Một số các kĩ thuật thiết kế thuật toán đã được chuẩn hóa thành lớp các phương pháp, như: Chia để trị, Quay lui, Nhánh cận, Quy hoạch động, Tham lam… Một đặc trưng quan trọng của các kĩ thuật thiết kế thuật toán này là chúngchỉ có thể áp dụng đối với các bài toán đã được xác định, tức là những dữ liệu đầu vào và yêu cầu đầu ra của bài toán cần giảilà có sẵn và đầy đủ trước khi thực hiện thuật toán Tuy nhiên, có một số bài toán, ứng dụng trong thực tế thì điều này đôi khikhông được đáp ứng Có những bài toán cần lời giải, nhưng dữ liệu vào chỉ được cung cấp từngphần, theo thời gian.Lời giải của bài toán tại mỗi thời điểm sẽ chỉcăn cứ trên những dữ liệu vào được cung cấptại thời điểm đó và trước đó mà không biết những dữ liệu vào sau thời điểm đó sẽ ra sao Các bài
toán có đặc trưng như vậy được gọi là bài toán trực tuyến (online
problem).Thuật toán để giải quyết các bài toán trực tuyến được gọi là thuật toán
trực tuyến (onlinealgorithm), trong luận văn này chúng tôi gọi là thuật toán
Trang 7online Như vậy, thuật toán trực tuyến sẽ thực hiện và đưa ra kết quả đầu ra của
bài toán chỉ dựa trên dữ liệuđầu vào tại mỗi thời điểm cung cấp và trước đó, mà
không biết đến thông tin về đầu vào trong tương lai
Thuật toán trực tuyến đã được nhiều nhà khoa học và nhóm nghiên cứu quan tâm và phát triển Tuy nhiên việc thiết kế và đánh giá thuật toán trực tuyến vẫn
còn nhiều thách thức trong nghiên cứu lí thuyết cũng như triển khai ứng
dụng.Trong bản luận văn nàychúng tôi sẽ trình bày những kết quả nghiên cứu
xung quanh việc tìm hiểu bài toán trực tuyến, tập trung chính vào bài toán
k-server, một dạng tương đối điển hình của bài toán trực tuyến, vàchiến lược thiết
kế thuật toántrực tuyếncho bài toán này thông qua hàm công việc (working
function) Với chủ đề “Thuật toán hàm công việc giải quyết bài toán k-server”,
luận văn được cấu trúc gồm có 3 chương:
Chương 1 Tổng quan: Là chương trình bày về các khái niệm cơ bản trong thiết kế thuật toán Trong đó, tập trung vào trình bày về thuật toán trực tuyến, các yếu tố cơ bản của việc thiết kế thuật toán trực tuyến và một số
ví dụ điển hình
Chương 2 Bài toán k-server và thuật toán hàm công việc: Là chương trình bày về một bài toán điển hình trong lớp thuật toán trực tuyến, đó là bài toán k-server Định nghĩa về bài toán, phân tích bài toán và thiết kế một số
thuật toán trong lớp thuật toán trực tuyến để giải quyết bài toán này
toán trực tuyến và bài toán k-server Trong đó, thực nghiệm và đưa ra kết quả đánh giá đối với các thuật toán đã trình bày trong Chương 2
Trang 8Chương 1 Tổng quan về thiết kế thuật toán và thuật
toán trực tuyến
Chương này sẽ trình bày các kiến thức cơ bản sử dụng trong các phần sau, đặc biệt là các kiến thức liên quan đến thiết kế thuật toán và thuật toán trực tuyến Kiến thức trong chương này được trình bày dựa vào các tài liệu [1], [7],[16], [17]
1.1 Thiết kế thuật toán
Khoa học máy tính là ngành nghiên cứu các cơ sở lý thuyết về thông tin và tính toán cùng sự thực hiện và ứng dụng của chúng trong các hệ thống máy tính Khoa học máy tính gồm nhiều ngành hẹp, một số ngành tập trung vào các ứng dụng thực tiễn cụ thể chẳng hạn như đồ họa máy tính, trong khi một số ngành khác lại tập trung nghiên cứu đến tính chất cơ bản của các bài toán tính toán như lý thuyết độ phức tạp tính toán Ngoài ra còn có những ngành khác nghiên cứu các vấn đề trong việc thực thi các phương pháp tính toán Ví dụ, ngành lý thuyết ngôn ngữ lập trình nghiên cứu những phương thức mô tả cách tính toán khác nhau, trong khi ngành lập trình nghiên cứu cách sử dụng các ngôn ngữ lập trình và các hệ thống phức tạp, và ngành tương tác người-máy tập trung vào những thách thức trong việc làm cho máy tính và công việc tính toán hữu ích, và dễ sử dụng đối với mọi người dùng Trong khoa học máy tính, thuật toán
là một trong những khái niệm nền tảng
Đầu tiên, thuật toán được hiểu như là các quy tắc thực hiện các phép toán số học với các con số được viết trong hệ thập phân Cùng với sự phát triển của máy tính, các khái niệm thuật toán được hiểu theo nghĩa rộng hơn
1.1.1 Định nghĩa thuật toán
Theo Niklaus Wirththì:
“Thuật toán + Cấu trúc dữ liệu = Chương trình”
(Algorithms + Data Structures = Programs)
Trang 9Thuật toán là một dãy hữu hạn các thao tác cơ bản được sắp xếp theo một trình tự xác định dùng để giải một bài toán Một thuật toán, một thủ tục tính toán được định nghĩa chính xác, là lấy một giá trị hoặc một tập các giá trị, được gọi là đầu vào hay dữ liệu vào và tạo ra một giá trị, hoặc một tập các giá trị, và gọi là đầu ra Miêu tả một vấn đề thường được xác định nói chung qua quan hệ đầu vào/đầu ra Một thuật toán là một dãy bước xác định để chuyển đổi dữ liệu đầu vào thành dữ liệu đầu ra Chúng ta có thể xem một thuật toán như một công cụ
để giải quyết một vấn đề tính toán Việc trình bày rõ ràng một vấn đề nói chung hình thành mối quan hệ mong muốn đầu vào/đầu ra Dãy thao tác đơn giản, có thể “giao cho máy tính làm được” để từ đầu vào có thể dẫn ra đầu ra một cách tường minh Một thuật toán được gọi là chính xác nếu với mọi dữ liệu vào, nó kết thúc với kết quả chính xác Chúng ta nói rằng một thuật toán chính xác giải quyết một vấn đề đã cho chính xác Một thuật toán không chính xác có thể không dừng tại mọi bộ dữ liệu vào, hoặc cho kết quả không chính xác Đối lập với nhiều suy nghĩ, một thuật toán không chính xác đôi khi có ích, nếu tỉ lệ lỗi có thể quản lý được
Mỗi thao tác trong thuật toán hay còn gọi là tác vụ, phép toán, chỉ thị hay lệnh… là một hành động cần được thực hiện bởi cơ chế thực hiện của thuật toán Mỗi thao tác biến đổi bài toán từ một trạng thái trước sang trạng thái sau Thực
tế, mỗi thao tác thường sử dụng một số đối tượng trong trạng thái nhập và sản sinh ra các đối tượng mới trong trạng thái xuất Quan hệ giữa hai trạng thái xuất
và nhập cho thấy tác động của thao tác Dãy thao tác của thuật toán nối tiếp nhau nhằm biến đổi bài toán từ trạng thái ban đầu đến trạng thái kết thúc
Khi một thuật toán đã hình thành thì ta không xét đến việc chứng minh thuật toán đó mà chỉ chú trọng đến việc áp dụng các bước theo sự hướng dẫn sẽ có kết quả đúng Việc chứng minh tính đầy đủ và tính đúng của các thuật toán phải được tiến hành xong trước khi có thuật toán Nói rõ hơn, thuật toán có thể chỉ là việc áp dụngcác công thức hay quy tắc, quy trình đã được công nhận là đúng hay
Trang 10đã được chứng minh về mặt toán học."Thuật toán" hiện nay thường được dùng
để chỉ thuật toán giải quyết các vấn đề tin học Hầu hết các thuật toán tin học đều
có thể viết thành các chương trình máy tính mặc dù chúng thường có một vài hạn chế (vì khả năngcủa máy tính và khả năng của người lập trình) Trong nhiều trường hợp, một chương trình khi thiết kế bị thất bại là do lỗi ở các thuật toán mà người lập trình sử dụng không chính xác, không đầy đủ, hay không ước định được trọn vẹn lời giải của vấn đề Tuy nhiên cũng có một số bài toán mà hiện nay người ta chưa tìm được lời giải triệt để, những bài toán ấy gọi là những bài toán NP-không đầy đủ Như trên,thuật toán ngoài ra còn chỉ những phương pháp đem lại được kết quả một cách tối ưu,giảm lượng tài nguyên bỏ ra để đạt được.Những phương pháp này có thể được rút ra từ thực nghiệm và có thể giải được bằng toán học hoặc không,tuy nhiên mọi thuật toán đáp ứng tính logic tối hậu của tự nhiên mà là nguyên do của nhiều loại logic mờ
Khi nghiên cứu về thuật toán, người ta quan tâm đến các vấn đề sau:
Giải được bằng thuật toán: Lớp bài toán nào giải được bằng thuật toán, lớp bài toán không giải được bằng thuật toán
Tối ưu hóa thuật toán: Tìm những thuật toán tốt hơn
Triển khai thuật toán: Sử dụng các ngôn ngữ lập trình để thực hiện thuật toán trên máy tính
Thời gian mà máy tính khi thực hiện một thuật toán không chỉ phụ thuộc vào bản thân thuật toán đó, ngoài ra còn tùy thuộc từng máy tính Để đánh giá hiệu quả của một thuật toán, có thể xét số các phép tính phải thực hiện khi thực hiện thuật toán này Thông thường số các phép tính được thực hiện phụ thuộc vào cỡ của bài toán, tức là độ lớn của đầu vào Vì thế độ phức tạp thuật toán là một hàm phụ thuộc đầu vào Tuy nhiên trong những ứng dụng thực tiễn, chúng ta không cần biết chính xác hàm này mà chỉ cần biết một ước lượng đủ tốt của chúng
Trang 111.1.2 Các đặc trưng cơ bản của thuật toán
Thuật toán có một số đặc trưng cơ bản sau:
a Tính khách quan: Các thao tác, đối tượng trong thuật toán phải có ý nghĩa rõ ràng, không gây nhầm lẫn Nói cách khác, dù cho thực hiện theo người hay theo máy, thuật toán đều phải đưa ra cùng một kết quả
b Tính dừng: Thuật toán phải dừng và cho kết quả sau một số bước hữu hạn
c Tính đúng đắn: Thuật toán đúng là thuật toán cho kết quả thỏa mãn yêu cầu đặc tả của mọi trường hợp đối tượng và đầu vào Thuật toán là sai nếu kết quả đưa ra sai trong ít nhất một trường hợp
d Tính phổ dụng: Thuật toán dùng để giải một lớp bài toán gồm nhiều bài toán
cụ thể, lớp đó được xác định bởi đặc tả Thuật toán không chỉ áp dụng cho một bài toán nhất định mà có thể áp dụng cho một lớp các bài toán có đầu vào tương tự nhau
1.1.3 Các dạng biểu diễn thuật toán
Trong ngành khoa học máy tính, thuật toán được thể hiện thông qua
thiết kế để giải quyết một số bài toán một cách có hệ thống.Thuật toán có thể diễn đạt dưới ba dạng: liệt kê từng bước, sơ đồ khối, mã giả
a Dạng liệt kê từng bước: Là dạng thuật toán được trình bày theo ngôn ngữ
tự nhiên theo trình tự các bước thực hiện trong thuật toán
b Dạng sơ đồ khối: Là dạng dùng các hình vẽ để diễn đạt thuật toán Cho hình ảnh trực quan và tổng thể của thuật toán, dễ hiểu và dễ sử dụng
c Dạng mã giả: Là dạng thuật toán trình bày trong một văn bản, tuy không ràng buộc nhiều như dạng ngôn ngữ lập trình nhưng cũng tuân theo một
số quy ước ban đầu Tùy theo việc định hướng cài đặt thuật toán theo ngôn ngữ lập trình nào mà ta diễn đạt thuật toán gần với ngôn ngữ lập trình ấy
Trang 121.1.4 Các phương pháp thiết kế thuật toán
Các bài toán giải được trên máy tính ngày càng phức tạp và đa dạng Các thuật toán đòi hỏi có quy mô lớn, tốn nhiều thời gian và công sức Tuy nhiên, công việc sẽ đơn giản hơn nếu ta chia bài toán ra thành các bài toán nhỏ Cách thiết kế thuật toán này gọi là Modul hóa và thiết kế từ trên xuống
Chiến thuật thiết kế này là chia để trị, tức là nhìn nhận vấn đề một cách tổng quát, sau đó chia nhỏ bài toán thành các bài toán nhỏ và dần dần giải quyết các bài toán nhỏ đó Đây thường là cách tiếp cận của con người với hầu hết các vấn
đề trong cuộc sống.Ví dụ:
Hình 1: Mô hình thiết kế thuật toán từ trên xuống
Thông thường, ta chia được các bài toàn thành hai lớp không giao nhau: Lớp bài toán giải được bằng thuật toán và lớp không giải được bằng thuật toán Đối với lớp các bài toán giải được bằng thuật toán, dựa vào các đặc trưng của quá trình thiết kế, người ta phân thành một số phương pháp điển hình sau: