Các kết quả thực nghiệm giải bài toán 1

Một phần của tài liệu (LUẬN văn THẠC sĩ) thuật toán dijkstra fibonacci heap, thuật toán ACO tìm đường đi tối ưu và ứng dụng (Trang 61 - 63)

Thực nghiệm kiểm tra chương trình trên 11 bộ test có tên lần lượt là Test00, Test01,.., Test09, Test10. Các file input, output được lưu trong các thư mục có tên ở cột thứ nhất. Hình thức một file output đã mô tả ở mục 3.1.3, dưới đây là nội dung file output của bộ test thứ nhất - Test00:

341

1 25097 23364 18174 7928 10086 38541 4461 11683 34627 30000 Kết quả (thời gian chạy chương trình) thực nghiệm khi chạy chương trình giải bài toán 1 được thống kê trong bảng 3.1 dưới đây (đơn vị thời gian tính bằng giây, N là số đỉnh, M là số cạnh):

Bảng 3.1. Thống kê kết quả thực nghiệm chương trình giải bài toán 1

Tên test

N M

Thời gian chạy chương trình dùng Dijkstra heap

Thời gian chạy chương trình dùng Dijkstra thường Test00 40000 1600000 1.900 11.807 Test01 100 1000 0.056 0.040 Test02 1000 20000 0.067 0.110 Test03 10000 60000 0.094 0.174 Test04 20000 200000 0.412 3.994 Test05 40000 600000 0.980 9.758 Test06 80000 1000000 1.398 6.196 Test07 100000 2000000 2.587 19.570 Test08 300000 3000000 2.923 70.682 Test09 1000000 5000000 7.573 > 3000 Test10 20000 400000 0.269 2.148

Tên các test ở cột 1 của bảng trên thực chất là tên thư mục chứa test đó, điều cần quan tâm nhất ở đây là thời gian chạy của hai chương trình ở cột 4 và cột 5. Số liệu ở bảng trên đã chứng minh tính ưu việt của thuật toán Dijkstra Fibonacci heap so với thuật toán Dijkstra nguyên thủy.

Nhìn chung khi đồ thị thưa và số đỉnh càng lớn thì thuật toán Dijkstra Fibonacci heap càng tỏ ra ưu việt hơn so với thuật toán Dijkstra nguyên thủy. Tuy nhiên khi số đỉnh ít thì có khi thuật toán Dijkstra nguyên thủy chạy lại nhanh hơn (test01). Sở dĩ có hiện tượng này là vì: Độ phức tạp của thuật toán Dijkstra nguyên thủy là O(N2) suy ra số phép tính toán của thuật toán này cỡ C1N2, độ phức tạp của thuật toán Dijkstra Fibonacci heap là O(Nlog N + M)

suy ra số phép tính toán thực tế của thuật toán là cỡ C2(Nlog N + M) với C1,

C2 là các hằng số. Do Dijkstra Fibonacci heap phải thao tác với Fibonacci heap tương đối phức tạp nên thực tế C2 > C1 vì thế khi N nhỏ có thể xảy ra

trường hợp C1N2 < C2(Nlog N + M), nếu điều này xảy ra thì thuật toán

Dijkstra nguyên thủy chạy nhanh hơn.

Các tệp input trong các bộ test được tạo ra hoàn toàn ngẫu nhiên, thuật toán tạo các file input như sau:

- N, M, s, t nhập từ bàn phím.

- Dùng một mảng c lưu bán bậc ra của các đỉnh, ban đầu c[i]:= 0

i=1..N. Thực hiện M lần sinh số ngẫu nhiên nguyên dương thuộc [1, N] bằng

hàm random, khi sinh được số i thì c[i] được tăng 1 đơn vị. - Tạo các cung xuất phát từ các đỉnh i như sau:

Với mỗi đỉnh i: Dùng một mảng daxet để quản lý các đỉnh đã có cung

nối từ đỉnh i tới, ban đầu daxet[j]:=false  j<>i, daxet[i] := true. Thực hiện c[i] lần sinh số nguyên ngẫu nhiên u thuộc [1, N] sao cho daxet[u] = false.

Với mỗi u sinh được ta có một cung (i,u), trọng số của cung này cũng được

sinh ngẫu nhiên. Sau khi ghi cung (i,u) này ra tệp input ta sẽ gán cho daxet[u] bằng true để không lặp lại các cung.

Thuật toán như đã mô tả ở trên cho phép ta tạo ra các file input lưu các đồ thị ở dạng danh sách cung với số đỉnh lớn tới hàng triệu và không có cung nào bị lặp.

Một phần của tài liệu (LUẬN văn THẠC sĩ) thuật toán dijkstra fibonacci heap, thuật toán ACO tìm đường đi tối ưu và ứng dụng (Trang 61 - 63)

Tải bản đầy đủ (PDF)

(74 trang)