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.. Ứng dụng của trí tuệ nhân tạo - Ứng dụng tr
Trang 1BO 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 Hoà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
TEN HOC PHAN: TRi TUE NHAN TAO
ĐỀ TÀI: Tìm đường ngắn nhất
STT |Mã Sinh | Họ Và Tên Ngày Điểm
Viên Sinh Bằng Bằng
Số Chữ
1 1571020 | Hoàng Công | 13/12/2
2 1571020 | Nguyén Van | 07/11/2
3 1571020 | Lại Việt 04/04/2
4 1571020 | Lê Mạnh Đạt | 0509200
5 1571020 | Lê Minh 27/09/200
CÁN BỘ CHẤM TH
Trang 3
Ha Noi, nam 2022
Nhom 8 — Lop CNTT 15-05 Page 3
Trang 4Loi 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
bạn
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
Nhóm 8 — Lớp CNTT 15-05 Page 5
Trang 6Phầ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ở
- Ứng dụng trong giáo dục Sự ra đời của trí tuệ nhân tạo đã tạo ra những thay đổi lớn trong lĩnh vực giáo dục Các hoạt động giáo dục như là chấm điểm hay dạy kèm cho học sinh có thể được tự động hóa hoàn toàn nhờ công nghệ AI Nhiều trò chơi, phần mềm giáo dục được ra đời đáp ứng nhu cầu cụ thể của từng học sinh, giúp cho học sinh cải thiện rất nhiều về tình hình học tập theo tốc độ riêng của mình
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
Nhóm 8 — Lớp CNTT 15-05 Page 7
Trang 8Phần II: Phân tích 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 ngoà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
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
này Thuật toán kết thúc khi chọn được khoảng cách nhỏ nhất từ tất cả các điểm
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
của một đồ thị G là một đồ thị con của G, chứa tất cả các đỉnh của G, liên thông và không có chu trình Cây bao trùm của đồ thị liên thông
G cũng có thể định nghĩa như một đồ thị con không chu trình lớn nhất, hay một đồ thị con liên thông nhỏ nhất của G
1 Ví dụ về thuật toán
Giả sử ta có một đồ thị chứa các trọng số như sau
Chọn một đỉnh bắt đầu và gán giá trị vô cực cho tất cả các nút khác
Nhóm 8 — Lớp CNTT 15-05 Page 9
Trang 10
Nếu độ dài đường di của đỉnh liền kể nhỏ hơn độ dài đường đi mới, không thực hiện cập nhật cho nó
Trang 11
Không thực hiện cập nhật độ dài đường đi của các đỉnh đã được truy cập
4+3
Sau mỗi lần lặp, chúng ta chọn đỉnh chưa được duyệt có độ dài đường
đi nhỏ nhất Vì vậy, chúng ta sẽ chọn 5 trước 7
Nhóm 8 — Lớp CNTT 15-05 Page 11
Trang 125+3 < 10
lan
Nhom 8 — Lop CNTT 15-05 Page 12
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 đồ
Nhóm 8 — Lớp CNTT 15-05 Page 13
Trang 15Phan 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, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0,1, 1, 1, 0, 1},
{1, 1,1, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0,0, 1,1, 1,1, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
Nhom 8 — Lop CNTT 15-05 Page 15
Trang 16{1, 0, 0, 0, 0, 0, 0, 0, O, 1},
{1,1,1,1,1, 1,1, 1,1, 1},
};
3 Sử dụng thuật toán
for (i = 1; i < map_size_rows - 1; i++) {
for (j = 1; | < map_size_cols - 1; j++) {
if (map[HIII) 1
++s len;
stops = (struct stop *)realloc(stops, s_ len * sizeof(struct
stop));
intt = s len - 1;
stops[t].col = j;
stops[t].row = i;
stops[t].from = -1;
stops[t].g = DBL_MAX;
stops[t].n_len = 0;
stops[t].n = NULL;
ind[i][j] = t;
}
/* index of start stop */
s=0;
/* index of finish stop */
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));
Nhóm 8 — Lớp CNTT 15-05 Page 17