You are on page 1of 3

HDTH Môn: Trí tuệ nhân tạo

Bài thực hành 1: Thuật toán UCS


1. Nội dung
Cài đặt thuật toán tìm kiếm đường đi trên đồ thị có chi phí đồng nhất (Uniform Cost Search).

2. Mục tiêu
• Sinh viên hiểu và có thể cài đặt được cấu trúc một hàng đợi ưu tiên đơn giản đồng thời có thể nắm
được một số vấn đề liên quan đến việc sử dụng cấu trúc này vào trong việc cài đặt thuật toán tìm kiếm
trên đồ thị có chi phí.
• Sinh viên nắm được cơ chế vận hành của thuật toán tìm kiếm đường đi chi phí đồng nhất, áp dụng lên một
dạng bài toán tìm kiếm cụ thể là tìm kiếm trên đồ thị.
• Sinh viên chọn cách lưu trữ dữ liệu và triển khai cài đặt phù hợp khi chuyển từ bài toán đồ thị không trọng
số sang đồ thị có trọng số.

3. Quy định nộp bài


• Làm cá nhân, bắt buộc nộp
• Deadline: 23h55 ngày 12/04/2010
• Sinh viên tổ chức cấu trúc thư mục nộp bài như sau:
o MSSV:
 Data: các file dữ liệu để chạy chương trình.
 Reference: bài tham khảo nếu có.
 Release: phần biên dịch của chương trình.
 Report: báo cáo.
 Source: Source code của chương trình.
(Nén tất cả lại thành một file MSSV.rar duy nhất để nộp.)
• Các bài giống nhau trên 80 % đếu bị 0 điểm tất cả.
• Các trường hợp bài còn lỗi, không biên dịch được, có virus… sẽ bị trừ từ 20-100% điểm tùy mức độ.
• Được quyền tham khảo các source code có sẵn nhưng phải ghi rõ nguồn và chỉ rõ mình hiểu, áp dụng, cải
tiến nó như thế nào trong báo cáo.
• Không chấp nhận các bài nộp trễ, nộp trên diễn đàn, nộp qua mail hay các hình thức khác.

4. Yêu cầu

a. Chương trình
Cho một bản đồ có N thành phố và các đường đi có thể có giữa các thành phố.Chi phi di chuyển giữa hai thành phố
kế cận nhau là w (w > 0), các đường đi có thể là 2 chiều (A đến được B thì B cũng đến được A), hoặc 1 chiều (chỉ có
A đến được B). Cho trước thành phố xuất phát và thành phố đích.

08CK5 Page 1
HDTH Môn: Trí tuệ nhân tạo
Hãy tìm đường đi giữa hai thành phố được chỉ định bằng thuật toán UCS. Nếu tồn tại đường đi: xuất ra màn hình
thứ tự đường đi và chi phí của đường đi này. Nếu không tồn tại đường đi: thông báo không có đường đi.

• Định dạng dữ liệu đầu vào:


o Dòng 1: Số thành phố trên bản đồ
o Dòng 2: Thành phố xuất phát và thành phố đích
o N dòng tiếp theo: ma trận kề của đồ thị với quy ước:
 M[i][j] = w: có đường nối trực tiếp từ i đến j với chi phí là w (w > 0)
 M[i][j] = 0: không có đường nối trực tiếp từ i đến j
 Các thành phố được đánh chỉ số từ 0

b. Báo cáo
Sinh viên viết báo cáo có ghi đủ các thông tin sau:

• Thông tin cá nhân:


o Họ tên.
o MSSV.
o Lớp và ca thực hành.
• Thông tin chương trình:
o Ngôn ngữ và mô trường cài đặt.
o Chụp hình minh họa kết quả chạy chương trình với file dữ liệu tương ứng.
o Mô tả cấu trúc dữ liệu cài đặt cho thuật toán UCS và lý do chọn các cấu trúc đó.
o Danh sách các nguồn tham khảo (nếu có) và các cải tiến so với các nguồn đó.
o Tự nhận xét các mặt hạn chế (nếu có)

5. Gợi ý một số vấn đề và mở rộng

a. Vấn đề cài đặt hàng đợi ưu tiên:


Trong bài toán tìm đường đi ngắn nhất trên đồ thị, mục tiêu tại mỗi bước đi là tìm ra đường đi kế tiếp sao cho tổng
chi phí tới thời điểm đang xét là nhỏ nhất. Chương trình cài đặt thuật toán UCS nên sinh viên cần cài đặt một cấu
trúc hàng đợi ưu tiên để lưu danh sách các định đang được duyệt. Cấu trúc hàng đợi ưu tiên được thiết kế nhằm
đẩy ra phần tử có chi phí nhỏ nhất.

Vấn đề đặt ra ở đây là: Tổ chức cấu trúc dữ liệu lưu trữ hàng đợi bằng gì?

• Một lựa chọn đơn giản đối với cài đặt hàng đợi ưu tiên là sử dụng một mảng với cách duyệt tuần tự. Với
lựa chọn này, thao tác chủ yếu đối với hàng đợi là thao tác tìm kiếm phần tử có độ ưu tiên thấp nhất
trong mảng và có độ phức tạp trung bình là O(n) với n là kích thước trung bình của hàng đợi. Các thao tác
thêm và lấy phần tử ra khỏi hàng đợi chỉ đơn giản chèn một phần tử vào cuối mảng và hoán vị phần tử có
độ ưu tiên thấp nhất ra cuối mảng đồng thời giảm kích thước mảng.
• Hoặc ta có thể sử dụng cấu trúc Heap để tăng hiệu quả trong các thao tác. Có một điểm lưu ý đối với
heap là trong heap, ta không thể tìm kiếm nhanh một phần tử đã có hay chưa (dĩ nhiên có thể tìm tuần tự
nhưng như thế thì không còn đúng với tính chất của heap) và nếu có tìm thấy thì cũng không thể thực hiện
thao tác cập nhật khi cần (tại sao?). Giải pháp của sinh viên trong tình huống này là gì?

08CK5 Page 2
HDTH Môn: Trí tuệ nhân tạo
Ngoài ra, để tìm ra phần tử nhỏ nhất, cần tìm kiếm trên hàng đợi hay sắp xếp lại hàng đợi mỗi khi có thao tác
vào/ra? Nếu tìm kiếm thì tìm kiếm tuyến tính, hay dùng bảng băm? Nếu sắp xếp thì sắp xếp như thế nào để chi phí
lấy ra hoặc đưa phần tử mới vào không quá lớn? Khi thêm một trạng thái đã có trong hàng đợi ưu tiên và trạng
thái mới thêm vào có độ ưu tiên thấp hơn, ta phải làm gì? Khi thêm một trạng thái đã có trong hàng đợi ưu tiên và
trạng thái mới thêm vào có độ ưu tiên cao hơn, ta phải làm gì?

b. Vấn đề cài đặt tập CLOSE:


Trong thuật toán UCS, đối với một trạng thái đã ra khỏi hàng đợi ưu tiên, ta nhận xét rằng chi phí đi từ trạng thái
đầu đến trạng thái đó đã tối thiểu. Để tăng hiệu quả, không cần xét các trạng thái đã lấy ra khỏi hàng đợi ưu tiên,
ta có thể lưu lại tập các trạng thái này, gọi là tập CLOSE và dùng tập CLOSE để kiểm tra xem một trạng thái đã
được duyệt xong hay chưa (trong trường hợp đó, có thể gọi hàng đợi ưu tiên là tập OPEN để phân biệt). Tập
CLOSE này sẽ được duyệt đi duyệt lại nhiều lần trong quá trình thực hiện thuật toán. Sinh viên cần suy nghĩ xem
nên lưu trữ tập đóng như thế nào để có thể tìm kiếm nhanh và ít tốn chi phí.

c. Vấn đề tái sử dụng:


Về bản chất thuật toán, UCS, Greedy Best-First Search và A* có gì giống và khác nhau? Ta có thể tận dụng phần cài
đặt của UCS để phát triển lên A* hay không, nếu có thì cần chỉnh sửa những gì? (Sử dụng hàng đợi/stack, có cần
thay đổi cấu trúc tập đóng hay không, cách tính chi phí có khác hay không?) Khi xây dựng chương trình, sinh viên
cần thiết kế sao cho có thể đạt được tính tai sử dụng cao thì có thể thực hiện nhanh chóng cho các bài tập sau.

08CK5 Page 3