BO GIAO DUC VA DAO TAO
TRUONG DAI HOC DAI NAM
ĐẠI NAM UNIVERSITY
BÀI TẬP LỚN
TÊN HỌC PHẦN: TRÍ TUỆ NHÂN TẠO ĐỀ TÀI: Tìm đường ngắn nhất
Giáo viên hướng dẫn: TS BÙI HẢI PHONG
Sinh viên thực hiện:
Stt Ma sv Ho va tén Lớp 1 1571020173 Hồng Cơng Minh | CNTT 15-05 2 1571020280 Nguyễn Văn CNTT 15-05 Thuận 3 1571020104 Lại Việt Hoàng CNTT 15-05 4 1571020053 Lê Mạnh Đạt CNTT 15-05 5 1571020043 Lé Minh Duong CNTT 15-05
Ha Noi, nam 2022
Trang 2
BO GIAO DUC VA DAO TAO TRUONG DAI HOC DAI NAM
ĐẠI NAM
UNTVWVER SI TY
BAI TAP LON
Trang 3Ha Noi, nam 2022
Trang 4
Loi Cam On
Đầu tiên, em xin gửi lời cảm ơn đến Ban Giám hiệu trường Đại học
Đại Nam đã tạo cho em môi trường tốt để em có thể học tập và tiếp thu được những kiến thức quý báu trong những năm qua Em xin gửi lời cảm ơn sâu sắc đến Thầy giáo Bùi Hải Phong đã nhiệt tình hướng dẫn, định hướng, hỗ trợ em trong suốt quá trình thực hiện luận văn, giúp đỡ em tiếp cận với cách tư duy, giải quyết và trình bày một vấn đề cần nghiên cứu Những điều này đã giúp em khắc phục được những hạn chế của bản thân và những khó khăn để hoàn thành luận văn thành công, đúng thời hạn
Từ lâu con người đã có suy nghĩ muốn tạo ra một cỗ máy có thể tự
suy nghĩ và hành động Chính vì thế, trí tuệ nhân tạo (AI) trở thành một
một lĩnh vực mới trong thời đại công nghệ thông tin ngày nay Các ngành nghề trong xã hội đang có xu hướng xử dụng AI để khiến máy móc thông minh hơn Trong giải trí, trong y tế, hay cả trong giáo dục, rất nhiều robot thông minh được tạo ra có thể thay thế con người dạy học, giúp đỡ người
già, thực hiện các công đoạn trong cơng nghiệp, VÌ những ứng dụng hữu
ích của nó, nhóm em chọn đề tài “Tìm đường ngắn nhất'' dựa trên các thuật toán cơ bản hay dùng trong trí tuệ nhân tạo Mong muốn thông qua game này, em sẽ có những cái nhìn cụ thể về đề tài AI, từ đó mở rộng để nghiên cứu và phát triển thêm
Mặc dù em đã cố gắng hoàn thành luận văn bằng tất cả sự nỗ lực và khả năng của mình, nhưng chắc chắn vẫn còn nhiều hạn chế và thiếu sót Em mong nhận được sự cảm thông và góp ý quý giá từ các thầy cô và các
Trang 5Muc luc LOT CAM OD I OE nnn i eeeer ies 3 Phần I: Tổng QUAN ccccccccccccccccceccccessseseesscseeeeeeeeeeeseceseeeuesesesesssseeeeeeenegs 5 ái 1 ng .ằằ ằ a ắa 5 2 Lý do chọn đề tài SH HT HH Ha 5 3 Mục tiêu và đối tượng phạm vi nghiên cCứu -.‹ccccccccccs: 6
Phần II: Phân tích bài toán tt nền nền ng ghe no 7
1 Yêu cầu bài tOán ii nh nh Tnhh HH tk ra 7
2 Phân tích yêu CầU cuc TH nn TT nh n nào 7
3 Phương pháp giải QUYẾT nh ngn ng ko 7
4 Phân tích và lựa chọn thuật toán cuc nh nhe nhe 7
Tổng quan thuật toán DijkSfra 0221111 1nn nghe nghe 8
1 Ví dụ về thuật toán ccnnnH HH nnn ng nen ngu 8 2 Đoạn giả mã cho thuật toán ccccnnnn nh nh nho 12 Phần III: Cài đặt chương trÌnh cv 1c n kg nho 13 1 Tạo không gian ‹ con n ng T ng TT HH TK rro 13 2 Tạo các chướng ngoại VẬT nh n nhe 13 3 Sử dụng thuật toán cuc ng nh Tnhh Heo 14 4 Cách vượt qua chướng ngoại VẬT cho 16 Phần IV: Kết quả chương trÌnh tt 1n n1 nnn nghe 17 ôn na 17
"»"‹ä 17
Trang 6
Phần I: Tổng quan
1 Lý thuyết
1 Khái niệm trí tuệ nhân tạo - Trí tuệ nhân tạo là trí thông minh của máy do con người tạo ra Ngay từ khi chiếc máy tính điện tử đầu tiên ra đời, các nhà khoa học máy tính đã hướng đến phát hiển hệ
thống máy tính (gồm cả phần cứng và phần mềm) sao cho nó có khả
năng thông minh như loài người 2 Ứng dụng của trí tuệ nhân tạo
- Ứng dụng trong sản xuất Trí tuệ nhân tạo còn được ứng dụng để xây dựng những quy trình sản xuất tối ưu hơn Công nghệ AI còn có khả năng phân tích cao, làm cơ sở định hướng cho khả năng ra quyết định trong sản xuất
- Ứng dụng trong y tế Ứng dụng tiêu biểu của trí tuệ nhân tạo trong lĩnh vực y tế đó chính là máy bay thiết bị bay không cần người lái được sử dụng trong những trường hợp cứu hộ khẩn cấp Thiết bị bay không người lái có thể đạt được tốc độ nhanh hơn xe chuyên dụng đến 40% và cực kì thích hợp để sử dụng ở những nơi có địa hình hiểm trở
Trang 72 Ly do chon dé tai
Tìm đường đi ngắn nhất là một trong những yêu cầu rất phổ
biến trong cuộc sống, đặc biệt là trong giới học sinh, sinh viên Đây cũng là một trò chơi mà em rất thích, chính vì vậy chúng em đã chọn đề tài “Tìm đường ngắn nhất cho môn Trí tuệ nhân tạo Trong quá trình hoàn thành đề tài này, chúng em đã tìm hiểu được các thuật toán đã được học trong môn Trí tuệ nhân tạo như thuật toán tìm kiếm đường ởi Dijkstra, giải thuật Dijkstra, cũng như kỹ năng lập trình ngôn ngữ C
3 Mục tiêu và đối tượng phạm vi nghiên cứu
- Mục tiêu: Tìm hiểu định nghĩa, ứng dụng của trí tuệ nhân tạo Tìm hiểu cấu trúc, các thuật toán và cách hoạt động của AI
Ý nghĩa khoa học và thực tiễn - Ý nghĩa khoa học: Tìm hiểu về các
thuật toán được sử dụng trong môn học trí tuệ nhân tạo Có được nền tảng để mở rộng phạm vi nghiên cứu ở những mặt ứng dụng khác của trí tuệ nhân tạo - Thực tiễn: Tìm đường ngắn nhất phục vụ việc đi lại và nâng cao khả năng lập trình
Trang 8
Phần II: Phân tích bài toán
1 Yêu cầu bài toán / ;
Xây dựng giao diện có kích thước tùy ý, có điểm đầu và điểm cuối
để thực hiện quá trình tìm đường đi từ điểm đầu đến điểm cuối Trong quá trình tìm đường có các chướng ngại vật ngăn cảm, yêu cầu tìm đường đi tránh các ngoại vật và ngắn nhất để đi đến điểm cuối Chắc chăn phải tìm được 1 con đường thì đạt yêu cầu bài toán
2 Phân tích yêu cầu ;
Mơ phỏng mơi trường ngồi đời thật thực hiện yêu cầu tìm đường di ngắn nhất giúp khách hàng có thể đến nơi nhanh nhất trong khoảng thời gian ngắn nhất
3 Phương pháp giải quyết ;
Xuất phát từ điểm đích ban đầu, sau đó thực hiện quá trình tìm kiếm
xung quanh, nếu phát hiện chướng ngoại vật thì sẽ chuyển hướng tìm kiếm con đường khác
Sau khi tìm kiếm phát hiện điểm cuối thì tạo ra con đường không có chướng ngoại vật và ngắn nhất
4 Phân tích và lựa chọn thuật toán ;
Thuật toán Dijkstra cho phép tìm đường đi ngắn nhất từ một đỉnh s
đến các đỉnh còn lại của đồ thị và chiều dài (trọng số) tương ứng _
Phương pháp của thuật toán là xác định tuần tự đỉnh có chiều dài đến s theo thứ tự tăng dần Thuật toán được xây dựng trên cơ sở gán cho mỗi đỉnh các nhãn tạm thời
Ý tưởng cơ bản của thuật toán như sau:
Bước 1: Từ đỉnh gốc, khởi tạo khoảng cách tới chính nó là 00, khởi tạo
khoảng cách nhỏ nhất ban đầu tới các đỉnh khác là +œ+œ Ta được
danh sách các khoảng cách tới các đỉnh
Bước 2: Chọn đỉnh a có khoảng cách nhỏ nhất trong danh sách này và ghi
nhận Các lần sau sẽ không xét tới đỉnh này nữa
Bước 3: Lần lượt xét các đỉnh ké b của đỉnh a Nếu khoảng cách từ đỉnh
gốc tới đỉnh b nhỏ hơn khoảng cách hiện tại đang được ghi nhận thì cập nhật giá trị và đỉnh kể a vào khoảng cách hiện tại của b
Bước 4: Sau khi xét tất cả đỉnh kể b của đỉnh a Lúc này ta được danh sách
khoảng cách tới các điểm đã được cập nhật Quay lại Bước 2 với danh sách
Trang 9Tổng quan thuật toán Dijkstra
Graph (đồ thị): Đồ thị là một cấu trúc dữ liệu phi tuyến tính được định nghĩa là G = (V, E), trong V là tập hợp hữu hạn các đỉnh (node), E là tập hợp hữu hạn các cạnh, cạnh là một đường nối giữa hai node với nhau
Weighted graph (đồ thị có trọng số): Tương tự như đồ thị ở trên, chỉ khác là mỗi cạnh sẽ được gán thêm một trọng số Kiểu như cùng một khoảng cách đi từ A đến B, nhưng đi đường đẹp thì nhanh hơn, đường làng nhiều ổ gà thì chậm hơn
Connected graph (đồ thị liên thông): Một đồ thị được gọi là liên thông (connected) nếu có đường đi giữa mọi cặp đỉnh phân biệt của đồ thị Ngược lại, đồ thị này được gọi là không liên thông
Spamning tree (cây khung): một spanning tree của đồ thị G là cây con
của đồ thị G, chứa tất cả các đỉnh của G Nói cách khác, cây bao trùm
Trang 132 Doan gia ma cho thuat toan
Chúng ta cần duy trì khoảng cách đường đi của mỗi đỉnh Chúng ta
có thể lưu trữ nó trong một mảng có kích thước v, trong đó v là số đỉnh Chúng ta cũng muốn có thể đi được con đường ngắn nhất, không chỉ biết độ dài của con đường ngắn nhất Đối với điều này,
chúng ta sẽ ánh xạ mỗi đỉnh với đỉnh được cập nhật lần cuối cùng độ dài đường đi của nó
Sau khi thuật toán kết thúc, chúng ta có thể quay ngược lại từ đỉnh đích đến đỉnh nguồn để tìm đường đi Một hàng đợi ưu tiên nhỏ nhất có thể được sử dụng để nhận đỉnh có khoảng cách đường đi nhỏ nhất một cách hiệu quả
Hàm dijkstra với tham số đầu vào là (G, S)
Sử dụng vòng lặp for cho mỗi đỉnh V trong G
Gán khoảng cach[V] < gia tri vô cực
Gán phần trước[V] giá trị NULL
Nếu V != S, thực hiện thêm V vào trong hàng đợi ưu tiên Q Gán khoảng cách[S] 0
Trong khi Q không rỗng
Gán U c Giá trị MIN được lấy từ Q
Vòng lặp for với mỗi nút chưa được duyệt V của U
Gán khoảng cách tạm thời khoảng cách[U] + trọng số cạnh(U, V) Nếu khoảng cách tạm thời < khoảng cách[V]
Gán khoảng cách[V] Khoảng cách tạm thời Gán phần trước[V] U
Trả về mảng khoảng cách[], mảng thành phần trước[] Độ phức tạp của thuật toán Dijkstra
Độ phức tạp về thời gian: O(ElogV) Trong đó, E là số cạnh và V là số đỉnh Độ phức tạp về không gian: O(V)
Các ứng dụng của thuật toán Dijkstra Được sử dụng để tìm con đường đi ngắn nhất Được sử dụng trong các ứng dụng mạng xã hội
Được ứng dụng trong mạng điện thoại
Được ứng dụng để tìm các vị trí trong bản đồ
Trang 15
Phan III: Cài đặt chương trình
1 Tạo không gian
int ind[map_size_rows][map_size_cols] = {
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
};
2 Tạo các chướng ngoại vật
char map[map_size_rows][map_size cols] = {
{1,1,1,1,1, 1,1, 1,1, 1},
Trang 17e=s _len-1;
for (i = 0; i< s_len; i++) {
stops[i].h = sqrt(pow(stops[e].row - stops[i].row, 2) + pow(stops[e].col - stops[i].col, 2)); } for (i = 1; i < map_size_rows - 1; i++) { for (j = 1; | < map_size_cols - 1; j++) { if (indLi}[j] >= 0) { for(k=i-1;k<=i+1;k++){ for(I=j-1;l<=j+1;l++){
if ((k == i) and (| == j)) {
continue;
}
if (ind[k][!] >= 0) { ++r_len;
routes = (struct route *)realloc(routes, r_len * sizeof(struct route));
int t = r_len - 1;
routes[t].x = ind[i][j]; routes[t].y = ind[k][I];
routes[t].d = sqrt(pow(stops[routes[t].y].row - stops[routes[t].x].row, 2) + pow(stops[routes[t].y].col -
stops[routes[t].x].col, 2));
Trang 18
++stops[routes[t].x].n_len; stops[routes[t].x].n =
(int*)realloc(stops[routes[t].x].n, stops[routes[t].x].n_ len * sizeof(int)); stops[routes[t].x].n[stops[routes[t].x].n_len - 1] = t; } 4 Cách vượt qua chướng ngoại vật while (o_len and not found) { min = DBL_MAX; for (i = 0; i < o_len; i++) { if (stops[open[i]].f < min) { current = open[i]; min = stops[openL[i]] f;
if (current == e) { found = 1;
++p_len;
Trang 19while (stops[current].from >= 0) { current = stops[current].from; ++p_len;
path = (int*)realloc(path, p_len * sizeof(int)); path[p_len - 1] = current;
Phan IV: Két qua chuong trinh
Ï Xxxxxx.Ö
Màn
1 2 3
H
5 6 7 8 8 8 8 8 rs}
Trang 20
2 Két luan
Qua quá trình học môn trí tuệ nhân tạo và qua việc thực hiện đề tài nay, chúng em đã hiểu thêm hơn về việc ứng dụng trí tuệ nhân tạo trong
việc giải quyết các vấn đề trong thực tế Tìm đường ngắn nhất là một
ứng dụng rất tốt thuật toán Tuy nhiên do hạn chế về mặt thời gian nên
nhóm em chưa thể tối ưu được thuật toán, hàm tính điểm cũng chưa
thật sự được tốt như mong đợi, cũng như trong quá trình thực hiện
không thể tránh khỏi sai sót Chúng em rất mong nhận được sự góp ý