2.4.1. Giới thiệu
Trong thời đại hiện nay, chúng ta có thể thấy sự tác động của việc áp dụng thuật toán trong toàn bộ các phần mềm đã và đang đƣợc sử dụng. Các thuật toán ngày càng trở nên chiếm vai trò quan trọng trong hệ thống ngành kinh tế, công nghệ, khoa học, và trong cuộc sống hàng ngày.
Chúng ta có thể kể ra một số ngành nghề đặc biệt liên quan chặt chẽ đến việc áp dụng các thuật toán nhƣ công nghệ sinh học, tìm kiếm thông tin, mạng lƣới thông tin liên lạc, mật mã, hệ thống thông tin địa lý, lấy thông tin từ hình ảnh (chỉnh sửa, khôi phục), vận tải đa phƣơng tiện...
Algorithmics – hệ thống phát triển tính hiệu quả của thuật toán trở thành công nghệ chủ chốt trong quá trình phát triển các ứng dụng trên máy tính. Tuy nhiên, trong những năm qua xuất hiện khoảng cách ngày càng lớn giữa lý thuyết về thuật toán thuần túy và nhu cầu thực tế. Hệ quả của vấn đề này dẫn đến việc chỉ một số ít các thuật toán là thực sự đƣợc áp dụng trong thực tế. Điều này thật sự rất đáng tiếc, để hiểu đƣợc vấn đề này, chúng ta cần tìm hiểu quá trình nghiên cứu thuật toán đƣợc diễn ra nhƣ thế nào theo cách thông thƣờng.
2.4.1.1. Thuật toán cổ điển
Trọng tâm của lý thuyết về thuật toán là các vấn đề đơn giản và có tính trừu tƣợng. Đối với một vài vấn đề thuật toán đƣợc thiết kế và phân tích dựa trên các mô hình giả định sinh ra từ các máy trừu tƣợng (máy tính tự động sử dụng theo lý thuyết automata), từ đó đƣa ra đánh giá thời gian chạy của các thuật toán trong trƣờng hợp xấu nhất và xác định đƣợc chất lƣợng của thuật toán.
Trong khoa học máy tính, thời gian thực hiện và chất lƣợng lời giải là thƣớc đo cho tính hiệu quả của thuật toán.
26
Giải quyết các các vấn đề trừu tƣợng và mô hình máy trừu tƣợng (abstract machine) có những điểm đáng chú ý trên lý thuyết:
- Các thuật toán đƣợc thiết kế với các vấn đề nhƣ vậy có thể áp dụng trên nhiều ứng dụng cụ thể hóa trong các lĩnh vực khác nhau.
- Hầu hết các mô hình máy cổ điển đều tƣơng đƣơng với thời gian sai khác không quá đa thức, tác động của thuật toán không đƣợc tính toán chi tiết.
- Trƣờng hợp xấu nhất của thuật toán xảy ra không giống nhƣ trong thiết kế.
- Cho phép các máy tính độc lập thực hiện thuật toán để có thể so sánh về trƣờng hợp xấu nhất mà không cần trang bị gì thêm.
Từ quan điểm của lý thuyết thuật toán, việc áp dụng thuật toán là một phần của việc thiết kế và phát triển phần mềm. Hiệu quả của thuật toán đƣợc đánh giá qua những ngƣời chuyên môn trong lĩnh vực của ứng dụng đó.
Tuy nhiên, chúng ta nên lƣu ý rằng đối với nhiều ngƣời tiên phong trong thuật toán những ngày đầu, nhƣ Knuth, Floyd và những ngƣời khác, tất cả các thuật toán mà họ thiết kế đƣợc đánh giá dựa vào tiêu chuẩn thực hành. Điều này làm thay đổi quan điểm về thiết kế thuật toán, và dẫn đến yêu cầu phải phát triển các cấu trúc dữ liệu tiên tiến để cài đặt các thuật toán.
Qua việc triển khai và thử nghiệm giữa lý thuyết và thực hành, nhiều nhà khoa học đã nhận ra nhu cầu của việc thiết kế và phân tích từ thực tế ngày càng lớn. Một nhóm các nhà nghiên cứu thuật toán bắt đầu tìm cách để khắc phục vấn đề này cách đây 15 năm.
2.4.1.2. Nền tảng của Kỹ nghệ thuật toán
Qua cách tiếp cận thuật toán, chúng ta có thể thấy việc thực thi và thí nghiệm có tầm quan trọng nhƣ việc phân tích và thiết kế. Cách tiếp cận này đã cho chúng ta một khái niệm mới, đó là Kỹ nghệ thuật toán.
Thomas Kuhn tiến hành phân tích cấu trúc sự biến chuyển của khoa học và sử dụng các mô hình khái niệm để miêu tả lại “sự kết hợp truyền thống của nghiên cứu khoa học”. Theo Kuhn sự biến chuyển mô hình chỉ xảy ra khi mô hình cũ
27
đang khủng hoảng và không thể giải quyết đƣợc các vấn đề mới. Vậy sự kiện đòi hỏi mô hình mới? Chúng ta sẽ liệt kê một vài ví dụ sau đây:
- Các mô hình máy tính Von – Neumann đã dần không còn thích hợp trong thực tế với các việc nhƣ xử lý song song, xử lý pipelining, dự đoán trƣớc, phân cấp bộ nhớ và bộ nhớ đệm, xử lý đa luồng, và mô hình tính toán phân tán và song song.
- Trọng tâm của việc thiết kế thuật toán tập trung vào việc cải thiện đánh giá tiệm cận trong trƣờng hợp xấu nhất và đảm bảo thuật toán đƣa ra kết quả xấp xỉ nhƣ đã dự đoán. Điều này dẫn đến việc có nhiều thuật toán và cấu trúc dữ liệu đƣợc thiết kế có nhiều ý tƣởng mới nhƣng không có tính thực tế. Đôi khi, điều đó không chắc chắn rằng các thuật toán sẽ không đƣợc áp dụng. Dù vậy, việc áp dụng vào thực tế sẽ rất khó khăn đến mức không ai muốn thử thực hiện việc này.
Điểm bất lợi của việc nghiên cứu thời gian chạy tiệm cận là chúng có thể ẩn đi các hằng số rất lớn. Tƣơng tự, yêu cầu bộ nhớ có thể là rất lớn cho dù là bị chặn bởi đa thức.
- Nhƣ ví dụ cụ thể, chúng tôi có thể trích dẫn một số vấn đề trong thuật toán:
1. Rất nhiều (không phải tất cả) sơ đồ xấp xỉ thời gian đa thức (PTAS), chẳng hạn các sơ đồ của Aurora hoặc Mitchell cho bài toán ngƣời du lịch (TSP), có hệ số rất lớn.
2. Robins và Zelikovsky trình bày một hệ thống thuật toán giải bài toán cây Steiner trong đồ thị với thời gian chạy là
, trong đó là một tham số ảnh hƣởng đến hiệu suất. Đối với trƣờng hợp lớn, thuật toán của họ đạt cận tỷ lệ tốt nhất hiện nay là 1.55. Để cải tiến tốt nhất mức xấp xỉ bảo đảm ở 1.598 bởi Hougardy và Prömel, cần thiết phải chọn
. Ngoài ra, còn cần hơn 217 thiết bị đầu cuối.
3. Câu hỏi liệu một đa giác đơn có thể đƣợc tam giác hóa trong thời gian tuyến tính hay không là một trong những vấn đề chính trong hình học tính toán nhiều năm qua. Năm 1990, vấn đề này cuối cùng đã đƣợc Chazelle giải
28
quyết, ông đã đƣa ra một thuật toán với thời gian tuyến tính khá phức tạp. Theo những kiến thức chúng tôi biết thì thuật toán này chƣa bao giờ đƣợc áp dụng.
4. Việc xây dựng hình học, đƣợc biết đến nhƣ một kỹ thuật cắt, cung cấp một kỹ thuật phân vùng không gian cho bất kỳ kích thƣớc hữu hạn nào mà trong đó có vô số ứng dụng trong hình học tính toán. Tuy nhiên, thuật toán dựa trên cuttings dƣờng nhƣ cho thấy một thách thức đối với việc thực hiện. Trong thực tế, yếu tố hằng số đóng vai trò khá lớn: trong các ứng dụng nhƣ phẫu thuật có sự trợ giúp của máy tính, phục hồi thông tin bằng công cụ tìm kiếm, hƣớng dẫn xe cộ, và nhiều ứng dụng khác, giải pháp này phải đƣợc tính trong thời gian gần nhƣ tức thời. Trong các ứng dụng khác, năng suất của ngƣời sử dụng một công cụ phần mềm có liên quan chặt chẽ với hiệu suất của công cụ. Ở đây bất kỳ sự cải thiện nào đối với yếu tố hằng số đều xứng đáng đƣợc đầu tƣ. Vì vậy, việc cải tiến yếu tố hằng số thƣờng tạo ra khác biệt cho dù công cụ có đƣợc áp dụng hay không.
- Khái niệm về hiệu quả nhƣ khả năng giải quyết thời gian đa thức thƣờng không phù hợp. Thậm chí thời gian chạy nhỏ, nhƣng siêu tuyến tính, mức độ đa thức có thể quá chậm. Các ứng dụng thực tế, chẳng hạn trong thiết kế VLSI, tin sinh học, hoặc xử lý dữ liệu không gian, yêu cầu phải xử lý các tập dữ liệu cực lớn. Trong những trƣờng hợp nhƣ vậy, chúng ta thƣờng chỉ có thể áp dụng các thuật toán đòi hỏi thời gian và không gian chạy tuyến tính, thậm chí cần các thuật toán thời gian dƣới tuyến tính. Trong thực tế, nghiên cứu về các thuật toán dƣới tuyến tính gần đây đã xuất hiện nhƣ là một lĩnh vực nghiên cứu mới. Thuật toán dƣới tuyến tính hoặc chỉ xem xét một mẫu nhỏ ngẫu nhiên của các dữ liệu đầu vào hoặc quá trình khi nó đến, và sau đó trích một bản tóm tắt nhỏ.
- Nhƣ đã nêu ở trên, tiêu chí chính khi thiết kế thuật toán lý thuyết là tính hiệu quả. Điều này đã kích thích sự phát triển của các cấu trúc dữ liệu rất tinh vi – cho dù đối với nhiều cấu trúc, liệu chúng có đƣợc thực hiện một cách hợp lý hay không vẫn là một câu hỏi. Tuy nhiên, trong thực tế, ngoài tính hiệu quả, những
29
mục tiêu thiết kế khác đều có vai trò quan trọng nhƣ nhau, đôi khi tầm quan trọng của một tiêu chí nào đó thậm chí còn đƣợc đặt cao hơn, chẳng hạn tính linh hoạt, dễ sử dụng, bảo trì, ... Trong thực tế, cấu trúc dữ liệu và các thuật toán đơn giản đƣợc ƣa thích hơn những cái phức tạp.
- Các khía cạnh lý thuyết về các thuật toán thƣờng đƣa ra một bài thuyết trình cấp cao, còn các chi tiết cần thiết để bắt đầu thực hiện thì để lại cho ngƣời đọc.
- Sự khởi đầu dễ dàng nhất để nghiên cứu và phát triển ý tƣởng thuật toán mới là từ vấn đề đơn giản. Tuy nhiên, cùng với tiến độ chung trong khoa học máy tính và sự sẵn có của sức mạnh tính toán, các ứng dụng tự trở nên phức tạp hơn. Các ứng dụng nhƣ vậy đòi hỏi một mô hình cẩn thận. Câu hỏi đặt ra là liệu kiến thức học đƣợc cho các mô hình đơn giản có thể thay thế những mô hình phức tạp hơn.
- Dữ liệu đầu vào thực thƣờng không phải là cấu trúc của các trƣờng hợp khó nhất đƣợc sử dụng trong phân tích lý thuyết. Do đó rất có thể là hiệu suất dự đoán là không khả dụng.
- Công việc thử nghiệm tốt đòi hỏi sự nỗ lực đáng kể (thời gian, nhân lực, kỹ năng lập trình, kinh nghiệm, ...).
Trong nhiều thiết lập thử nghiệm, ngƣời ta thực hiện các thí nghiệm với các trƣờng hợp ngẫu nhiên. Điều này có thể gây hiểu nhầm lớn. Ví dụ, một vài đồ thị ngẫu nhiên có một số thuộc tính cấu trúc làm cho chúng khác biệt với đồ thị trong thế giới thực. Một ví dụ khác phát sinh trong tính toán hình học: một bộ mẫu thống nhất của các điểm đảm bảo chắc chắn các điểm sẽ ở vị trí tùy ý. Tuy nhiên trong thực tế, rất có khả năng không thực hiện giả thiết này.
Thật không may, làm việc với các dữ liệu đầu vào thực tế cũng có vấn đề của nó: Những dữ liệu này có thể không có sẵn cho các nhà nghiên cứu hoặc có thể là độc quyền. Để thu hẹp khoảng cách giữa thực tế và lý thuyết, Kỹ nghệ thuật toán (Algorithm Engineering) đòi hỏi một phƣơng pháp mở rộng hơn. Tuy nhiên, Algorithm Engineering sẽ phải giữ đƣợc những lợi thế của lý thuyết:
30 - Tính tổng quát,
- Độ tin cậy, và - Khả năng dự đoán.
Hy vọng là Algorithm Engineering sẽ làm tăng tác động của nó trên các lĩnh vực khác một cách đáng kể. Kỹ nghệ thuật toán sẽ làm cho việc chuyển giao các ứng dụng đƣợc tăng tốc.
2.4.1.3. Định nghĩa Kỹ nghệ thuật toán (Algorithm Engineering)
Một số chi tiết của Kỹ nghệ thuật toán đã đƣợc trình bày tại các hội thảo của DIMACS (http://dimacs.rutgers.edu/Challenges/):
"Những vấn đề đƣợc thực hiện bởi DIMACS giải quyết câu hỏi về việc xác định hiệu suất thuật toán thực tế nơi mà những phân tích trƣờng hợp xấu nhất là quá bi quan và mô hình xác suất là quá phi thực tế: việc thử nghiệm có thể cung cấp các hƣớng dẫn để thực hiện thuật toán thực tế khi mà phân tích không thành công.
Thí nghiệm cũng mang thuật toán gần gũi hơn với các vấn đề ban đầu, tạo nên động lực cho các công trình lý thuyết. Nó cũng góp phần kiểm tra rất nhiều giả định về phƣơng pháp thực hiện và cấu trúc dữ liệu. Nó tạo ra một cơ hội để phát triển và kiểm tra vấn đề, máy phát ví dụ, và các phƣơng pháp khác để kiểm tra và so sánh hiệu suất của thuật toán. Đó là một bƣớc tiến trong việc chuyển giao công nghệ bằng cách cung cấp các hệ thống xử lý của các thuật toán cho những ngƣời khác để sửa đổi thích hợp.
Kể từ năm 1990, khi First Challenge bắt đầu với dòng chảy mạng, tổng cộng chín thách thức thực hiện đã đƣợc tiến hành. Thuật ngữ Algorithm Engineering lần đầu tiên đƣợc sử dụng với độ đặc hiệu và tác động đáng kể trong năm 1997, với việc tổ chức Hội thảo đầu tiên về Algorithm Engineering (WAE 1997). Một vài năm trƣớc đây, David Bader, Bernard Moret, và Peter Sanders định nghĩa nhƣ sau:
"Algorithm Engineering đề cập đến quá trình cần thiết để biến đổi một thuật toán từ bút chì trên giấy thành hiện thực, hiệu quả, kiểm nghiệm tốt, và dễ dàng sử
31
dụng. Vì vậy, nó bao gồm một số chủ đề, từ hành vi mẫu bộ nhớ cache đến các nguyên tắc của công nghệ phần mềm; tuy nhiên trọng tâm chính của nó là thử nghiệm. "
Chúng ta đồng ý rằng tất cả các chủ đề đƣợc đề cập đều là những phần quan trọng của Algorithm Engineering, nhƣng vẫn muốn có một cái nhìn rộng hơn về vấn đề này. Một định nghĩa tổng quát hơn đã xuất hiện trong thông báo của ALCOM-FT Summer School về Algorithm Engineering năm 2001:
"Algorithm Engineering liên quan với việc thiết kế, phân tích lý thuyết và thực nghiệm, kỹ thuật và điều chỉnh các thuật toán, và đang thu hút đƣợc sự quan tâm ngày càng tăng trong cộng đồng những ngƣời nghiên cứu thuật toán. Quy tắc mới nổi này giải quyết các vấn đề về hiệu suất thuật toán thực tế bằng cách kết hợp cẩn thận các phƣơng pháp lý thuyết truyền thống cùng với các khảo sát thực nghiệm kỹ lƣỡng. "(Đăng trong DMANET vào ngày 17 tháng năm 2001 bởi Guiseppe Italiano).
2.4.1.4. Phương pháp luận
Phƣơng pháp khoa học có nguồn gốc từ các ngành khoa học tự nhiên. Nó xem khoa học nhƣ là một chu kỳ giữa lý thuyết và thực nghiệm. Lý thuyết có thể quy nạp và diễn dịch một phần - theo lý thuyết dựa trên giả định cụ thể - xây dựng giả thuyết thực nghiệm đã đƣợc thử nghiệm.
Các kết quả của các thí nghiệm lần lƣợt có thể dẫn đến giả thuyết hay lý thuyết mới, v.v… Cũng giống nhƣ công nghệ phần mềm, Algorithm Engineering
không phải là một quá trình đơn giản. Lý tƣởng nhất, ngƣời ta sẽ thiết kế một thuật toán, thực hiện nó, và sử dụng nó. Tuy nhiên, các thuật toán tối ƣu, tức là thuật toán tốt nhất để giải quyết vấn đề trong một ứng dụng, và bƣớc thực hiện cuối cùng không đƣợc biết trƣớc.
Trong Algorithm Engineering, một bằng chứng lý thuyết cho sự phù hợp đối với một mục đích cụ thể đƣợc thay thế bởi một đánh giá thực nghiệm. Ví dụ, thử nghiệm đó giúp kiểm tra liệu code đƣợc thiết lập có hiệu quả hoặc trong trƣờng hợp thuật toán gần đúng, thì mới có hiệu quả.
32
Thông thƣờng, để đƣa ra các kết quả đánh giá thực nghiệm đòi hỏi một phiên bản thiết kế và thực hiện nữa. Vì vậy, nhƣ đã nêu trong DFG Priority Program 1307 [556]:
"Cốt lõi của Algorithm Engineering là một chu kỳ điều khiển bởi các giả thuyết giả định." [Www.algorithm-engineering.de]
Thông thƣờng, phân tích đƣợc coi là một phần của chu kỳ này, dẫn đến một chu kỳ mà trong đó bao gồm thiết kế, phân tích, thực hiện và đánh giá thử nghiệm các thuật toán thực tế. Tuy nhiên, vì kết quả phân tích của thiết kế sẽ ngay lập tức đƣa ra phản hồi cho các nhà thiết kế và không đi qua thực hiện và thử nghiệm đầu tiên, nó có vẻ thích hợp hơn khi để cho các giai đoạn phân tích là một phần của