Bài toán ban đầu đặt ramột ma trận vuông kích thước N*N với các ô số ngẫu nhiên, nhiệm vụ của người chơi là di chuyển ô trống sao cho đưa được tất cả các ô số về đúng trạng thái đích.. V
Trang 1Trường đại học Phương Đông Khoa CNTT – Truyền Thông
BÀI TẬP LỚN MÔN TRÍ TUỆ NHÂN TẠO
Đề tài: “Ứng dụng các thuật toán tìm kiếm để
giải bài toán ghép tranh (N-Puzzle)”
Giảng viên : Trần Thị Hiền Sinh viên thực hiện: Bùi Văn Chiến – 521100198
Phạm Ngọc long - 521100227
Lớp: 521100D
Trang 2LỜI NÓI ĐẦU
N-puzzle là một game quen thuộc với hầu hết mọi người Bài toán ban đầu đặt ramột ma trận vuông kích thước N*N với các ô số ngẫu nhiên, nhiệm vụ của người chơi là
di chuyển ô trống sao cho đưa được tất cả các ô số về đúng trạng thái đích
Để đưa ra lời giải tối ưu nhất sao cho số bước di chuyển ô trống ít nhất đòi hỏingười chơi phải có kinh nghiệm cao để có thể xử lý Trong bài giảng về thuật toán tìmkiếm thuộc môn “Nhập môn Trí tuệ nhân tạo” do cô Trần Thị Hiền giảng dạy đã chonhóm bọn em cách giải quyết bài toán trên với số bước ngắn nhất thông qua 2 thuật toántìm kiếm đó là BFS và A* (Tìm kiếm với tri thức bổ sung)
Với đề tài “Ứng dụng các thuật toán tìm kiếm để giải bài toán ghép tranh Puzzle)” nhóm bọn em xây dựng bài toán với các kích thước có thể thay đổi 3*3, 4*4,
(N-5*5 tương ứng với 3 mức độ chơi là dễ, trung bình và khó Bên cạnh đó là việc chứngminh và sử dụng 2 thuật toán tìm kiếm BFS và A* để giải quyết bài toán Trong đó thuậttoán A* có thể sử dụng 5 hàm heuristic khác nhau để giải
Trong quá trình thực hiện đề tài không tránh khỏi những sai sót, nhóm chúng emrất mong nhận được sự đánh giá, góp ý của cô để hoàn thiện thêm về vấn đề này
Chúng em xin chân thành cảm ơn cô !
Trang 3Mục lục
LỜI NÓI ĐẦU 2
CHƯƠNG I: TỔNG QUAN VỀ TRÍ TUỆ NHÂN TẠO 4
1 Phân loại AI 4
2 Các phương pháp phát triển AI 4
3 Ứng dụng của AI 5
4 Thách thức và tương lai của AI 5
CHƯƠNG II: GIỚI THIỆU NGÔN NGỮ JAVA 6
1 Đặc điểm của Java 6
2 Các thành phần cơ bản của Java 6
3 Ứng dụng của Java 6
4 Ưu điểm và nhược điểm của Java 7
CHƯƠNG III: PHÂN TÍCH THUẬT TOÁN 8
1 Giới thiệu bài toán 8
2 Giới thiệu thuật toán BFS 9
2.1 Đặc điểm 9
2.2 Cài đặt thuật toán 9
3 Giới thiệu về thuật toán A* 11
3.1 Giới thiệu thuật toán 11
3.2 Đặc điểm 12
3.3 Cài đặt thuật toán 12
3.4 Các hàm heuristic 13
CHƯƠNG IV: CÀI ĐẶT CHƯƠNG TRÌNH 21
1 Ứng dụng 21
1.1 IntelliJ IDEA 21
1.2 Scene Builder 21
2 Giao diện chương trình 22
KẾT LUẬN 25
Trang 4CHƯƠNG I: TỔNG QUAN VỀ TRÍ TUỆ NHÂN TẠO
Trí tuệ nhân tạo (AI - Artificial Intelligence) là lĩnh vực khoa học máy tính nghiêncứu và phát triển các hệ thống có khả năng thực hiện các nhiệm vụ thường đòi hỏi tríthông minh của con người AI bao gồm các công nghệ có khả năng tự học hỏi, suy nghĩ,
và ra quyết định dựa trên dữ liệu Các hệ thống AI hiện đại có thể thực hiện những nhiệm
vụ phức tạp như nhận diện hình ảnh, xử lý ngôn ngữ tự nhiên, và chơi các trò chơi chiếnthuật ở cấp độ cao
1 Phân loại AI
AI có thể được phân loại thành nhiều cấp độ và loại hình khác nhau, như sau:
AI Hẹp (Narrow AI): Đây là dạng AI phổ biến nhất hiện nay, được thiết kế để
thực hiện một nhiệm vụ cụ thể Ví dụ bao gồm các hệ thống nhận diện giọng nóinhư Siri, trợ lý ảo Google Assistant, hay các hệ thống gợi ý phim của Netflix AIHẹp không có khả năng hiểu hoặc thực hiện các tác vụ nằm ngoài phạm vi nó đượclập trình
AI Tổng Quát (General AI): Đây là mục tiêu của nhiều nghiên cứu AI, với khả
năng hiểu và học hỏi các kiến thức rộng lớn, có khả năng tự suy nghĩ và ra quyếtđịnh như con người trong nhiều lĩnh vực khác nhau AI Tổng Quát hiện vẫn còn làmột khái niệm lý thuyết và chưa được thực hiện
Siêu trí tuệ nhân tạo (Superintelligence): Đây là một mức độ mà AI có khả năng
vượt xa con người trong hầu hết các lĩnh vực, từ tư duy, sáng tạo cho đến giảiquyết vấn đề Loại hình này hiện chỉ tồn tại trong lý thuyết và các nghiên cứu giảthuyết
2 Các phương pháp phát triển AI
AI sử dụng nhiều phương pháp và kỹ thuật khác nhau để học hỏi và ra quyết định:
Học máy (Machine Learning - ML): Là phương pháp mà AI học từ dữ liệu đầu
vào mà không cần phải lập trình chi tiết ML bao gồm nhiều nhánh nhỏ như học cógiám sát, học không giám sát, và học tăng cường Các hệ thống ML phổ biến trongcác ứng dụng như nhận diện ảnh, nhận diện giọng nói, và dịch máy
Học sâu (Deep Learning): Là một nhánh của ML, sử dụng các mạng nơ-ron nhân
Trang 5trong nhận dạng hình ảnh, phân tích ngôn ngữ tự nhiên, và các tác vụ phức tạpkhác.
Xử lý ngôn ngữ tự nhiên (Natural Language Processing - NLP): Là lĩnh vực
giúp máy tính hiểu, phân tích và phản hồi lại ngôn ngữ con người Ví dụ về NLPbao gồm Google Translate, các chatbot và các hệ thống gợi ý tự động
Hệ thống chuyên gia (Expert Systems): Đây là hệ thống sử dụng các quy tắc để
mô phỏng kiến thức và kinh nghiệm của con người trong các lĩnh vực cụ thể, nhưchẩn đoán y khoa, tư vấn tài chính, hay các hệ thống pháp lý
3 Ứng dụng của AI
AI hiện nay được ứng dụng rộng rãi trong nhiều lĩnh vực:
Y tế: AI được sử dụng trong chẩn đoán bệnh, phân tích hình ảnh y khoa, và gợi ý
phác đồ điều trị Các thuật toán AI có thể phân tích nhanh hàng triệu bệnh án đểđưa ra các chẩn đoán chính xác hơn
Giáo dục: AI có thể cá nhân hóa quá trình học tập của từng học sinh, giúp cải thiện
hiệu quả giảng dạy và đánh giá
Giao thông: Công nghệ xe tự lái, hệ thống điều khiển giao thông và dự báo lưu
lượng xe sử dụng AI để tăng cường độ an toàn và hiệu quả
Tài chính: Các hệ thống AI trong tài chính giúp phân tích rủi ro, phát hiện gian lận
và đưa ra các quyết định đầu tư
Thương mại điện tử: AI có vai trò trong việc gợi ý sản phẩm, phân tích hành vi
khách hàng và tối ưu hóa quy trình bán hàng
4 Thách thức và tương lai của AI
AI hứa hẹn đem lại nhiều lợi ích lớn nhưng cũng đi kèm với các thách thức như:
Vấn đề đạo đức: Các câu hỏi về quyền riêng tư, an ninh dữ liệu và sự phụ thuộc
vào AI đặt ra nhiều thách thức đạo đức
Thị trường lao động: Nhiều ngành nghề có thể bị ảnh hưởng bởi sự thay thế từ
Trang 6 Sự kiểm soát và an toàn: Việc phát triển AI với khả năng quyết định độc lập cần
được kiểm soát chặt chẽ để tránh các tình huống rủi ro
CHƯƠNG II: GIỚI THIỆU NGÔN NGỮ JAVA
Java là một ngôn ngữ lập trình hướng đối tượng được phát triển bởi SunMicrosystems (hiện nay thuộc Oracle) vào năm 1995 Java được thiết kế để "viết một lần,chạy mọi nơi" (Write Once, Run Anywhere - WORA), nghĩa là mã nguồn Java có thểchạy trên mọi nền tảng hỗ trợ Java mà không cần biên dịch lại Điều này làm cho Java trởthành một trong những ngôn ngữ lập trình phổ biến và đa dụng nhất thế giới
1 Đặc điểm của Java
Hướng đối tượng: Java hỗ trợ lập trình hướng đối tượng (OOP), cho phép tổ chức
mã nguồn dưới dạng các đối tượng và lớp, giúp mã nguồn dễ đọc, bảo trì và tái sửdụng
Tính đa nền tảng: Java được thiết kế để chạy trên Java Virtual Machine (JVM),
cho phép mã nguồn Java chạy được trên bất kỳ hệ điều hành nào (Windows,macOS, Linux)
Bộ nhớ tự quản lý: Java sử dụng một hệ thống quản lý bộ nhớ tự động thông qua Garbage Collection, giúp tự động giải phóng bộ nhớ của các đối tượng không cần
dùng đến, giúp giảm thiểu lỗi bộ nhớ
Thư viện phong phú: Java đi kèm với bộ thư viện chuẩn phong phú (Java
Standard Library) hỗ trợ từ xử lý file, mạng, cơ sở dữ liệu cho đến giao diện đồhọa
An toàn và bảo mật: Java có nhiều tính năng để đảm bảo an toàn và bảo mật cho
ứng dụng, như kiểm soát quyền truy cập và mã hóa dữ liệu
Trang 72 Các thành phần cơ bản của Java
JDK (Java Development Kit): Bộ công cụ bao gồm tất cả những gì cần thiết để
phát triển và biên dịch chương trình Java, bao gồm trình biên dịch (compiler), thưviện chuẩn và các công cụ hỗ trợ khác
JRE (Java Runtime Environment): Môi trường để chạy các ứng dụng Java, bao
gồm JVM và thư viện chuẩn
JVM (Java Virtual Machine): Máy ảo Java, cho phép chương trình Java chạy
trên bất kỳ hệ điều hành nào bằng cách chuyển đổi mã Java thành mã máy tươngthích với hệ điều hành đó
3 Ứng dụng của Java
Phát triển ứng dụng doanh nghiệp: Java rất phổ biến trong các hệ thống doanh
nghiệp, đặc biệt là các ứng dụng có quy mô lớn và yêu cầu cao về bảo mật, ví dụnhư các ứng dụng tài chính, ngân hàng
Ứng dụng di động: Java là ngôn ngữ chính để phát triển các ứng dụng Android
nhờ tính tương thích và khả năng kết hợp với nhiều công nghệ khác
Ứng dụng web: Các framework Java như Spring, Hibernate thường được dùng để
phát triển các ứng dụng web lớn và phức tạp
Ứng dụng nhúng: Java có thể chạy trên các thiết bị nhúng và hệ thống nhúng,
giúp phát triển các ứng dụng IoT
Trí tuệ nhân tạo và Khoa học dữ liệu: Dù Python phổ biến hơn trong các lĩnh
vực này, nhưng Java vẫn có các thư viện và framework hỗ trợ cho AI, MachineLearning và xử lý dữ liệu lớn
4 Ưu điểm và nhược điểm của Java
Ưu điểm:
o Đa nền tảng, hỗ trợ chạy trên nhiều hệ điều hành
o Hướng đối tượng, giúp mã dễ bảo trì và tái sử dụng
o Cộng đồng và hệ sinh thái phong phú, hỗ trợ nhiều thư viện và công cụ
Nhược điểm:
o Cú pháp có thể phức tạp hơn các ngôn ngữ khác như Python
o Hiệu suất không nhanh bằng C/C++ do Java chạy trên JVM
o Tốn nhiều bộ nhớ hơn do cơ chế quản lý bộ nhớ tự động
Trang 8CHƯƠNG III: PHÂN TÍCH THUẬT TOÁN
1 Giới thiệu bài toán
Bài toán N-Puzzle hay còn được gọi với các tên khác như “Gem puzzle” hay
“Mystic Square” có lẽ rất quen thuộc với chúng ta cũng như những người mới bắt đầu tiếpcận với môn trí tuệ nhân tạo Vị trí của các hình trong game sẽ nằm ngẫu nhiên trộn lẫntrong n ô, trong đó có 1 ô trống để người chơi dịch chuyển đi từng bước Mỗi lần dichuyển người chơi chỉ có thể đi 1 bước theo chiều qua trái, qua phải, đi lên hoặc đi xuống
để ghép thành 1 hình hoàn chỉnh theo hình mẫu đã cho theo đó Người chơi không được
đi chéo
Bên dưới là hình minh họa về bài toán 8-Puzzle với 1 bảng kích thước 3*3 và các ô
số được đánh lần lượt từ 1 đến 8:
Tại mỗi trạng thái người chơi có thể dịch chuyển từ 2 đến 4 vị trí khác nhau:
Trang 92 Giới thiệu thuật toán BFS
Đây là thuật toán tìm đường đi từ đỉnh xuất phát đến đỉnh kết thúc bằng các duyệttheo chiều rộng
Đây là thuật toán nằm trong nhóm thuật toán tìm kiếm mù, thuật toán không quantâm đến trọng số trên đường đi mà chỉ duyệt theo những đỉnh kề liên tiếp nó
Xuất phát từ một đỉnh và đi tới các đỉnh kề nó, tiếp tục cho đến khi không còn đỉnhnào để đi
Trong quá trình đi đến đỉnh kề, tiến hành lưu lại đỉnh kề để khi đi ngược lại từ đỉnh kếtthúc đến đỉnh xuất phát ta có được đường đi ngắn nhất
2.1 Đặc điểm
2.1.1 Ưu điểm:
● Dễ cài đặt
● Nếu số node là hữu hạn thì chắc chắn sẽ tìm ra
● Nếu tìm ra được đường đi sẽ là đường đi ngắn nhất
2.1.2 Nhược điểm
● Tính chất: “Vét cạn” Không nên áp dụng nếu duyệt số đỉnh quá lớn
● Mang tính chất mù quáng, duyệt tất cả đỉnh, không chú ý đến thông tin trong các đỉnh để duyệt hiệu quả, dẫn đến duyệt qua các đỉnh không cần thiết
● Chiếm thời gian và không gian bộ nhớ khi số đỉnh duyệt nhiều.
2.1.3 Áp dụng
Trang 10● Lúc này mỗi trạng thái hay mỗi node mà thuật toán duyệt qua chính là một mảng các số từ 0 đến n-1, với ô chứa phần tử 0 là ô trắng
● Mỗi lần thuật toán duyệt qua một trạng thái, sẽ đưa vào trong hàng đợi, như vậy ta
● FRINGE : là hàng đợi chứa các phần tử được sinh ra từ các node đã xét
● RESULT: tập trạng thái từ trạng thái hiện tại cho đến đích
● CHILD: tập node con của một node bất kỳ
▪ Nếu quá thời gian hoặc có yêu cầu dừng
▪ Nếu currentNode là goalNode
o Thêm lời giải vào RESULT
o Tính thời gian chạy
o totalNodes = approvedNodes + FRINGE.size()
o FRINGE.clear()
▪ Sinh tập các node con CHILD
▪ Thêm các node con vào FRINGE
Trang 11Trạng thái ban đầu Trạng thái đíchLời giải tìm được với thuật toán BFS:
● Tổng số bước: 22
● Số node đã duyệt: 448128
● Tổng số node trên cây: 777963
Thời gian tìm kiếm: 351ms
Trang 123 Giới thiệu về thuật toán A*
3.1 Giới thiệu thuật toán
3.1.1 Giới thiệu
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, do
đó mà có tên A*
Trong khoa học máy tính, A* (đọc là A sao) là thuật toán tìm kiếm trong đồ thị.
Thuật toán này tìm một đường đi từ một nút khởi đầu tới một nút đích cho trước (hoặc tớimột nút thỏa mãn một điều kiện đích) Thuật toán này sử dụng một "đánh giá heuristic"
để xếp loại từng nút theo ước lượng về tuyến đường tốt nhất đi qua nút đó Thuật toán nàyduyệt các nút theo thứ tự của đánh giá heuristic này Do đó, thuật toán A* là một ví dụ
của tìm kiếm theo lựa chọn tốt nhất (best-first search).
Xét bài toán tìm đường - bài toán mà A* thường được dùng để giải A* xây dựngtăng dần tất cả các tuyến đường từ điểm xuất phát cho tới khi nó tìm thấy một đường đi
chạm tới đích Tuy nhiên, cũng như tất cả các thuật toán tìm kiếm có thông tin (informed
tìm kiếm thuật toán), nó chỉ xây dựng các tuyến đường "có vẻ" dẫn về phía đích.
Để biết những tuyến đường nào có khả năng sẽ dẫn tới đích, A* sử dụng một
"đánh giá heuristic" về khoảng cách từ điểm bất kỳ cho trước tới đích Trong trường hợptìm đường đi, đánh giá này có thể là khoảng cách đường chim bay - một đánh giá xấp xỉthường dùng cho khoảng cách của đường giao thông
Điểm khác biệt của A* đối với tìm kiếm theo lựa chọn tốt nhất là nó còn tính đến
khoảng cách đã đi qua Điều đó làm cho A* "đầy đủ" và "tối ưu", nghĩa là, A* sẽ luônluôn tìm thấy đường đi ngắn nhất nếu tồn tại một đường đi như vậy A* không đảm bảo
sẽ chạy nhanh hơn các thuật toán tìm kiếm đơn giản hơn Trong một môi trường dạng mêcung, cách duy nhất để đến đích có thể là trước hết phải đi về phía xa đích và cuối cùngmới quay lại Trong trường hợp đó, việc thử các nút theo thứ tự "gần đích hơn thì đượcthử trước" có thể gây tốn thời gian
● g(n) là chi phí của đường đi từ nút gốc đến nút hiện tại hiện tại n, nghĩa là số
các bước đã đi từ nút gốc đến nút hiện tại
● h(n) là hàm đánh giá heuristic về chi phí nhỏ nhất để đến đích từ n (chi phí ước
lượng từ nút hiện tại n đến đích) Ví dụ, nếu "chi phí" được tính là khoảng cách
đã đi qua, khoảng cách đường chim bay giữa hai điểm trên một bản đồ là một
Trang 13● f(n) là tổng thể ước lượng của đường đi qua nút hiện tại n đến đích và chi phí từ
nút ban đầu đến nút hiện tại
● Hàm f(n) có giá trị càng thấp thì độ ưu tiên của càng cao.
● Một ước lượng Heuristic h(n) được xem là chấp nhận được nếu đối với mọi nút n: 0 ≤ h(n) ≤ h * (n) Trong đó:
Nếu không gian các trạng thái là vô hạn, thì giải thuật A* là không hoàn chỉnh(không đảm bảo tìm được lời giải)
3.3 Cài đặt thuật toán
3.3.1 Quy ước
● FRINGE : là hàng đợi ưu tiên chứa các node con sinh ra mà chưa được xét đến.
● CLOSED : tập các trạng thái đã xét, các trạng thái con được sinh ra sẽ được kiểm
tra, nếu đã tồn tại trong CLOSED thì không thêm vào FRINGE nữa
● RESULT: tập trạng thái từ trạng thái hiện tại cho đến đích.
● CHILD: tập node con của một node bất kỳ.
Trang 14▪ Nếu currentNode là goalNode
o totalNodes = approvedNodes + FRINGE.size()
o Thêm kết quả và RESULT
o Tính thời gian tìm kiếm
o FRINGE.clear()
o CHILD.clear()
o CLOSED.clear()
o Dừng thuật toán
▪ Thiết lập các node con của currentNode vào CHILD
o Loại những node có trạng thái đã xét ra khỏi CHILD
▪ Đưa các node con vào FRINGE
o Đặt child của các node con là currentNode
o Tính chi phí từ đầu đến node con = currentNode + 1
o Tính hàm ước lượng của các node con đến goalNode
● Ví dụ
● Xét trạng thái như hình