Mô phỏng dữ liệu vào là cách chọn hình thức hiển thị cho cấu trúc dữ liệu tương ứng với giải thuật. Việc lựa chọn mô hình mô phỏng cho dữ liệu vào quyết định tính hiệu quả của chương trình mô phỏng. Hình thức hiển thị này phải dễ hiểu, dễ gây hứng thú cho người học muốn tìm hiểu thuật toán.
Ví dụ: với chương trình mô phỏng các thuật toán trên đồ thị, dữ liệu vào sẽ là một đồ thị bao gồm tập các nút và các cạnh nối các nút với nhau. Ta sẽ thể hiện các nút là 1 hình tròn màu xanh có tên nút ở giữa. Cạnh nối sẽ nối hai nút của đồ thị bằng một đường thẳng (nếu có trọng số thì trọng số đó sẽ nằm giữa vị trí giữa của hai nút). Như vậy, đồ thị được xây dựng rất trực quan và người học có thể quan sát dễ dàng những thay đổi trên đồ thị khi thực hiện các bước của giải thuật.
Hình vẽ: Dữ liệu đầu vào: một đồ thị có hƣớng gồm 6 đỉnh, 7 cạnh
Việc đưa dữ liệu vào (như đã phân tích trong phần 4 – chương 2) là một yếu tố quan trọng quyết định tính hiệu quả của mô phỏng thuật toán. Nên chương trình mô phỏng cần phải có nhiều cơ chế đưa dữ liệu vào, ví dụ như:
- Đề xuất một số dữ liệu mẫu: Chương trình sẽ chuẩn bị một số dữ liệu mẫu từ trước để người học có thể học thuật toán ngay mà không phải chuẩn bị dữ liệu đầu vào.
- Sinh ngẫu nhiên: để cho chương trình tự sinh một đồ thị tùy ý
- Sinh dữ liệu thủ công: người học dùng công cụ của chương trình cung cấp để tự tạo đồ thị theo cách của mình. Đây là cách để giải quyết các băn khoăc của người học về thuật toán (với trường hợp này thì kết quả sẽ là thế nào? Với đồ thị đặc biệt này thì thuật toán có chạy không dừng hay không?...)
5.3.Chia thuật toán thành nhiều bƣớc nhỏ rồi mô phỏng theo từng bƣớc
Việc chia thuật toán thành nhiều bước nhỏ rất có ý nghĩa trong việc lập trình. Nó làm cho thuật toán ban đầu trở nên đơn giản, rõ ràng và dễ hiểu hơn.
Ví dụ: thuật toán tìm đường đi ngắn nhất trên đồ thị có trọng số - thuật toán Dijsktra:
Cho đồ thị G = (V, E) - V tập các đỉnh và E là tập các cạnh Thuật toán Dijkstra tìm đường đi ngắn nhất từ đỉnh s tới đỉnh t.
Gọi S là tập các đỉnh đã xác định được đường đi ngắn nhất từ s tới các đỉnh này và d[u] là độ dài đường đi ngắn nhất từ s tới u.
Sau đây là giải thuật:
Bước 1) Khởi tạo
S = {s}, d[s] = 0, d[u] = + với u S Bước 2)Chọn u = s
Lặp nếu u <> t
Xét các đỉnh v (với v S)
2.1 Cập nhật d[v] = min{d[v], d[u] + c[u, v]} và trace[v] = u nếu d[v] > d[u] + c[u,v] 2.2 Chọn v có d[v] là nhỏ nhất
2.3 Thêm v vào S, u = v
Bước 3) In ra d[t] và đường đi từ s đến t
Hình vẽ: Một bước mô phỏng của thuật toán Dijsktra
5.4. Tổng hợp mô phỏng theo các bƣớc
Cuối cùng, sau khi mô phỏng được từng bước của thuật toán ta tiến hành ghép các bước mô phỏng lại để được mô hình mô phỏng hoàn chỉnh: thao tác đưa dữ liệu vào, tiến hành chạy theo từng bước, quan sát những thay đổi của cấu trúc dữ liệu sau mỗi bước và quan sát kết quả cuối cùng khi thuật toán đã chạy xong.
5.5.Sơ đồ cấu trúc chung của hệ thống mô phỏng
Có một số hệ thống mô phỏng thuật toán được viết bằng ngôn ngữ lập trình Java với cùng một kiến trúc như sau:
Hình: Sơ đồ cấu trúc của một hệ thống mô phỏng
Thuật toán (giả mã) Đồ họa mô phỏng hoạt động của thuật toán File kịch bản Kênh mô phỏng Các hàm mô phỏng Màn hình trình diễn mô phỏng
- Kênh mô phỏng: Đóng vai trò như một kênh truyền giữa hệ thống mô phỏng và người dùng cuối. Nó đọc một file kịch bản do người dùng chuẩn bị từ trước chuyển sang cho các hàm mô phỏng mô phỏng thuật toán và đưa kết quả lên màn hình bằng đồ họa.
- Các hàm mô phỏng: chứa chức năng vẽ các đối tượng được mô phỏng lên màn hình trình diễn mô phỏng.
- Màn hình trình diễn mô phỏng: cung cấp môi trường đồ họa để hiển thị kết quả cho người dùng cuối quan sát.
Một ví dụ về chuẩn bị file kịch bản và hình ảnh các bước mô phỏng được mô tả ở phần phụ lục của luận văn này.
Hình ảnh thể hiện kết quả cuối cùng của thuật toán Dijsktra
6. Đề xuất lựa chọn công cụ để phát triển chương trình mô phỏng thuật toán
Trong mục này, chúng ta sẽ phân tích các cách tiếp cận để xây dựng hệ thống mô phỏng và tính khả thi của chúng. Ta sẽ xem xét một vài công cụ mô phỏng thuật toán để xây dựng hệ thống mô phỏng phù hợp.
Có ba cách tiếp cận có thể để xây dựng hệ thống mô phỏng thuật toán. Cách tiếp cận thứ nhất là lựa chọn hệ thống mô phỏng thuật toán cung cấp các công cụ chung để xây dựng các thành phần tương tác cho hệ thống mô phỏng (sử dụng lại tài nguyên sẵn có). Cách tiếp cận thứ hai là lựa chọn một chương trình mô phỏng một thuật toán đã có (dạng open source), sửa đổi, nâng cấp thành hệ thống mới. Cách tiếp cận cuối cùng là phân tích thiết kế hệ thống từ đầu.
6.1. Một số hệ thống mô phỏng thuật toán chung
Có một số chương trình mô phỏng thuật toán theo ý người dùng. Hay nói cách khác là đưa thuật toán, đưa cấu trúc dữ liệu, đưa dữ liệu vào trên một file kịch bản theo quy định chung của chương trình mô phỏng. Nếu file kịch bản đưa vào phù hợp với ngữ cảnh của chương trình đó (nghĩa là có thể mô tả cấu trúc dữ liệu bằng đồ họa của chương trình) thì nó sẽ mô phỏng các bước của thuật toán theo đúng sự chuẩn bị của người dùng. Các hệ thống này thường được viết bằng ngôn ngữ Java có cùng kiến trúc như đã đề cập trong phần 5 – chương 2 của luận văn này. Ta sẽ phân tích từng hệ thống để thấy được những ưu và nhược điểm của từng hệ thống.
JSAMBA
JSAMBA (xem http://www.cc.gatech.edu/gvu/softviz/algoanim/samba. html) là một phiên bản viết bằng Java của hệ thống mô phỏng POLKA (như đã giới thiệu trong phần lịch sử phát triển thuật toán mô phỏng). JSAMBA cung cấp các đối tượng như: đoạn văn bản (text), đoạn thẳng (lines), hình chữ nhật (rectangle), tam giác (triangle), hình tròn (circles) và đa giác (polygon). Nó có thể vẽ các đối tượng được mô phỏng bằng một tốc độ khá nhanh. Hình ảnh ít bị “giật giật” hình khi chạy mô phỏng. Nó cho phép người dùng thay đổi kích thước của các đối tượng được mô phỏng.
Có thể sử dụng cho các chương trình được viết bằng bất kì một ngôn ngữ nào. Nó sử dụng các thư viện có sẵn của Java để mô phỏng và tận dụng được mọi ưu điểm của Java, dễ tiếp cận qua các trình duyệt web hiện nay.
Hạn chế
Phải chuẩn bị trước một file kịch bản theo đúng yêu cầu của chương trình. Điều này là một hạn chế lớn đối với học sinh trong việc tự học (vì nếu chúng biết chuẩn bị file kịch bản cho mô phỏng theo đúng quy cách của chương trình thì đã không cần phải học lập trình nữa!)
Đối với giáo viên, một hạn chế nổi bật của Jsamba là không hỗ trợ bất kì một cấu trúc dữ liệu có sẵn nào. Điều này làm cho chương trình trở nên gọn và đóng kín nhưng mặt khác nó cũng gây nên một hạn chế là việc chuẩn bị file kịch bản là rất phức tạp vì phải mô hình hóa các cấu trúc dữ liệu đi kèm.
JAWAA (Java and Web – based Algorithm Animation)
JAWAA (http://www.cs.duke.edu/~rodger/tools), hoạt động tương tự như Jsamba. Nó là một ngôn nhữ gồm các lệnh đơn giản để tạo ra những mô phỏng cấu trúc dữ liệu vào hiển thị chúng trên trình duyệt web. Các lệnh được sinh trong file kịch bản và chạy bởi Jawaa Applet. JAWAA cung cấp các lệnh cho phép tạo và di chuyển một số đối tượng cơ bản: hình tròn, đoạn thẳng, đoạn văn bản và khối hình chữ nhật và một số cấu trúc dữ liệu cơ bản: mảng, stack, queue, danh sách, cây và đồ thị. Tốc độ vẽ và mô phỏng nhanh. Các đối tượng mô phỏng được vẽ lại trên màn hình nhờ việc sử dụng kĩ thuật bộ nhớ đệm đôi trong đó bao gồm hai hình ảnh: một được vẽ lên màn hình, một được lưu trữ trong bộ nhớ. Một đặc điểm nữa của Jawwa là nó cung cấp một số điều khiển cho người dùng: các nút lệnh bắt đầu, dừng, chạy từng bước và lựa chọn tốc độ thể hiện mỗi bước của thuật toán trên màn hình.
Cũng giống như Jsamba, Jawaa cũng là một phần mềm mô phỏng được viết bằng Java nên nó có mọi ưu điểm của ngôn ngữ Java.
Ngoài ra, Jawaa còn cung cấp các cấu trúc dữ liệu cơ bản: stack, queue, list, tree….. nên người dùng có thể mô hình những cấu trúc dữ liệu này dễ dàng hơn JSAMBA. Các lệnh trong file kịch bản có thể được thực hiện riêng biệt hoặc trong một khối lệnh.
Một ưu điểm nữa là Jawaa cho phép dùng miễn phí.
Nhƣợc điểm
JAWAA không cho phép người dùng xem lại các bước đã mô phỏng nên việc muốn xem lại một thao tác nào đó đồng nghĩa với việc quan sát lại toàn bộ mô phỏng của một thuật toán.
Hơn nữa, vì có cùng mô hình với JSAMBA nên JAWAA cũng yêu cầu một file kịch bản riêng. Đây là một hạn chế lớn đối với trình độ của học sinh trung học phổ thông.
JANIME
JANIME (http://www.cs.wm.edu/~noonan/jay/index.html) được viết bởi Noonan (trường đại học William và Mary). Đây cũng là một hệ thống mô phỏng trên nền web với mục đích phục vụ giảng dạy và được viết bằng java. JANIME rất giống với JAWWA, nó cũng cung cấp một số cấu trúc dữ liệu (mảng, stack và queue) và các hình vẽ cơ bản như: đoạn văn bản, hình chữ nhật, hình tròn, đoạn thẳng và đa giác. Mặc dù, JANIME chứa ít cấu trúc dữ liệu hơn JAWWA nhưng nó chứa sẵn nhiều lệnh kịch bản hơn và nhiều công cụ điều khiển hơn trong khi mô phỏng.
Tương tự như JAWWA nên nó có hầu hết các ưu điểm giống như JAWWA và một ưu điểm của JANIME là cho phép quan sát lại các bước đã thực hiện.
Nhƣợc điểm
Mặc dù có nhiều ưu điểm hơn cả Jawwa nhưng nói chung các phần mềm mô phỏng có cùng một mô hình thường có nhược điểm giống nhau. Đều khó cho việc tự học của học sinh cũng như thời gian chuẩn bị các file kịch bản của giáo viên khi giảng dạy.
Một nhược điểm nữa của Janime là không được dùng “miễn phí”.
6.2. Sử dụng công cụ mô phỏng thuật toán riêng biệt
Có một số chương trình mô phỏng cụ thể về một thuật toán nào đó được viết rất nhiều và miễn phí trên mạng. Hình vẽ dưới đây hiển thị các kết quả khi tìm kiếm bằng google với khóa là “Algorithm Animation”.
Chỉ trong 0.07s có tới 2.820.000 kết quả
Sử dụng các chương trình này có một lợi ích là chỉ việc học cách sử dụng mà không mất thời gian xây dựng. Hình ảnh mô phỏng khá đa dạng và phong phú. Các thuật toán được mô phỏng tương đối nhiều.
Tuy nhiên, các chương trình này được xây dựng một cách riêng rẽ (của các tác giả khác nhau), không có một hệ thống quy chuẩn nhất định. Có thể là của một trường đại học nổi tiếng (ví dụ: http://www.cs.auckland.ac.nz/ software/ AlgAnim/alg_anim.html) nhưng cũng có thể chỉ là một bài tập cá nhân (http://forum.khmt3-k2.net/t242-demo-chng-trnh-m-phng-thut-ton-heapsort-c-c- code.html). Những chương trình này không có một hệ thống kiểm định tính đúng sai. Nếu học sinh “tự học” một mô hình mô tả sai cách thức hoạt động (có thể vì tự tìm được một mô hình mô phỏng của thuật toán) thì thật là “nguy hiểm” nếu người học tiếp thu theo đúng mô hình đó.
6.3. Xây dựng hệ thống từ đầu
Khi hệ thống hiện tại không phù hợp với người dùng (có thể vì: không được đầu tư ngân sách, không hợp ngữ cảnh…) dẫn đến phát sinh yêu cầu một hệ thống mới. Hệ thống này sẽ bắt đầu được xây dựng từ nền tảng hoàn toàn mới dựa trên mô tả thực của người dùng.
Chương 3 PHÂN TÍCH THIẾT KẾ HỆ THỐNG MÔ PHỎNG MỘT SỐ THUẬT TOÁN TRÊN ĐỒ THỊ
1.Mục đích
Hệ thống được xây dựng nhằm giúp giáo viên có thể sử dụng như một công cụ giảng dạy các thuật toán trên đồ thị. Nó cũng có thể giúp học sinh chuyên Tin tự tìm hiểu thuật toán khi học các thuật toán trên đồ thị với cách thức hoạt động theo mô tả của thuật toán và những thay đổi trực quan bằng đồ họa.
2.Những yêu cầu thực tế
Năm 2009, Bộ Giáo dục và Đào tạo cho xuất bản bộ Tài liệu giáo khoa chuyên Tin (3 tập - Hồ Sĩ Đàm chủ biên). Đây là tài liệu giới thiệu các thuật toán cơ bản, thường dùng. Bộ sách này có thể dùng cho giáo viên và học sinh Trung học phổng thông, Trung học cơ sở có thể làm tài liệu tham khảo. Tuy nhiên, để giúp học sinh có thể tự chuẩn bị trước các thuật toán ở nhà và giúp giáo viên làm rõ những thắc mắc của học sinh về thuật toán cơ bản và các cải tiến có thể làm giảm độ phức tạp của các thuật toán đó cần phải có thêm những công cụ giúp làm hiệu quả hơn cho công việc chuẩn bị của học sinh cũng như dẫn giải của giáo viên trong khi giảng bài.
Chương trình mô phỏng của chúng tôi hướng tới mục tiêu đó. Mô phỏng một cách có hệ thống các thuật toán cơ bản mà học sinh chuyên sẽ học (theo phân phối chương trình chuyên). Đó là các thuật toán: bài toán tìm kiếm trên đồ thị, bài toán tìm đường đi ngắn nhất và bài toán tìm cây khung cực tiểu trên đồ thị vô hướng.
Như đã phân tích trong mục 7 chương 2 về một số phần mềm mô phỏng, đã có nhiều trang web giới thiệu chương trình mô phỏng về các thuật toán miễn phí ở trên mạng Internet. Nhưng tổng hợp lại, các chương trình đó đều có chứa những nhược điểm có thể chỉ ra như sau:
- Hầu hết các chương trình này đều là một dạng bài tập. Hay nói cách khác, người viết chỉ hoàn thiện một thuật toán riêng lẻ, các thuật toán được giới thiệu một cách rời rạc. (http://www .cs.auckland.ac.nz /~jmor159/PLDS210/alg_anim.html)
- Hầu hết các chương trình chỉ giới thiệu về thuật toán sau đó cho phép người dùng chạy thử trên một mẫu dữ liệu có sẵn
(http://www.unf.edu/~wkloster/foundations/DijkstraApplet/DijkstraAp plet.htm). Hay nói cách khác các chương trình mô phỏng chỉ làm một việc là trình chiếu cho người sử dụng nhìn thấy các bước hoạt động của thuật toán đó. Việc theo dõi kịp các bước đó để hiểu đã thuật toán đã là một thử thách. Việc đó còn khó hơn đối với người bắt đầu học một thuật toán cụ thể nào đó chưa kể đến là các thuật toán đó đều trừu tượng.
- Cũng đã có trang web giới thiệu 2 thuật toán Kruskal và Dijsktra cùng với việc cho phép người dùng quan sát mã nguồn của thuật toán (ở ngôn ngữ Java) nhưng việc giới thiệu này đòi hỏi người dùng muốn hiểu thuật toán phải biết một chút về Java. Vì vậy, hệ thống cũng khó phổ biển ở Việt Nam được vì ngôn ngữ lập trình mà học sinh Việt Nam được học là ngôn ngữ lập trình Free Pascal và Turbo Pascal và C. - Chưa cho phép người dùng đưa dữ liệu của mình vào để thử nghiệm
thuật toán.
3. Đề xuất cho hệ thống mới
Hệ thống mới cho phép người dùng quan sát hoạt động của thuật toán đồng thời trên dữ liệu mẫu và trên đoạn giả mã của thuật toán đó. Hệ thống còn cho phép chạy toàn thuật toán, chạy từng bước, lùi một bước để tiện quan sát những thay đổi trên đoạn giả mã và trên dữ liệu mẫu.
Hệ thống cũng cho phép người học đưa dữ liệu vào (là đồ thị có hướng,