Ưu điểm s* Tính phố biến : C++ là một trong những ngôn ngữ lập trình phô biến trên thé giới.. Phân tích bài toán Bài toán được mô tả trong không gian trạng thái với các đặc điểm sau: -
Trang 2Mục lục
0000/9)160815991.0100000 2200707 U ddadaAaa 7
Ea na 7
1.3 Cơ sở lý luận của vấn đề nghiên cứu - Sàn 0 2221211112111 gu 7
1.4 Mục tiêu đề tài - TH HH nh 1n n1 101111 101 11 gen ta 8
IS 0) 08)0.400) :0WŒớaidđidiaiaiiŸ 8
CHƯƠNG II TÔNG QUAN VỀ CÁC NGÔN NGỮ H01 n1 11 ryg 9
I Tìm hiển về ngôn ngữ C++ S THHnHnn 12112 1121221211110 rraa 9
II.Tông quan về ngôn ngữ PHP S2 TH H211 1212212222121 4212 tre 10
1 Khai mid gạiiiaiaiaiiiiảảảẳảỶ 10
CHƯƠNG III PHÁT BIÊU VẺ BÀI TOÁN s22 21221 21221212 rde 11
1 Bài toán tim durong di tromg mé Cun c1 HH S119 11111111 111111 HH xà 11
1 Yêu cầu bài toán 5 2221121122112 02112112 2211212212112 raa I1
VÌ) 8.0 ì8).0r iaẳẳaiảẳadảadaả 11 K6 v1.0) 0.008.) 8n 12
FK 0g hỉaađaadađađiaaddddaadaảaảảảảảyÝŸỶ 16
II Thiết kế giải phap va cai data occ ccecese ces tessessessressesseesstesressetretiressisssetisiestiitsereteseed 18
1 Cài đặt cấu trite trang thai ccc csccesseesseessesseverssetsressresevettetiittiiseessesareseeteee 18
2 Cài đặt hàm tính Heurisfic trong giải thuật Á* HH Hy yg 18
3 Cài đặt hàm kiểm tra trạng thái - 5 SE 1221222121821 re ra 19
Trang 3
lẴN(./ TL in 20 5.2 Hành động di chujyỄn xuỐng : à HH HH2 HH ng uàu 5.3 Hành động di chuyển qua phải : HH HH HH ru run 5.4 Hành động di chuyỂn qua trải: HH HH H2 reue 21
6 Cài đặt hàm gọi các hành động - nnn HH H101 0111 11 t1 nhàn ro 22 7 Cài đặt hàm cấu trúc để xây dựng cây tìm kiếm trạng thái 5s sen 22
8 Cài đặt cấu trúc danh sách 5 TH 1221 811221212241 2g 22
9, Cài đặt hàm tìm kiếm trạng thái 5 CT2 212121212121 ung 24
Trang 4NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
Giảng viên luưởng dân
Trang 5NHAN XET CUA GIANG VIEN PHAN BIEN
Tp Đà Nang, ngay thang nim 2022
Giảng viên phản biện
Trang 6LỜI CÁM ƠN
Đề có thể hoàn thành đề tài đồ án này và có được kiến thức như ngày hôm nay, đầu tiên
em xin gửi lời cảm ơn đến Ban Giám Hiệu nhà trường Cùng toàn thể thầy cô Khoa Tin Học — Trường Đại Học Sư Phạm Đà Nẵng đã tận tình giảng dạy, truyền đạt kiến thức cũng như những kinh nghiệm quý báu cho em trong suốt quá trình học tập tại trường Đặc biệt em xin chân thành cảm ơn Thầy Đoàn Duy Bình đã tận tình hướng dẫn và quan tâm, động viên chúng em trong quá trình thực hiện đề tài Em cũng bày tỏ lòng biết ơn
đến những bạn bè đã động viên và tạo mọi điều kiện giúp em trong quá trình học tập
Trong quá trình nỗ lực đề hoàn thành đồ án cá nhân em cũng đã tìm hiểu nhiều tài liệu và nhờ những anh chị khóa trên khoa Tin và thầy cô để hoàn thành tốt nhiệm vụ của mình
Em xin chân thành cảm ơn những sự giúp đỡ chân thành Mặc dù em đã cố gắng hoàn thành tốt đề tài nhưng cũng không thê tránh khỏi những sai sót nhất định, rất mong được
sự thông cảm và chia sẻ cùng quý thầy cô và bạn bè
Em xin gửi lời chúc sức khỏe và thành đạt tới tất cả quý thầy cô cùng các bạn ạ
Trang 7CHUONG I: CO SO Li THUYET 1.1 Giới thiệu đề tài
Cho I mê cung, thể hiện bằng 1 ma trận mền, mỗi vị trí biéu diễn bởi số I là tường
của mê cung, không thé đi vào, vi trí biểu điển bởi số 0 là đường di, co thể đi được, số
2 là điểm khởi đầu , số 3 là điểm cuối Hãy tìm đường đi từ vị trí bắt đầu đến vị trí kết
- Mê cung chỉ có l đường vào và l đường ra duy nhất
- Đề tài có thê đước ứng dụng làm các mê cung trong công viên, xây dựng khu vưi choi,
1.3 Cơ sở lý luận của vấn đề nghiên cứu
-Năm 1951, Claude Shannon đã chế tạo ra con chuột máy biết tìm biết tim đường đi
trong mê cung Những bài toán liên quan đến mê cung như tránh ngô cụt, tìm đường vào hoặc đường đi nhanh nhất, đi đến mọi nhánh của mê cung, mỗi nhánh đi đúng hai lần và mỗi lần theo một chiều khác nhau là những bài toàn có ứng dụng quan trọng
cho một ngành toán học trẻ tuổi: ngành điều khiến học
- Theo căn cứ trên, việc tìm đường đi cho mê cung không còn quá mới mẻ, đồng thời
nó cũng hoàn toàn phù hợp với thực tiễn và pháp lí xã hội Tuy nhiên, chúng tôi ủng
hộ và đề cao tính tư duy và sáng tạo và mục đích nghiên cứu của sinh viên nhiều hơn cho quá trình nghiên cứu đề tài lần này
Trang 8e - Xây dựng bài toán bằng ngôn ngữ lập trình C/C++
e - Xây dựng giao diện đồ họa bằng ngôn ngữ JavaScript & PHP
Trang 9CHƯƠNG II TỎNG QUAN VỀ CÁC NGÔN NGỮ
I Tìm hiểu về ngôn ngữ C++
1 Khái niệm
- Ngôn ngữ lập trình C+-+ là một ngôn ngữ lập trình hướng đối tượng(OOP — Object- oriented programming) duge phat trién bởi Bjarne Stroustrup C++ là ngôn ngữ lập trình được phát triển trên nên tảng của ngôn ngữ lập trình C Do đó, C++ có song song
cả 2 phong cách(style) lập trình hướng cấu trúc giống C và có thêm phong cách hướng đối tượng Trong nhiều trường hợp, C++ sử dụng kết hợp cả 2 style trên Do đó, nó
được xem là một ngôn ngữ “la1 tạo”
- Ngôn ngữ C++ là một ngôn ngữ lập trình cấp trung Bởi vì nó có các tính chất của cả ngôn ngữ lập trình bậc thấp(Pascal, C ) và ngôn ngữ lập trình bậc cao(C#, Java, Python )
- Ngôn ngữ lập trình C++(C plus plus) có đuôi mở rộng là cpp
2 Ưu điểm
s* Tính phố biến : C++ là một trong những ngôn ngữ lập trình phô biến trên thé giới
s Tính thực thi nhanh: Nếu bạn rành C++ thì bạn có thẻ lập trình nhanh Một trong
những mục tiêu của C++ là khả năng thực thi Và nêu bạn cần thêm các tính năng cho chương trình, C++ cho phép bạn dùng ngôn ngữ Assembly (Hợp ngữ) — Ngôn ngữ lập trình bậc thấp nhất — đề giao tiếp trực tiếp với phần cứng của máy tính s* Thư viện đầy đủ: Có rất nhiều tài nguyên cho người lập trình bằng C++, bao gồm
cả đồ hoạ API, 2D, 3D, vật lý các thiết bị âm thanh hỗ trợ giúp cho lập trình viên
dễ dang thực thị
s* Đa mô hình: C++ cho phép bạn lập trình theo cấu trúc tuyến tính, hướng chức năng, hướng đối tượng đa đạng tuỳ theo yêu cầu của người lập trình
Trang 10II.Tổng quan về ngôn ngữ PHP
1 Khái niệm PHP
- PHP la chit viet tắt của ngôn ngữ PHP là từ viết tắt của Personal Home Page (hiện nay là Hypertext Preprocessor) Thuật ngữ này chỉ chuỗi ngôn ngữ kịch bản hay mã lệnh, phù hợp đề phát triển cho các ứng dụng nằm trên máy chủ
Khi viết phần mềm bằng ngôn ngữ PHP, chuỗi lệnh sẽ được xử lý trên server dé tir
đó sinh ra mã HTML trên chient Và dựa vào đó, các ứng dụng trên website của bạn sẽ
hoạt động một cách dễ đàng
2.Ưu điểm
PHP là một trong những ngôn ngữ lập trình phô biến nhất vì những lợi ích mà nó đem lại Về cơ bản, có 4 ưu điểm chính:
-_ Tính đơn giản và linh động: PHP sử đụng mã nguồn mở nên việc cài đặt và sử dụng
nó rất dễ đàng Ngôn ngữ này phù hợp với cả những người hoàn toàn mới với nghé lập trình viên Bạn chỉ cần học chăm chỉ trong 3 — 6 tháng đề thuần thục nó
-_ Cộng đồng hỗ trợ lớn: PHP là một ngôn ngữ phố biến nên các diễn đàn, đội nhóm chuyên sâu của PHP thuộc hàng ngũ đầu của ngành Bên cạnh đó, thị trường tuyên dụng cho công việc này cũng chưa bao giờ giảm nhiệt
-_ Cơ sở đữ liệu đa dạng: PHP cho phép kết nối với hầu hết các loại cơ sở đữ liệu như MySQL, mSQL, MS-SQL, SQLite, PostgreSQL, v.v Nho vay, ban sẽ không bị giới
hạn và có thê chọn cơ sở dữ liệu tối ưu nhất cho ung dung cua minh
- Thu vién phong phu: Nhiéu sach huéng dan va cac tài liệu tham kháo có sẵn, cung cap các kiên thức hữu ích cho các lập trình viên mới làm quen dân
10
Trang 11CHƯƠNG III PHAT BIEU VE BAI TOAN
I Bai toan tìm đường đi trong mê cung
Cho | mé cung, thê hiện bang | ma tran m*n, m6i vi tri biéu dién bdi so | là tường
của mê cung, không thể đi vào, vị trí biểu điễn bởi số 0 là đường đi, có thé đi được, số
2 là điểm khởi đầu , số 3 là điểm cuối Hãy tìm đường đi từ vị trí bắt đầu đến vị trí kết
Trạng thái mục tiêu Trạng thái đích
2 Phân tích bài toán
Bài toán được mô tả trong không gian trạng thái với các đặc điểm sau:
- Trang thai ban đầu : ma trận biểu diễn bằng mảng 2 chiều với kích thước m”*n, các ô mang giá trị l biểu điễn cho bức tường trong mê cung, giá tri 0 biểu diễn đường đi trong mê cung Đánh dấu ô bắt đầu có giá trị 2, ô đích đến có giá trị 3, và đường đi từ ô bắt đầu đến đích sẽ mang giá trị là 4
- Cac thao tác/ hành động để tạo ra các trạng thái mới, dì chuyên hướng đi lên
trên, xuống dưới, qua trái, qua phải và đánh dầu là đoạn đường đi
- Trang thai bắt đầu: Khởi tạo ma trận mê cung, co 6 bắt đầu và ô đích đến
- Trang thái đích: Đường đi từ ô bắt đầu đến ô đích
Việc tìm giải pháp cho bài toàn là tìm đường đi từ ô bắt đầu đến ô đích
11
Trang 123.Các chức năng trong bài toán
3.1 Di chuyển lên trên :
Di chuyén lên trên Nghĩa là từ vị trí bắt đầu chọn hướng di chuyên lên trên và
gán giá trị cho ô đó để đánh đấu hướng đi chuyên Trong trường hợp nếu ở trên
là tường ( 6 mang giá trị 1 ) thi không thê đi chuyển được
Ví dụ với ví trị như hình bên dưới sau khi thực hiện hành động :
12
Trang 13Ví dụ với ví trị như hình bên dưới sau khi thực hiện hành động :
Trạng thái sau khi thực hiện hành
Trạng thái chưa thực hiện hành động động
Với các vị trí như hình thì không đi chuyên xuống đưới được nữa
3.3 Di chuyển qua trải:
Di chuyên qua trái Nghĩa là từ vị trí bắt đầu chọn hướng đi chuyên qua trái và gán giá trị cho ô đó để dánh đấu hướng di chuyên Trong trường hợp nếu ở bên trái là tường ( ô mang giá tri | ) thi không thể đi chuyên được
Ví dụ với ví trị như hình bên dưới sau khi thực hiện hành động :
13
Trang 15Với các vị trí như hình thì không đi chuyên qua phải được nữa
4.Giải thuật A*
4.1 Giới thiệu về thuật toán A*
- Thuật toán A* được mô tả lần đầu vào năm 1968 bởi Peter Hart, Nils Nilsson, và
Bertram Raphael Trong bài báo của họ, thuật toán được gọi là thuật toán A; khi sử dụng thuật toán này với một đánh giá heuristic thích hợp sẽ thu được hoạt động tối ưu,
đo đó mà có tên A*
- Năm 1964, Nils Nilsson phát minh ra một phương pháp tiếp cận dựa trên khám pha
đề tăng tốc độ của thuật toán Dijkstra Thuật toán này được gọi là A1 Năm 1967
Bertram Raphael da cai thiện đáng kê thuật toán này, nhưng không thê hiền thị tối ưu Ông gọi thuật toán này là A2 Sau đó, trong năm 1968 Peter E Hart đã giới thiệu một
đối số chứng minh A2 là tối ưu khi sử dụng thuật toán này với một đánh giá heuristic
thích hợp sẽ thu được hoạt động tối ưu Chứng minh của ông về thuật toán cũng bao
gồm một phân cho thay rang các thuật toán A2 mới là thuật toán tốt nhất có thê được
đưa ra các điều kiện Do đó ông đặt tên cho thuật toán mới là A *(A sao, A-star)
4.2 Ưu điểm
-_ Thuật toán tìm kiếm A * là thuật toán tốt nhất so với các thuật toán tìm kiếm khác
-_ Thuật toán tìm kiếm A * là tối ưu và hoàn chỉnh
- Thuật toán này có thê giải quyết các vấn đề rất phức tap
4.3 Nhược điểm
- Nó không phải lúc nào cũng tạo ra đường đi ngắn nhất vì nó chủ yếu dựa trên heuristics và tính gần đúng
15
Trang 16- Thuật toán tìm kiếm A * có một số vấn đề phức tạp
-_ Hạn chế chính của A * là yêu cầu bộ nhớ vì nó giữ tất cả các nút được tạo trong bộ nhớ, vì vậy nó không thực tế cho các vấn đề quy mô lớn khác nhau
4.4 Giải thuật
Giải thuật A* là trường hợp đặc biét Best first search (viéc cập nhật lại
đường đi dựa trên giá trị h(n) thay vì dựa trên gia tri f(n) tổng quát)
f(n) = g(n) + h(n)
hí(n) phụ thuộc vào trạng thái n nên f(n) chi thay doi khi g(n) thay doi hay
nói cách khác khi ta tìm được một duong di mdi đến n tốt hơn đường đi cũ
=> cập nhật lại g khi đường đi mới tốt hơn)
Mỗi trạng thái n tùy ý sẽ gồm 4 yếu tổ (gín), h(n), Ấn), cha(n)) với cha(n) là
nút cha của nút đang xét n
16
Trang 17II Thiết kế giải pháp và cài đặt
1 Cài đặt cầu trúc trạng thái
Sử đụng một số cầu trúc sau để biêu diễn trạng thái:
© Maze[m][n] : Đề lưu mê cung với kích thước m*n trong đó m là số dòng
, n là số cột
® sfart position row, sfart position col : lưu tọa độ ô bắt đầu di chuyên
® end position row, end position col: luu toa d6 6 dich
* position row, position col: lưu tọa độ các ô di chuyên
int start_position_row, start_position_col;
int end_position_row, end_position_col;
int position_row, position_col;
: State;
2 Cai dat ham tinh Heuristic trong giai thuat A*
Ham tinh Heuristic trong bai toan mé cung dựa việc tính khoảng cách d,
khoảng cách từ ô hiện hành đến 6 dich
Khi đó d được tính theo công thức sau:
Trang 183 Cài đặt hàm kiểm tra trạng thái
Tìm được mục tiêu đích đến khi khoảng cách d = 0
int checkgoal(State state){
return Heuristic(state) == 0;
}
4 Cai dat ham so sanh hai trang thai
So sánh 2 trang thái có giống nhau hay không
int comparestate(State statel, State state2){
int Up(State state, State *result)
Di chuyên lên trên và gán giá trị cho ô đó
đề đánh dấu hướng di chuyên (Trong trường hợp nếu ở trên là tường - ô mang giá tri 1)
int Down(State state, State *result)
Di chuyên xuông dưới và gán gia tri cho 6
đó đề đánh dấu hướng di chuyên (Trong trường hợp nếu ở trên là tường - ô mang giá tri 1)
int Right(State state, State *result)
Di chuyên qua phải và gán giá trị cho ô đó
đề đánh dấu hướng di chuyên (Trong trường hợp nếu ở trên là tường - ô mang giá tri 1)
int Left(State state, State *result) Di chuyên qua trái và gán giá trị cho ô đó
đề đánh dấu hướng di chuyên (Trong trường hợp nếu ở trên là tường - ô mang giá tri 1)
5.1 Hành động di chuyển lên trên :
18