You are on page 1of 25

Đại học Bách khoa Hà Nội

Trường công nghệ Thông tin và Truyền thông

Bài tập lớn


Môn: Nhập môn Trí tuệ nhân tạo
Tên đề tài: Tìm đường đi ngắn nhất trên bản
đồ
Giáo viên hướng dẫn: PGS. TS. Trần Đình Khang

Nhóm sinh viên thực hiện:

Võ Minh Trí 20210862

Nguyễn Đức Thịnh 20210817

Vũ Trịnh Kim 20215409

Trần Hồ Khánh Ly 20210561

Nguyễn Tuấn Anh 20210015

Mã lớp: 141320

Mã HP: IT3160

Hà Nội, 4 tháng 12 năm 2023


Mục lục

Lời mở đầu 1

1 Giới thiệu bài toán 2


1.1 Ý tưởng của bài toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Biểu diễn bài toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Lời giải đề xuất . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Dữ liệu bài toán 3


2.1 Bộ dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Xử lý dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3 Thuật toán đề xuất 4


3.1 Thuật toán A* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.1.1 Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.1.2 Giải thuật . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.1.3 Các hàm heuristic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1.4 Manhattan Distance (L1 Norm) . . . . . . . . . . . . . . . . . . . . 7
3.1.5 Euclidean Distance (L2 Norm) . . . . . . . . . . . . . . . . . . . . . 8
3.1.6 Chebyshev Distance (Infinity Norm) . . . . . . . . . . . . . . . . . . 8
3.2 Thuật toán Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2.1 Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2.2 Giải thuật . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.3 Thuật toán Floyd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3.1 Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3.2 Giải thuật . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.4 Thuật toán di truyền . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.4.1 Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.4.2 Ý tưởng chung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.5 Thuật toán Nhánh cận . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.5.1 Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.5.2 Ý tưởng chung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.6 So sánh các thuật toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4 Xây dựng chương trình 15


4.1 Ngôn ngữ lập trình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

i
4.2 Giao diện bản đồ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

5 Kết quả thực nghiệm 16


5.1 Đánh giá các thuật toán khi không sử dụng ràng buộc . . . . . . . . . . . . 17
5.2 Đánh giá các thuật toán khi sử dụng ràng buộc . . . . . . . . . . . . . . . . 18
5.2.1 Kịch bản 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.2.2 Kịch bản 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2.3 Kịch bản 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2.4 Kịch bản 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

6 Kết luận 20

7 Tài liệu tham khảo 22

ii
Lời mở đầu
Trí tuệ nhân tạo (Artificial Intelligence - AI) là một lĩnh vực nghiên cứu và phát triển
trong ngành khoa học máy tính, nhằm tập trung vào việc xây dựng các phương pháp và công
nghệ giúp máy tính thực hiện những nhiệm vụ mà trước đây chỉ con người mới có khả năng
thực hiện được. Mục tiêu chính của trí tuệ nhân tạo là phát triển các hệ thống có khả năng
tự học, tự hiểu, và thực hiện các nhiệm vụ thông minh mà không cần sự can thiệp của con
người.

Ứng dụng của trí tuệ nhân tạo đa dạng và lan rộng sang nhiều lĩnh vực, bao gồm nhận
diện giọng nói, xử lý ngôn ngữ tự nhiên, thị giác máy tính, ô tô tự lái, dự đoán và phân tích
dữ liệu, chơi cờ với đối thủ người chơi, và nhiều lĩnh vực khác. Trong vài năm gần đây, lĩnh
vực này đã chứng kiến sự phát triển mạnh mẽ không chỉ ở các quốc gia có nền kinh tế hàng
đầu thế giới mà còn ở những quốc gia đang phát triển như Việt Nam. Sự ứng dụng của trí
tuệ nhân tạo đang ngày càng gia tăng, tạo ra những tác động tích cực trong xã hội.

Do đó, trong bài tập lớn của học phần "Nhập môn Trí tuệ nhân tạo," nhóm chúng tôi
đã quyết định chọn bài toán "Tìm đường đi trên bản đồ" với phạm vi cụ thể là phường
Nguyễn Du, Hà Nội. Chúng tôi đặt ra một số phương pháp tìm đường đi và tiến hành đánh
giá hiệu quả thông qua các thực nghiệm. Mục tiêu là áp dụng những kiến thức đã học để
giải quyết một bài toán thực tế và đánh giá khả năng ứng dụng của trí tuệ nhân tạo trong
lĩnh vực này.

Báo cáo bao gồm 7 phần chính như sau:

• Phần 1: Giới thiệu bài toán

• Phần 2: Dữ liệu bài toán

• Phần 3: Thuật toán đề xuất

• Phần 4: Xây dựng chương trình

• Phần 5: Kết quả thực nghiệm

• Phần 6: Kết luận

• Phần 7: Tài liệu tham khảo

1
1 Giới thiệu bài toán

1.1 Ý tưởng của bài toán


Bài toán tìm đường đi trên bản đồ là một bài toán phổ biến trong lĩnh vực trí tuệ
nhân tạo và được áp dụng trong nhiều lĩnh vực thực tế như điều hướng robot, định tuyến
trong mạng máy tính, giao thông vận tải, và nhiều ứng dụng khác. Bài toán yêu cầu tìm một
đường đi hợp lệ từ một điểm xuất phát đến một điểm đích trên một bản đồ hoặc đồ thị, với
mục tiêu tối thiểu hóa độ dài của đường đi. Ngoài ra, bài toán cũng có thể yêu cầu đi qua
một số điểm cụ thể trên đường đi.

Với mục đích tìm hiểu, thử nghiệm, và so sánh các thuật toán (algorithm) và kỹ thuật
(technique) khác nhau, nhóm đã lựa chọn bài toán "tìm đường đi trên bản đồ" dựa trên bản
đồ phường Nguyễn Du, Hà Nôi. Để có thể tìm đường đi một cách hiệu quả nhất, dữ liệu từ
bản đồ thật đã được xử lý trở thành một đồ thị có hướng, trọng số G “ pV, Eq , với các đỉnh
và cạnh tương ứng với từng điểm cụ thể và đường đi trên bản đồ thật. Việc tìm đường đi
giữa hai điểm trên bản đồ được chuyển thành tìm đường đi giữa các đỉnh trên đồ thị.

1.2 Biểu diễn bài toán


Báo cáo này sẽ hướng đến mục tiêu tìm kiếm các lời giải chính xác và trong khoảng
thời gian cố định. Bài toán được phát biểu như sau:

• Đầu vào: Đồ thị có hướng G “ pV, Eq, trong đó V “ pv1 , v2 , ..., vn q là tập hợp các đỉnh
trên đồ thị và E “ pvi , vj q | vi , vj P V là tập hợp các cạnh với trọng số dương wpvi , vj q
là độ dài của đường đi trực tiếp giữa hai đỉnh vi và vj trên đồ thị.

Một yêu cầu từ người sử dụng được định nghĩa bao gồm: vị trí xuất phát s, vị trí đích
d trên bản đồ và tập hợp m vị trí bắt buộc phải đi qua M “ pvi1 , vi2 , ...vim q

• Đầu ra: Hệ thống cung cấp một đường đi từ điểm xuất phát đến điểm đích trên đồ
thị sao cho đường đi này là hợp lệ, tức là nó phải bắt đầu từ điểm xuất phát, kết thúc
tại điểm đích và đi qua tất cả các điểm bắt buộc đã được chỉ định.

• Ràng buộc: Đường đi phải bắt đầu từ điểm xuất phát đã chỉ định ban đầu và phải
kết thúc tại điểm đích đã được xác định trước. Ngoài ra, đường đi phải đi qua tất cả
các vị trí bắt buộc đã được chỉ định (nếu có) mà không được bỏ qua hoặc bỏ sót bất
kỳ điểm nào trong danh sách này. Điều này đảm bảo rằng đường đi không chỉ đáp ứng
yêu cầu xuất phát và đích mà còn đảm bảo thực hiện tất cả các điểm bắt buộc đã được
xác định trước.

2
• Mục tiêu: Tối thiểu hóa độ dài đường đi và tối thiểu hóa thời gian tìm kiếm. Đối với
mục tiêu tối thiểu hóa độ dài đường đi, hệ thống hướng đến việc tìm kiếm và chọn lựa
đường đi có độ dài ngắn nhất giữa điểm xuất phát và điểm đích. Điều này đồng nghĩa
với việc giảm thiểu khoảng cách hoặc trọng số tổng cộng của các cạnh trên đường đi,
tạo ra một lộ trình tối ưu về mặt độ dài. Đối với mục tiêu tối thiểu hóa thời gian tìm
kiếm, hệ thống áp dụng các thuật toán tìm kiếm và xử lý dữ liệu hiệu quả để giảm thời
gian tìm kiếm và đưa ra kết quả trong thời gian tối thiểu

1.3 Lời giải đề xuất


Để giải quyết bài toán tìm đường đi từ điểm A đến B trên đồ thị, với ràng buộc phải
đi qua M điểm cố định pvi1 , vi2 , ...vim q được chọn trước, nhóm đề xuất một phương pháp giải
quyết toàn diện.

Lời giải của chúng tôi bao gồm hai bước chính:

• Bước 1: Sử dụng một trong những thuật toán như Floyd, Dijkstra, hoặc A* để tìm
đường đi ngắn nhất giữa tất cả các đỉnh pA, B, vi1 , vi2 , ...vim q.

• Bước 2: Thêm một đỉnh "dummy point" D sao cho chỉ có đường đi từ B đến D
và từ D đến A (một chiều) với độ dài đường đi bằng 0. Vì bài toán là đồ thị với
trọng số các cạnh dương nên đỉnh D luôn là đỉnh gần nhất với B và A là đỉnh gần D
nhất. Bài toán sau bước này trở thành bài toán TSP với yêu cầu phải đi qua các đỉnh
pD, A, B, vi1 , vi2 , ...vim q mỗi đỉnh một lần. Lời giải của bài toán TSP tương đương với
lời giải của bài toán gốc sau khi loại bỏ đỉnh D khỏi chu trình. Chúng tôi áp dụng các
thuật toán như duyệt toàn bộ, nhánh cận, hoặc giải thuật di truyền để hiệu quả giải
quyết bài toán TSP

2 Dữ liệu bài toán

2.1 Bộ dữ liệu
Nhóm sử dụng dữ liệu được lấy dựa vào OpenStreetMap (OSM). Đây là một dự án
cộng đồng toàn cầu nơi mà người dùng có thể tạo, chỉnh sửa, và chia sẻ dữ liệu địa lý miễn
phí về đường phố, tuyến đường, điểm quan trọng, biểu tượng địa lý, và nhiều thông tin khác.
Dữ liệu trên OSM có thể được sử dụng để tạo bản đồ, thực hiện phân tích địa lý, và hỗ trợ
nhiều ứng dụng khác nhau. Bộ dữ liệu lấy được ban đầu bao gồm 51 nút, mỗi nút được xác
định bằng kinh độ và vĩ độ và 100 cạnh nhưng còn chưa hoàn thiện nên nhóm đã xử lý một
vài bước trước khi đưa vào sử dụng.

3
2.2 Xử lý dữ liệu
Dữ liệu về phường Nguyễn Du, quận Hai Bà Trưng, thành phố Hà Nội được xử lý như
sau:

• Tinh chỉnh thủ công: Nhóm đã hực hiện việc tinh chỉnh lại dữ liệu bằng cách sửa
đổi hoặc điều chỉnh tọa độ các điểm, nhằm đảm bảo rằng chúng được đặt chính xác
hơn.

• Bổ sung thông tin về các đường một chiều: Lấy thêm thông tin về các đường
một chiều từ Google Maps để tích hợp vào dữ liệu Open Street Maps sẵn có. Việc này
nhằm đảm bảo rằng bộ dữ liệu phản ánh đúng hướng di chuyển của các đường phố và
tạo ra kết quả gần giống với thực tế hơn.

Nhờ việc thực hiện các bước trên, nhóm đã tiếp cận và xử lý dữ liệu từ OSM một cách cẩn
thận, từ đó tạo ra bộ dữ liệu về phường Nguyễn Du được cải thiện và gần với thực tế hơn
nâng số nút từ 51 lên 106 với tọa độ chính xác hơn và 100 cạnh lên 140 cạnh.

3 Thuật toán đề xuất


Phần này của báo cáo sẽ trình bày nội dung lý thuyết của các thuật toán được sử dụng
để giải quyết bài toán.

3.1 Thuật toán A*

3.1.1 Giới thiệu

Thuật toán A* là một thuật toán tìm kiếm đường đi trong đồ thị sử dụng cả yếu tố
đường đi ngắn nhất của thuật toán Dijkstra và thông tin heuristics để tìm kiếm đường đi tối
ưu. Thuật toán A* thường được sử dụng trong các bài toán tìm đường đi trong thực tế, như
lập kế hoạch di chuyển trong hệ thống định tuyến hoặc tìm kiếm đường đi trong trò chơi.

3.1.2 Giải thuật

Ý tưởng chung

Thuật toán A* sử dụng một hàm heuristic để ước lượng khoảng cách còn lại từ một
điểm đến điểm đích. Hàm heuristic phải thỏa mãn hai điều kiện: phải luôn nhỏ hơn hoặc
bằng khoảng cách thực tế từ điểm hiện tại đến điểm đích (sự chắc chắn) và phải có tính chất
tối ưu (không quá ước lượng).

4
Thuật toán bắt đầu bằng việc khởi tạo một hàng đợi ưu tiên (priority queue) chứa một
phần tử là điểm bắt đầu. Trong quá trình lặp, thuật toán lấy ra điểm đầu tiên từ hàng đợi,
kiểm tra xem điểm đó có phải là điểm đích hay không. Nếu đúng, thuật toán đã tìm thấy
đường đi tối ưu và kết thúc. Ngược lại, thuật toán mở rộng các nhánh con từ điểm hiện tại
và thêm chúng vào hàng đợi ưu tiên.

Giả sử có một đồ thị với các đỉnh và cạnh được định nghĩa, điểm bắt đầu là start và
điểm đích là goal. Để tìm đường đi tối ưu từ start đến goal bằng thuật toán A*, ta cần định
nghĩa các hàm sau:

• gpnq: Chi phí thực tế từ điểm ban đầu đến điểm n.

• hpnq: Ước lượng khoảng cách từ điểm n đến điểm đích bằng hàm heuristic.

• f pnq: Giá trị tổng của gpnq và hpnq.

Các bước thực hiện

1. Khởi tạo hàng đợi ưu tiên và đặt điểm bắt đầu vào hàng đợi.
2. Lặp lại cho đến khi hàng đợi trở thành rỗng hoặc tìm thấy đường đi tối ưu:
2.1. Lấy điểm đầu tiên từ hàng đợi và gán cho current.
2.2. Kiểm tra xem current có phải là điểm đích không. Nếu đúng, kết thúc thuật toán.
2.3. Mở rộng các nhánh con từ current và thêm chúng vào hàng đợi ưu tiên:
Với mỗi nhánh con child của current:
Tính toán gpchildq “ gpcurrentq ` chi phí từ current đến child.
Tính toán hpchildq “ hàm heuristic từ child đến goal.
Tính toán f pchildq “ gpchildq ` hpchildq.
Thêm child vào hàng đợi ưu tiên theo thứ tự tăng dần của f pchildq.
3. Kết thúc thuật toán nếu hàng đợi trở thành rỗng, ngụ ý rằng không có đường đi từ start đến goal.

5
Hình 1: Minh họa giải thuật A* trên đồ thị

Thuật toán A* được coi là đầy đủ vì nó sẽ tìm ra một giải pháp nếu có, miễn là không
gặp vấn đề về không gian trạng thái vô hạn và chi phí di chuyển hữu hạn. Điều này có nghĩa
là nếu có một đường đi từ điểm xuất phát đến điểm đích, A* sẽ tìm ra nó. Nếu hàm heuristic
h(n) là một ước lượng không quá lạc quan (admissible), tức là không bao giờ lớn hơn chi phí
thực tế từ n đến đích, và nếu h(n) là một hàm tăng nhanh (consistent hoặc monotonic), A*
sẽ tìm ra giải pháp tối ưu. Điều này đảm bảo rằng khi thuật toán kết thúc, đường đi tìm
thấy là ngắn nhất.

Mặc dù thuật toán A* là một trong những thuật toán tìm kiếm thông tin đường đi
hiệu quả và được sử dụng rộng rãi, nhưng nó cũng mắc phải một số vấn đề và hạn chế.

• Nếu không gian các trạng thái là hữu hạn và không thể tránh việc xét lặp, thì thuật
toán không đảm bảo được cả việc tìm được lời giải và nếu không gian trạng thái là vô
hạn, thì giải thuật không hoàn chỉnh.

• Hiệu suất của A* phụ thuộc mạnh mẽ vào chất lượng của hàm heuristic. Nếu hàm
không phù hợp, có thể dẫn đến mất mát tính tối ưu và tính toán hàm heuristic có thể
đòi hỏi nhiều nguồn lực, đặc biệt là trong các vấn đề có không gian trạng thái lớn.

• Thuật toán A* thường hiệu quả hơn đối với đồ thị rời rạc (discrete graphs) hơn là đồ
thị liên tục. Trong môi trường liên tục, việc xác định và lưu trữ các trạng thái có thể
trở nên phức tạp. Việc chọn lựa nút mở rộng có thể ảnh hưởng đến hiệu suất của thuật
toán. Một số chiến lược chọn lựa không tốt có thể làm tăng độ phức tạp thời gian và
không gian. Để đạt được hiệu suất tối ưu, cần phải điều chỉnh thủ tục của A* cho từng
vấn đề cụ thể và cập nhật thông tin heuristics một cách linh hoạt. Thuật toán A* có
thể đòi hỏi nhiều bộ nhớ và thời gian tính toán, đặc biệt là đối với không gian trạng

6
thái lớn và độ sâu lớn.

Mặc dù có những hạn chế này, A* vẫn là một trong những thuật toán tìm kiếm hiệu
quả nhất và đã được nhóm điều chỉnh, cải thiện để đáp ứng yêu cầu cụ thể của bài toán.

Một ước lượng heuristic được gọi là chấp nhận được nếu giá trị ước lượng đưa ra luôn
không âm và cũng không vượt quá chi phí thực tế. Do đó, một ước lượng chấp nhận được sẽ
không bao giờ gặp phải hiện tượng đánh giá quá cao chi phí để đi đến đích. Định lý sau đã
được chứng minh: "Nếu hpnq là đánh giá cháp nhận được thì phương pháp tìm kiếm A* sử
dụng giải thuật tìm kiếm theo cấu trúc cây". Xét hai ước lượng chấp nhận được, ước lượng
nào luôn có giá trị bằng hoặc cao hơn thì được gọi là ưu thế hoặc vượt trội hơn. Một ước
lượng được xem là kiên định nếu giá trị ước lượng cho một đỉnh không bao giờ vượt quá
tổng của chi phí thật từ đỉnh đó đến đỉnh tiếp theo và giá trị ước lượng của đỉnh tiếp theo.
Định lý sau đã được chứng minh: "Nếu hpnq là đánh giá chấp nhận được thì phương pháp
tìm kiếm A* sử dụng giải thuật tìm kiếm trên cấu trúc đồ thị là tối ưu"

3.1.3 Các hàm heuristic

Phần này sẽ trình bày các hàm heuristic được sử dụng trong thuật toán A* của báo
cáo.

3.1.4 Manhattan Distance (L1 Norm)

Manhattan Distance là tổng của các độ chênh lệch tuyệt đối giữa các thành phần tương
ứng của hai điểm trong không gian nhiều chiều. Nó còn được gọi là "đường đi thành phố"
vì nó đo khoảng cách giữa hai điểm theo các tuyến đường chạy dọc và ngang trên bản đồ đô
thị.

Công thức:
řn
dManhattan pp, qq “ i“1 |pi ´ qi |

Hàm heuristic dùng khoảng cách Manhattan là một hàm ước lượng chấp nhận được vì
đối với mọi nút n và m trong đồ thị, Manhattan distance không vượt quá chi phí thực tế từ
n đến m, nghĩa là hpnq ď cpn, mq ` hpmq, @n, m và khoảng cách Manhattan là một hàm
consistent, vì tính chất "đường đi ngắn nhất" giữa các điểm không thay đổi khi di chuyển từ
một nút đến một nút khác.

7
3.1.5 Euclidean Distance (L2 Norm)

Euclidean distance là khoảng cách Euclidean giữa hai điểm trong không gian nhiều
chiều. Nó tương ứng với chiều dài của đoạn thẳng nối hai điểm trong không gian Euclidean.

Công thức:
ařn
dEuclidean pp, qq “ i“1 ppi ´ qi q2

Hàm heuristic dùng khoảng cách Euclidean là một hàm ước lượng chấp nhận được vì
đối với mọi nút n và m trong đồ thị, Euclidean distance không vượt quá chi phí thực tế từ n
đến m, nghĩa là hpnq ď cpn, mq ` hpmq, @n, m và Euclidean distance là một hàm consistent
vì tính chất "đường đi ngắn nhất" không thay đổi khi di chuyển giữa các nút.

3.1.6 Chebyshev Distance (Infinity Norm)

Chebyshev distance là độ chênh lệch lớn nhất giữa các thành phần tương ứng của hai
điểm trong không gian nhiều chiều. Nó còn được gọi là "khoảng cách vô cực" vì nó giống
như việc sử dụng norm vô cực.

Công thức:

dChebyshev pp, qq “ maxp|p1 ´ q1 |, |p2 ´ q2 |, ..., |pn ´ qn |q

Hàm heuristic dùng khoảng cách Chebyshev là một hàm ước lượng chấp nhận được
vì đối với mọi nút n và m trong đồ thị, Chebyshev distance không vượt quá chi phí thực
tế từ n đến m, nghĩa là hpnq ď cpn, mq ` hpmq, @n, m và Chebyshev distance là một hàm
consistent vì nó không vượt quá chi phí thực tế giữa các nút.

3.2 Thuật toán Dijkstra

3.2.1 Giới thiệu

Thuật toán Dijkstra là một thuật toán tìm đường đi ngắn nhất từ một đỉnh xuất phát
đến tất cả các đỉnh còn lại trong một đồ thị có trọng số không âm. Nó được phát triển bởi
nhà toán học Edsger W. Dijkstra vào năm 1956. Thuật toán này có ứng dụng rộng rãi trong
nhiều lĩnh vực như mạng máy tính, định tuyến giao thông, quy hoạch tuyến đường và nhiều
lĩnh vực khác. Trong bài toán tìm đường đi trên bản đồ, thuật toán Dijkstra có thể được áp
dụng để tìm đường đi ngắn nhất giữa các nút.

3.2.2 Giải thuật

Ý tưởng chung

8
Thuật toán hoạt động bằng cách duyệt qua các đỉnh của đồ thị từ đỉnh xuất phát và
cập nhật các đường đi ngắn nhất đến các đỉnh kề. Thuật toán tiếp tục lựa chọn đỉnh có
đường đi ngắn nhất chưa được xác định và tiếp tục quá trình cập nhật cho đến khi tất cả
các đỉnh đã được xét. Cụ thể:

Giả sử có một đồ thị với các đỉnh và cạnh được định nghĩa, điểm xuất phát là start.
Để tìm đường đi ngắn nhất từ start đến tất cả các đỉnh còn lại trong đồ thị bằng thuật toán
Dijkstra, ta cần định nghĩa các hàm sau:

• distpvq: Đường đi ngắn nhất từ start đến đỉnh v.

• visitedpvq: Trạng thái xác định xem đỉnh v đã được xét hay chưa.

Các bước thực hiện

1. Khởi tạo distpvq với giá trị vô cùng cho tất cả các đỉnh, trừ start với distpstartq “ 0.
2. Lặp lại cho đến khi tất cả các đỉnh đã được xét:
2.1. Tìm đỉnh chưa được xét u có distpuq nhỏ nhất.
2.2. Đánh dấu u là đã xét.
2.3. Duyệt qua tất cả các đỉnh kề v của u:
Nếu distpuq ` trọng số cạnh pu, vq ă distpvq, cập nhật distpvq “ distpuq ` trọng số cạnh pu, vq.
3. Kết thúc thuật toán.

Hình 2: Minh họa giải thuật Dijkstra trên đồ thị

Giải thuật Dijkstra dừng khi tìm ra đường đi ngắn nhất từ điểm xuất phát đến các
đỉnh còn lại vì vậy thuật toán sẽ đảm bảo tính đầy đủ. Tuy nhiên giải thuật Dijkstra yêu
cầu đồ thị có trọng số không âm, nghĩa là các cạnh của đồ thị có giá trị trọng số không âm,
khiến cho Dijkstra chỉ áp dụng cho một số bài toán nhất định. Ví dụ, giả sử có một đỉnh

9
đích mà có đường đi ngắn nhất là một đoạn đường đi qua một đỉnh có chi phí âm. Dijkstra
có thể dừng lại tại đỉnh này vì nó không xử lý được trọng số âm và nghĩ rằng đó là một giải
pháp tối ưu. Điều này có thể khiến thuật toán không kiểm tra toàn bộ không gian tìm kiếm,
không đảm bảo độ đầy đủ. Để xử lý đồ thị có trọng số âm và đảm bảo độ đầy đủ, người ta
thường sử dụng thuật toán Bellman-Ford. Tuy nhiên, thuật toán này có độ phức tạp thời
gian cao hơn, đặc biệt là trên các đồ thị lớn. Bài toán của nhóm thỏa mãn điều kiện các
cạnh có trọng số dương của thuật toán nhưng khi mở rộng bài toán thuật toánscó thể trở
nên chậm khi đối mặt với đồ thị lớn vì nó phải duyệt qua tất cả các đỉnh và cạnh.

3.3 Thuật toán Floyd

3.3.1 Giới thiệu

Thuật toán Floyd, còn được gọi là thuật toán Floyd-Warshall, là một thuật toán được
sử dụng để tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh trong đồ thị có hướng hoặc vô
hướng. Thuật toán này được đặt theo tên của hai nhà toán học Robert Floyd và Stephen
Warshall, người đề xuất thuật toán này vào năm 1962.

3.3.2 Giải thuật

Ý tưởng chung

Khi xem xét một cặp đỉnh u và v, thuật toán tìm kiếm sự tồn tại của một đỉnh trung
gian k sao cho đường đi từ u đến v thông qua k là ngắn nhất. Nếu tìm thấy, thuật toán sẽ
cập nhật ma trận khoảng cách lưu trữ giá trị khoảng cách ngắn hơn đó. Cụ thể:

Giả sử có một đồ thị với các đỉnh và cạnh được định nghĩa. Để tìm đường đi ngắn
nhất giữa tất cả các cặp đỉnh trong đồ thị bằng thuật toán Floyd, ta cần định nghĩa ma trận
khoảng cách D.

Ban đầu, ma trận khoảng cách D được khởi tạo như sau:

$

&trọng số của cạnh pi, jq, nếu i và j kề nhau.
Drisrjs “
%8,
’ ngược lại.

10
Các bước thực hiện

1. Khởi tạo ma trận khoảng cách D ban đầu.


2. Lặp lại cho đến khi không còn thay đổi:
2.1. Duyệt qua tất cả các cặp đỉnh pi, jq và đỉnh k:
2.1.1. Nếu Drisrks ` Drksrjs ă Drisrjs, cập nhật Drisrjs “ Drisrks ` Drksrjs.
3. Kết thúc thuật toán.

Hình 3: Minh họa giải thuật Floyd trên đồ thị

Giải thuật Floyd có thể áp dụng cho đồ thị có trọng số với giá trị dương hoặc âm
(nhưng không có chu trình âm). Giải thuật có ưu điểm tìm đường đi ngắn nhất giữa tất cả
các cặp đỉnh, tuy nhiên độ phức tạp thời gian của giải thuật là lớn hơn rất nhiều so với
Dijkstra hay A*, do vậy thuật toán chỉ có thể áp dụng vào các đồ thị nhỏ hay các đồ thị với
số đỉnh ít.

3.4 Thuật toán di truyền

3.4.1 Giới thiệu

Giải thuật di truyền là một phương pháp tối ưu hóa được lấy cảm hứng từ quá trình
tiến hóa trong tự nhiên. Quá trình này dựa trên các nguyên tắc của lý thuyết tiến hóa Darwin
về sự chọn lọc tự nhiên và sự thích nghi của các cá thể với môi trường của chúng.

Giải thuật di truyền được sử dụng rộng rãi trong lĩnh vực tối ưu hóa, tìm kiếm, và máy
học để tìm ra giải pháp tương đối tốt cho các bài toán phức tạp.

11
3.4.2 Ý tưởng chung

Ý tưởng chính của giải thuật di truyền là tạo ra một quần thể gồm nhiều cá thể, mỗi
cá thể biểu diễn một giải pháp tiềm năng cho vấn đề cần giải quyết. Các cá thể này thường
được tạo ngẫu nhiên ban đầu hoặc thông qua một quy tắc xác định.

Tiếp theo, quá trình tiến hóa chạy qua một số lượng vòng lặp, gọi là thế hệ. Trong mỗi
thế hệ, các cá thể được đánh giá dựa trên một hoặc nhiều hàm mục tiêu tùy vào từng bài
toán cụ thể để xác định mức độ tốt của lời giải mà chúng đại diện.

Dựa trên đánh giá này, các cá thể được chọn có khả năng được chọn để sinh sản và
cung cấp gen cho thế hệ kế tiếp. Quá trình này được gọi là chọn lọc, nơi các cá thể được
đánh giá là tốt hơn có cơ hội lớn hơn để tồn tại qua thế hệ tiếp theo.

Ngoài việc chọn lọc, giải thuật di truyền sử dụng các phép toán di truyền như lai ghép
(crossover) và đột biến (mutation) để tạo ra sự đa dạng gen trong quần thể. Lai ghép kết
hợp các gen từ các cá thể cha mẹ để tạo ra cá thể con mới có sự kết hợp giữa các đặc điểm
tốt từ hai cá thể cha mẹ. Đột biến là quá trình thay đổi ngẫu nhiên một số gen trong cá thể
để đưa ra những giải pháp tiềm năng mới, giúp bài toán hạn chế khả năng rơi vào tối ưu cục
bộ.

Quá trình lặp lại giữa các thế hệ cho đến khi đạt được điều kiện dừng, chẳng hạn như
số lượng thế hệ tối đa, chất lượng lời giải không còn sự tiến hóa qua nhiều thế hệ hoặc đạt
giới hạn thời gian cho phép.

12
Hình 4: Sơ đồ luồng của thuật toán di truyền

Giải thuật di truyền là một công cụ mạnh mẽ và linh hoạt trong việc tìm kiếm và tối
ưu hóa. Nó có thể áp dụng cho nhiều lĩnh vực khác nhau và có thể được tùy chỉnh để phù
hợp với các yêu cầu cụ thể của mỗi vấn đề.

3.5 Thuật toán Nhánh cận

3.5.1 Giới thiệu

Thuật toán Nhánh cận (Branch and Bound) là một phương pháp tìm kiếm và giải
quyết tối ưu trong các vấn đề tối ưu hóa và tìm kiếm toàn diện. Thuật toán này dựa trên
nguyên tắc chia nhỏ vấn đề ban đầu thành các phần nhỏ hơn (nhánh) và loại bỏ những phần
nhỏ không tiềm năng (cận) để tìm ra giải pháp tốt nhất.

13
3.5.2 Ý tưởng chung

Ý tưởng chính của thuật toán Nhánh cận là sử dụng một cây tìm kiếm để liệt kê và
kiểm tra tất cả các giải pháp có thể. Cây tìm kiếm bắt đầu với một nút gốc, biểu diễn giải
pháp ban đầu, và mở rộng từng nhánh con từ nút gốc để tạo ra các giải pháp tiềm năng
khác.

Trong quá trình mở rộng các nhánh con, thuật toán sử dụng một hàm giới hạn (bound-
ing function) để đánh giá giới hạn tối ưu của mỗi nhánh. Hàm giới hạn được sử dụng để ước
lượng giá trị tối ưu của một nhánh con dựa trên thông tin hiện có và các ràng buộc của vấn
đề. Nếu giới hạn của một nhánh con nhỏ hơn giá trị tốt nhất hiện tại, nhánh con đó sẽ không
được tiếp tục mở rộng và thay vào đó thuật toán chuyển sang nhánh khác.

Quá trình mở rộng và cắt tỉa cây tìm kiếm tiếp tục cho đến khi tất cả các nhánh đã
được duyệt hoặc không còn nhánh nào có thể cải thiện giá trị tối ưu hiện tại. Kết quả là
thuật toán sẽ tìm ra giải pháp tối ưu hoặc xác định rằng không có giải pháp tối ưu nào tồn
tại.

Thuật toán Nhánh cận thường được sử dụng trong các vấn đề tối ưu hóa, như tìm kiếm
đường đi ngắn nhất, tìm kiếm cây bao trùm nhỏ nhất, hoặc tối ưu hóa các vấn đề lập trình
nguyên. Nó giúp giảm thiểu số lượng giải pháp cần xem xét và tìm ra giải pháp tối ưu một
cách hiệu quả.

Hình 5: Minh họa giải thuật Branch and Bound

3.6 So sánh các thuật toán

14
Tiêu Chí Dijkstra Floyd A*
Phụ thuộc vào triển
OppV ` Eq log V q OpV 3 q
Độ Phức Tạp Thời Gian khai và hàm heuristic
hoặc OpV 2 q
OpV ` Eq OpV 2 q Phụ thuộc vào triển khai
Độ Phức Tạp Không Gian
hoặc OpV 2 q
Kích thước đồ thị tối đa V, E ď 300K V ď 400 V ď 1000

Bảng 1: So sánh các thuật toán: Dijkstra, Floyd-Warshall và A*

4 Xây dựng chương trình

4.1 Ngôn ngữ lập trình


Nhóm sử dụng JavaScript là ngôn ngữ lập trình chính. Đây là một ngôn ngữ lập trình
phổ biến, thường được sử dụng để phát triển ứng dụng web động có tính tương tác bằng việc
phản hồi tương tác của người dùng và thay đổi bố cục của nội dung trên trang web.

Ngôn ngữ này có những ưu điểm:

• Ngôn Ngữ Chạy Ở Phía Client: JavaScript thường được thực thi ở phía client,
nghĩa là trực tiếp trên trình duyệt web của người dùng. Điều này giúp tăng tính tương
tác và tính động cho trang web mà không cần tải lại trang.

• Đa Nền Tảng: Ngôn ngữ này không phụ thuộc vào hệ điều hành cụ thể, điều này có
nghĩa là mã nguồn JavaScript có thể chạy trên nhiều loại trình duyệt khác nhau như
Chrome, Firefox, Safari, và Edge.

• HTML kết hợp CSS: JavaScript thường được sử dụng cùng với HTML và CSS để tạo
ra trang web đầy đủ chức năng và mỹ quan. Nó có khả năng thao tác DOM (Document
Object Model) để thay đổi cấu trúc và nội dung của trang web.

• Đa nhiệm: JavaScript làm cho trang web trở nên động động bằng cách xử lý sự kiện
người dùng như click chuột, di chuyển chuột, và nhập liệu từ bàn phím. Điều này giúp
tạo ra trải nghiệm người dùng mượt mà và phong phú hơn.

4.2 Giao diện bản đồ


Giao diện bản đồ được biểu diễn thông qua Leaflet - một thư viện JavaScript mã nguồn
mở được sử dụng để tạo và hiển thị bản đồ tương tác trên các trang web. Với thiết kế nhẹ
nhàng, dễ sử dụng và linh hoạt, Leaflet là lựa chọn phổ biến cho việc tích hợp bản đồ vào
các ứng dụng web và dự án phát triển.

15
Hình 6: Giao diện bản đồ với hiển thị đường bao phường Nguyễn Du

Cụ thể, trên thanh điều hướng sẽ bao gồm các tùy chọn:

• Map: hiển thị đường bao và các điểm của đồ thị

• Mandatory point: lựa chọn số điểm bắt buộc cần đi qua trên đường đi

• Algorithm: lựa chọn thuật toán thực hiện

Hình 7: Giao diện thanh điều hướng của bản đồ

Sau khi thực hiện tìm đường, các thông số: độ dài đường đi - distance, thời gian thực thi -
time và đường đi - path sẽ được thể hiện tương ứng ở thanh kết quả:

Hình 8: Thanh kết quả

5 Kết quả thực nghiệm


Phần này của báo cáo sẽ tiến hành so sánh độ hiệu quả của các thuật toán đề xuất,
bao gồm độ dài đường đi ngắn nhất và thời gian ra kết quả đó. Hai kịch bản chính bao gổm
tìm khoảng cách gần nhất của 2 điểm trên bản đồ không yêu cầu rằng buộc phải đi qua các
điểm cố định và có rằng bược phải đi qua các điểm cố định chọn trước. Mỗi thuật toán được
chạy 10 lần ứng với từng kịch bản để tính thời gian ra kết quả trung bình.

16
5.1 Đánh giá các thuật toán khi không sử dụng ràng buộc

Ở kịch bản này, nhóm chọn ngẫu nhiên từng cặp 2 điểm bất kỳ trên bản đồ phường
Nguyễn Du rồi tính toán các thông số về thời gian chạy và khoảng cách.

Đầu tiên nhóm sẽ so sánh kiểm tra kết quả với giải thuật A* với các hàm heuristic
khác nhau.
Hàm heuristic Thời gian Khoảng cách
Manhattan Distance 2.7 ms 1.13 km
Euclidean Distance 4.2 ms 1.13 km
Chebyshev Distance 3.6 ms 1.13 km

Bảng 2: Thời gian thực hiện và khoảng cách ngắn nhất giữa các hàm heuristic

Nhận xét: Các hàm heuristic khác nhau đều đưa ra được cùng đường đi tối ưu, điều
này có thể do số lượng đỉnh và cạnh của đồ thị vẫn còn nhỏ. Thời gian thực hiện của thuật
toán với hàm heuristic dùng Manhattan Distance là nhanh nhất, rồi đến Chebyshev Distance,
cuối cùng là Euclidean Distance. Điều này có thể lý giải được là do Manhattan distance là
tổng của các độ chênh lệch tuyệt đối giữa các thành phần tương ứng của hai điểm trong
không gian nhiều chiều, nó còn được gọi là "đường đi thành phố" vì nó đo khoảng cách giữa
hai điểm theo các tuyến đường chạy dọc và ngang trên bản đồ đồ thị. Do đó hàm heuristic
sử dụng Manhattan distance là tối ưu nhất. Do bản đồ chủ yếu là con đường song song với
nhau nên việc ước lượng theo cạnh (Chebyshev Distance) sẽ đưa ra kết quả tốt hơn là việc
ước lượng theo đường chéo (Euclidean Distance).

Vì hàm heuristic sử dụng Manhattan Distance vượt trội hơn các hàm heuristic còn lại
nên từ giờ trong báo cáo, khi nhóm nói đến thuật toán A* tức là thuật toán A* sử dụng
Manhattan Distance làm hàm heuristic.

So sánh các giải thuật A*, Dijkstra và Floyd-Warshall

Giải thuật Thời gian Khoảng cách


A* 1.5 ms 1.13 km
Dijkstra 2.3 ms 1.13 km
Floyd-Warshall 6.4 ms 1.13 km

Bảng 3: Thời gian thực hiện và khoảng cách ngắn nhất giữa các giải thuật

Nhận xét: Các thuật toàn đều đưa ra cùng một lời giải tương tự nhau thể hiện với
một không gian tìm kiếm không đủ to thì các giải tuật sử dụng đều có thể đưa ra lời giải tối
ưu. Thời gian thực thi của thuật toán A* là nhanh nhất rồi đến Dijkstar và Floyd có thời
gian thực thi lâu nhất. Điều này thể hiện ở việc hàm heuristic của A* dùng khoảng cách

17
Manhattan chuyên dùng để đo khoảng cách trong thành phố với các con đường chạy song
song và vuông góc nhau. Floyd-Warshall là một thuật toán chính xác tuy nhiên độ phức tạp
thời gian của nó là OpV 3 q, làm cho nó chưa mang lại hiệu quả như Dijkstra trong bài toán
này

5.2 Đánh giá các thuật toán khi sử dụng ràng buộc
Trong kịch bản này nhóm sẽ đánh giá kết quả thực nghiệm trên 4 kịch bản phụ với
rằng buộc phải đi qua 1, 3, 6, 9 điểm được lấy cố định với mỗi kịch bản. Nhóm chỉ thay đổi
2 điểm bắt đầu và kết thúc để tiến hành thực nghiệm và lấy kết quả. Tương tự như trên,
mỗi kịch bản phụ nhóm đều cho chạy 10 lần với mỗi cặp giải thuật agorithm1 và agorithm2.

5.2.1 Kịch bản 1

Đường đi phải đi qua 1 điểm cố định đã được chọn trước

Giải thuật 1 Giải thuật 2 Thời gian Khoảng cách


A* Complete 2.3 ms 1.7 km
A* BnB 2.1 ms 1.7 km
A* GA 21.6 ms 1.7 km
Dijkstra Complete 2.5 ms 1.7 km
Dijkstra BnB 2.3 ms 1.7 km
Dijkstra GA 23.7 ms 1.7 km
Floyd-Warshall Complete 7.3 ms 1.7 km
Floyd-Warshall BnB 6.7 ms 1.7 km
Floyd-Warshall GA 27.6 ms 1.7 km

Bảng 4: Thời gian thực hiện và khoảng cách ngắn nhất giữa các giải thuật

18
5.2.2 Kịch bản 2

Đường đi phải đi qua 3 điểm cố định đã được chọn trước

Giải thuật 1 Giải thuật 2 Thời gian Khoảng cách


A* Complete 3.2 ms 3.1 km
A* BnB 2.4 ms 3.1 km
A* GA 24.6 ms 3.1 km
Dijkstra Complete 3.9 ms 3.1 km
Dijkstra BnB 2.6 ms 3.1 km
Dijkstra GA 26.7 ms 3.1 km
Floyd-Warshall Complete 8.1 ms 3.1 km
Floyd-Warshall BnB 7.4 ms 3.1 km
Floyd-Warshall GA 39.8 ms 3.1 km

Bảng 5: Thời gian thực hiện và khoảng cách ngắn nhất giữa các giải thuật

5.2.3 Kịch bản 3

Đường đi phải đi qua 6 điểm cố định đã được chọn trước

Giải thuật 1 Giải thuật 2 Thời gian Khoảng cách


A* Complete 5.6 ms 3.4 km
A* BnB 3.2 ms 3.4 km
A* GA 27.5 ms 3.4km
Dijkstra Complete 5.7 ms 3.4 km
Dijkstra BnB 3.5 ms 3.4 km
Dijkstra GA 26.7 ms 3.4 km
Floyd-Warshall Complete 21.2 ms 3.4 km
Floyd-Warshall BnB 14.5 ms 3.4 km
Floyd-Warshall GA 57.6 ms 3.4 km

Bảng 6: Thời gian thực hiện và khoảng cách ngắn nhất giữa các giải thuật

19
5.2.4 Kịch bản 4

Đường đi phải đi qua 9 điểm cố định đã được chọn trước

Giải thuật 1 Giải thuật 2 Thời gian Khoảng cách


A* Complete 6610 ms 4.3 km
A* BnB 32.1 ms 4.3 km
A* GA 54 ms 4.3km
Dijkstra Complete 6475 ms 4.3 km
Dijkstra BnB 31.4 ms 4.3 km
Dijkstra GA 53 ms 4.3 km
Floyd-Warshall Complete 6862 ms 4.3 km
Floyd-Warshall BnB 31 ms 4.3km
Floyd-Warshall GA 60 ms 4.3 km

Bảng 7: Thời gian thực hiện và khoảng cách ngắn nhất giữa các giải thuật

Nhận xét: Các thuật toán đều đưa ra cùng một lời giải tương tự nhau trong các kịch
bản điều này đã được lý giải do số lượng đỉnh và điểm của bài toán nhỏ. Với những kịch
bản với số lượng điểm rằng buộc bắt buộc phải đi qua ít như 1,3 , như đã giải thích ở kịch
bản trên, thuật toán A* với heuristic tối ưu đưa ra kết quả tốt nhất và Floyd-Warshall vẫn
có kết quả tệ nhất. Với số lượng điểm ít thuật toán BnB (Nhánh cận) đưa ra kết quả tốt
nhất vì nó phải duyệt ít đỉnh hơn thuật toán Complete (Duyệt toàn bộ). GA (Thuật toán
tiến hóa) đưa ra kết quả chậm hơn các thuất toán còn lại nhiều lần. Đối với những kịch bản
với số lượng điểm rằng buộc bắt buộc phải đi qua lớn như 6,9 sự ảnh hưởng của các thuật
toán dùng để giải trong bước 1 : A*, Dijkstra, Floyd với thời gian thực hiện không có sự ảnh
hưởng đáng kể. Khi này thời gian thực hiện của thuật toán phần lớn phụ thuộc vào thời gian
giải bài toán TSP. Khi này phương pháp duyệt toàn bộ không thể đưa ra được lời giải trong
thời gian ngắn do phải duyệt quá nhiều lần. Giải thuật GA và BnB có thời gian tìm kiếm lời
giải ngắn hơn rất nhiều, BnB có sự thể hiện gần như tốt gấp đôi so với giải thuât GA nhờ
cắt bỏ đi những nhánh thừa làm tăng tốc độ tìm kiếm.

6 Kết luận
Trong báo cáo này, nhóm đã nghiên cứu bài toán tìm đường đi trên đồ thị và áp dụng
các thuật toán để giải quyết vấn đề này. Không chỉ đơn giản áp dụng các thuật toán tìm
đường đi trên đồ thị, chúng tôi đã bổ sung ràng buộc về điểm phải đi qua ngoài hai điểm
đầu cuối. Điều này có thể mở rộng ứng dụng của bài toán, đặc biệt là trong các tình huống
thực tế như tìm đường đi trong mạng giao thông hoặc lập kế hoạch di chuyển trong hệ thống
định tuyến.

20
Trong quá trình thực hiện, nhóm đã gặp các khó khăn như lấy dữ liệu của bản đồ, thao
tác với ngôn ngữ JavaScrip, quá trình tối ưu mất nhiều thời gian, phải tìm hiểu, tham khảo
cách dùng các cấu trúc dữ liệu trên mạng để chương trình chạy nhanh hơn. Tương lai nhóm
mong muốn có thể nghiên cứu bổ sung thêm các ràng buộc và cải thiện các tính năng tương
tác để giúp người sử dụng có trải nghiệm tốt hơn.

Tổng kết lại, bài toán tìm đường đi trên đồ thị là một chủ đề quan trọng trong lĩnh
vực Trí tuệ nhân tạo, và có nhiều thuật toán hiệu quả để giải quyết. Bằng cách bổ sung ràng
buộc và áp dụng các thuật toán mới, chúng ta có thể mở rộng khả năng ứng dụng và tìm ra
giải pháp cho các vấn đề tìm đường đi trong thực tế. Các phương pháp này đóng góp vào
việc cải thiện hiệu suất tìm kiếm đường đi và tối ưu hóa các tiêu chí như thời gian, khoảng
cách và sự ổn định, mang lại lợi ích thiết thực trong các bối cảnh thực tế.

Để hoàn thành được báo cáo này, nhóm chúng em xin gửi lời cảm ơn sâu sắc đến PGS.
TS. Trần Đình Khang vì những bài giảng tuyệt vời và đáng quý của thầy ở môn "Nhập môn
Trí tuệ nhân tạo".

21
7 Tài liệu tham khảo
[1] Bài giảng môn "Nhập môn Trí tuệ nhân tạo" PGS.TS. Lê Thanh Hương, Trường
Công nghệ thông tin và Truyền thông, Đại Học Bách Khoa Hà Nội

[2] https://vnoi.info/wiki/algo/graph-theory/shortest-path.md

[3] Stuart J. Russell and Peter Norvig: Artificial Intelligence: A Modern Approach

[4] https://wiki.openstreetmap.org

[5] Competitve programming 3 - Steven Halim, Felix Halim

[6] Handbook Competitive Programming - Antti Laaksonen

22

You might also like