5.1.Nghiên cứu và phân tích giải thuật
Bước đầu tiên trong quá trình giải một bài toán Tin học là xác định bài toán. Ở bước này, dựa trên phát biểu của bài toán ta phải xác định rõ Input (dữ liệu đầu vào) và Output (kết quả) của bài toán là gì và mối quan hệ giữa chúng. Thông tin đó cần được nghiên cứu một cách cẩn thận để có thể lựa chọn thuật toán, cách thể hiện các đại lượng đã cho, các đại lượng phát sinh trong quá trình giải toán và lựa chọn ngôn ngữ lập trình thích hợp.
Tiêu chí để thiết kế hoặc lựa chon thuật toán thường dựa trên hai yếu tố là thời gian và không gian cần thiết để thực hiện thuật toán, trong đó yếu tố thời gian là đặc biệt quan trọng. Ngoài ra, trên thực tế khi lựa chọn thuật toán người ta còn quan tâm sao cho việc cài đặt thuật toán đó bằng một ngôn ngữ lập trình được dễ dàng, ít tốn công sức của người lập trình. Đối với những bài toán nhỏ số
lần cần giải bài toán không nhiều nên tiêu chí sau cùng thường được ưa chuộng để lựa chọn thuật toán.
Sau khi chứng minh được tính đúng đắn của giải thuật (có thể bằng suy luận Toán học hoặc chứng minh trên bộ dữ liệu mẫu phủ kín các trường hợp có thể xảy ra với bài toán) ta tiến hành cài đặt thuật toán trên một ngôn ngữ lập trình cụ thể. Để việc cài đặt thuật toán nhanh, thường người ta diễn tả lại thuật toán đủ chi tiết
5.2.Mô phỏng dữ liệu vào và kết quả đầu ra
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