Tải bản đầy đủ (.docx) (16 trang)

báo cáo môn trí tuê nhân tạo bài toán n-puzzle sử dụng thuật toán a

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (462.42 KB, 16 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BÁO CÁO BÀI TẬP LỚN
Giải bài toán N-Puzzle sử dụng thuật toán A*
Giáo viên: ThS. Phạm Văn Hải
Nhóm số 2:
Đặng Vũ Hạnh 20080899
Trần Bá Tùng 20083041
Nguyễn Huy Triển 20082751
Phạm Việt Phong 20083429
Phùng Ngọc Duy 20101256
Nguyễn Anh Tuấn 20102772

Hà Nội, Tháng 08 năm 2013
1
Lời nói đầu
Chọn đề tài này với mong muốn có thể áp dụng những kiến thức học tập và nghiên cứu
được để bắt tay xây dựng một ứng dụng cụ thể. Việc này giúp chúng em có thể hiểu sâu về thuật
toán hơn, sử dụng linh hoạt để xử lý những bài toán tìm kiếm trong quá trình học tập , nghiên
cứu và công việc sau này. Sử dụng những thuật toán thông minh của con người, kết hợp với tốc
độ xử lý dữ liệu của máy tính để tạo nên một thiết bị hoàn hảo, từ những thuật toán nhỏ hình
thành ý tưởng lớn. Lập trình cho các thiết bị có thể thay thế những công việc của con người
trong tương lai.

2
A. Thuật toán A*
I. Tìm hiểu thuật toán
Thuật toán A* là một trường hợp của Best First Search nên ta sẽ đi tìm hiểu trực quan BFS
trước khi bắt tay vào A* để có thể có một cái nhìn chung về những thuật toán tìm kiếm tối ưu
này.
1.Khái niệm


1.1. Thuật toán tìm kiếm tối ưu – Best First Search
Thuật toán tìm kiếm ưu tiên tối ưu là sự kết hợp cả hai thuật toán tìm kiếm theo chiều sâu và
thuật toán tìm kiếm theo chiều rộng, cho phép người dùng đi một con đường duy nhất tại một
thời điểm, nhưng đồng thời vẫn xem xét các hướng đi khác. Nếu nhận thấy rằng hướng đang đi
không có triển vọng bằn những con đường còn lại thì ta sẽ chuyển sang đi theo một trong những
đường đó.
3
Tại mỗi bước của thuật toán BFS ta chọn theo trạng thái có khả năng cao nhất trong số các trạng
thái đã được xét cho đến thời điểm đó, như vậy với phương pháp này ta ưu tiên đi vào những
nhánh tìm kiếm có khả năng cao nhất.
Tư tưởng chủ đạo của Best First Search giúp ta sẽ không bị đi những vòng luẩn quẩn bởi vì nếu
đi càng sâu vào một hướng mà ta phát hiện hướng đi này ngày càng tệ , thậm chí tệ hơn cả
những đường ta chưa đi thì ra sẽ không tiếp tục trên hướng hiện tại nưa mà sẽ chọn theo một
trong nhưng hướng tốt nhất trong tập hợp chưa đi.
a. Cài đặt giải thuật BFS
Heap: Tập hợp biến động các đối tượng theo một thứ tự ưu tiên nhất định, mỗi đối tượng được
đặc trưng bởi một khóa thể hiện mức độ ưu tiên của nó, thông thường tập hợp các dối tượng
được thao tác để chọn ra đối tượng có độ ưu tiên cao nhất để xử lý tiếp tục
Heap là cấu trúc dữ liệu trừu tượng , với 4 thao tác cơ bản là đưa một phần tử mới vào trong
Heap (Insert) , lấy phần tử có độ ưu tiên lớn nhất (Remove) , đưa nút có khóa K về đúng vị trí
theo chiều hướng đến gốc cây (UnHeap), và đưa nút có khóa K về đúng vị trí theo chiều hướng
đến ngọn (các nút lá) (DownHeap).
Dưới đây là hình ảnh hai cách biểu diễn Heap, dễ nhận thấy rằng hình ảnh biểu diễn mảng của
Heap chính là phép cây biểu diễn nó theo thứ tự tăng dần.
- Cài đặt giải thuật BFS
4
Để cài đặt thuật giải theo BFS , ta thường dùng 2 tập hợp:
+ OPEN: Tập chứa những trạng thái đã được sinh ra nhưng chưa được xét đến, OPEN là một
hàng đợi ưu tiên (priority queue) mà trong đó phần tử có độ ưu tiên cao nhất là phần tử tốt
nhất. Hàng đợi ưu tiên này thường được cài đặt bằng Heap.

+ CLOSE: Tập chứa các trạng thái đã được xét đến, ta cần lưu trữ những trạng thái này trong
bộ nhớ để phòng trường hợp khi một trạng thái mới sinh ra trong qua trình duyệt lại trùng hợp
với trạng thái đã xét tới trước đó. Khi không gian tìm kiếm có dạng cây thì ta không cần sử
dụng tới tập này.
- Cài đặt
+ Đặt OPEN chứa trạng thái khởi đầu
Cho đến khi tìm được trạng thái đích hoặc không còn nút nào trong tập OPEN vòng lặp thực
hiện duyệt các trạng thái tiếp theo, mỗi bước:
+ Chọn trạng thái tốt nhất Tbest trong OPEN ( và xóa trạng thái Tbest khỏi OPEN)
+Nếu Tbest là trạng thái kết thúc thì thoát.
+Nếu Tbest không phải là trạng thái tốt nhất, tạo ra các trạng thái Tn con của Tbest . Đối với
mỗi trạng thái kết tiếp, thực hiện tính hàm chi phí f(Tn) và thêm Tn vào trong OPEN.
Hình ảnh minh họa BFS
1.2. Thuật toán tìm kiếm A*
5
a. Khái niệm
Không giống như thuật toán Dijkstra , A* là một thuật toán tìm đường đi từ điểm tới điểm, từ
một nút khởi đầu đến một nút đích cho trước hoặc tới một nút thỏa mãn điều kiện và không sử
dụng để tìm giải pháp cho vấn đề tìm đường đi ngắn nhất trong học thuyết đồ thị.
Về bản chất, thuật toán này làm việc rất giống như Dijkstra. Nhưng hiệu quả hơn khi A* sử
dụng một hàm đánh giá bổ sung ( đánh giá heuristic) để ước lượng về tuyến đường đi tốt nhất
qua nút đó (Việc lựa chọn trạng thái tiếp theo sẽ phụ thuộc vào hàm lượng giá này).
A* Là một ví dụ cho thuật toán Best first search, là một thuật toán đầy đủ, luôn tìm thấy một
lời giải nếu bài toán có lời giải.
b. Đăt vấn đề:
Vấn đề đưa ra giống với vấn đề được giải quyết bởi thuật toán tìm đường đi ngắn nhất Dijkstra.
Cho một đồ thị ( đồ thị có hướng và trọng số không âm) và hai node trên đồ thị (gọi là điểm bắt
đầu và điểm cuối), cần tìm một con đường có chi phí đi từ đầu tới cuối là nhỏ nhất trong các
đường đi có thể, kết quả là danh sách các node nó cần đi qua để tới đích với chi phí nhỏ nhất.
c. Thuật toán

Hai tập OPEN và CLOSE cũng giống như Best First Search
Có thể nói rằng , thuật toán A* hoạt đông tương tự như Dijkstra đã thực hiện. Hơn thế tại mỗi
bước luôn cân nhắc chọn các nút có chi phí thấp nhất trong tâp OPEN để định hướng cho bước
tiếp theo, chọn nút có nhiều khả năng sẽ dẫn đến đường đi ngắn nhất cần tìm. Khái niệm “ nhiều
khả năng “ này được đánh giá bằng một hàm heuristic. Nếu hàm đánh giá càng chính xác thì
thuật toán càng tối ưu. Nếu hàm đánh giá tồi thì sẽ dẫn tới thuật toán thực hiện thậm chí tồi tệ
hơn cả Dijkstra. Cụ thể hơn, A* có thể hoạt động trong một vòng lặp ( xét lại các trạng thái đã
xét trước đó) . Tuy sử dụng thuật toán lựa chọn tương tự của Dijkstra nhưng với sự khác biệt về
hàm heuristic A* sẽ hoạt động hiệu quả hơn.
d. Độ tốt của một lời giải trong thuật toán A*
Độ tốt của một trạng thái được tính dựa trên hai giá trị mà ta gọi là h (n)và g(n). h(n) là một
ước lượng về chi phí từ trạng thái hiện tại cho đến trạng thái đích. Còn g(n) là chiều dài quãng
đường đã đi từ trạng thái ban đầu tới trạng thái đang xét. Một điểm cần lưu ý rằng g là chi phí
thực sự còn h là chi phí ước lượng. Dưới đây là hình ảnh mô tả khái quát về thuật toán, chỉ ra
cách tính giá trị cho một số node trên đồ thị
6
Kết hợp g (n)và h(n) ta có hàm tổng chi phí ước lượng cho quãng đường đi từ nốt xuất phát tới
nốt đích dọc theo đường đi của trạng thái hiện tại.
Công thức ước lượng: f(n) = g(n)+h(n)
Nếu giá trị f(n) càng thấp thì độ ưu tiên của n càng cao.
Hai giá trị này đều quy ước là không âm để thuận tiện cho quá trình tính toán.
e. Cài đặt
Pseudo Code:

7
2. Ứng dụng
A* là thuật toán hay được sử dụng để giải quyết các vấn đề tìm đường đi trong game, trên bản
đồ, tìm đường đi ngắn nhất cho người máy vượt chướng ngại vật nó có thể dễ dàng cài đặt
nhưng lại mang tính hiệu quả cao.
II. Phân tích bài toán

1. Vấn đề
Bài toán N-Puzzle
Bài toán này khá quen thuộc, với nhiều phiên bản khác nhau như 8 puzzle, 15 puzzle….
Ở mức độ thấp nhất đó là 8 puzzle, bài toán bao gồm một bảng 3x3 các ô số được đánh từ
1>8.
Ở trạng thái bắt đầu, thứ tự của các ô số được sắp xếp ngẫu nhiên, nhiệm vụ của người giải
là phảo đưa chúng về đúng thứ tự ban đầu đó là sắp xếp theo thứ tự tăng dần và từ trái qua
phải.
2. Xây dựng giải pháp
Bài toán được xây dựng trên bảng các ô vuông theo kích thước n x n (với 8 puzzle thì n=3 và
với 15 puzzle thì n=4). Số lượng trạng thái ban đầu là hoán vị của n x n phần tử. Như vậy , mỗi
khi giá trị của n tăng lên 1 thì không gian trạng thái của bài toán cũng tăng lên rất nhanh. Do
vậy, phụ thuộc vào cách chọn hàm đánh giá, nếu không kết hợp với các kỹ thuật bổ sung thì các
bài toán với n>3 rất lâu tìm ra kết quả hoặc là không thể thực hiện quá trình tìm lời giải bởi vì
không gian trạng thái quá lớn.
- Bài toán 8 Puzzle
Dễ dàng nhận thấy rằng, tại mỗi trạng thái của bài toán chỉ có tối đa 4 cách di chuyển sang trạng
thái khác ( trái , phải, lên , xuống)- các trạng thái con, và để có thể trở về trạng thái thỏa mãn
yêu cầu (trạng thái đích) thì trạng thái đầu tiên phải tuân theo một quy luật nào đó.
Xét một ví dụ về trạng thái đầu tiên như sau:
8
Duyệt qua từng ô theo thứ tự từ trái sang phải và đếm tổng số các ô có giá trị nhỏ hơn sau nó
theo thứ tự duyệt
Xét tại i=1, ta thấy có 7 ô nằm sau có giá trị nhỏ hơn 8 : n1 = 7
Xét tại i=2, có 5 giá trị nằm sau nó nhỏ hơn 6: n2=5
Xét tại i=3, có 3 giá trị nằm sau nó nhỏ hơn 4: n3=3
Xét tại i=4, có 4giá trị nằm sau nó nhỏ hơn 7: n2=4
Xét tại i=5, và i =6 có 2 giá trị nhỏ hơn nó n5= n6 = 2
Xét tại i=7, n7 =1
Và giá trị n8=0

Tính tổng : N = n1 + n2 + n3 +….+ n8 = 7+5+3+4+2+2+1+0 =24
Ta nhận thấy rằng N là một giá trị chia hết cho 2 ( số chẵn)
Đưa bảng ô vuông vừa xét về dạng biểu diễn theo hàng ngang như sau, khi ta tiến hành di
chuyển các ô trên mảng thì giá trị của N tăng lên theo nguyên lần của 2. Từ đó có thể kết luận
được rằng, để có thể quay về trạng thái ban đầu thì trạng thái đầu tiên của bài toán phải thỏa
mãn sao cho giá trị N là một số chẵn.
Ta gọi đó là một cấu hình hợp lệ.
- Bài toán 15 puzzle
Phân tích tương tự như bài toán 8 puzzle ta nhận ra rằng 15 puzzle có nhiều điểm khác biệt, giá
trị của N không luôn chẵn như trước nữa mà nó thay đổi chẵn – lẻ liên tục.
9
Mỗi lần ta di chuyển một ô số thì giá trị của N sẽ tăng giảm theo số lẻ, mỗi lần di chuyển ô
trống giữa các dòng ta chỉ làm thay đổi giá trị của N đi 1 đơn vị .
Với hai trường hợp lên, ta rút ra kết luận về điều kiện ban đầu của bài toán như sau:
Với n lẻ: chỉ cần N là số chăn
Với n chẵn: N là số chẵn nếu ô trống nằm ở trên dòng chẵn từ trên xuống, N là số lẻ nếu ô trống
nằm trên dòng lẻ từ trên xuống.
- Thuật giải
Hàm ước lượng bổ sung?
Để áp dụng thuật toán A* , ta cần có một hàm heuristic để ước lượng giá trị của mỗi trạng thái
của bảng số. Ta sử dụng giải thuật Manhattan để xây dựng hàm đánh giá chi phí, trong đó giá trị
của hàm heuristic sẽ được tính bằng tổng số ô sai lệch của các ô số ở trạng thái hiện tại so với
trạng thái đích của nó.
Manhattan là tên một quận của New York - Mỹ, thành phố có thế kế ngang dọc như một bàn cớ
lớn, rất thuận tiện cho giao thông, như vậy khoảng các giữa hai điểm bất kì trên quận này sẽ
được tính khoảng cách đo được sẽ được đo dọc theo các cạnh vuông góc của con đường. Cũng
như vậy, dùng Manhattan để đo khoảng cách sai lệch bằng việc đếm các hướng ngang dọc sao
cho đường đi từ vị trí đang xét ( vị trí hiện tại) với vị trí đúng ( của trạng thái đích) là ngắn
nhất. Và cũng do đặc điểm đặc biệt này mà người ta đã lấy tên của quận để đặt tên cho phương
pháp tính khoảng cách trên.

Tìm trạng thái đích?
Ta có thể nhận ra rằng để xác định tọa độ đúng ( ở trạng thái đích) của ô có giá trị Id trên ma
trận ô vuông kích thước n x n thì ta sử dụng công thức sau:
RowId = Id / n;
ColId = Id % n;
Tính giá chi phí từ trạng thái hiện tại tới trạng thái đích theo hàm lượng giá sử dụng phương
pháp tính khoảng cách Manhattan, xét trên một ô vuông xi có tọa độ đích là (row1, col1) và
trạng thái hiện tại là (row2, col2)
Giá trị khoảng các theo hàm ước lượng: h= |row1 – row2| - |col1 – col2|
B. Cài đặt
10
I. Xây dựng ứng dụng
Để minh họa cho bài toán, nhóm sẽ xây dựng một ứng dụng ghép hình ảnh
1. Phương pháp giải quyết bài toán
Sử dụng hàm đánh giá chi phí: f(n) = g(n) + h(n);
Giá trị : g(n): chi phí từ node gốc tơi node hiện tại, h(n): chi phí ước lượng từ nút hiện
tại tới đích.
Loại bỏ vòng lặp
Để đảm bảo giải thuật A* là hoàn chỉnh thì phải khử các vòng lặp
Bằng cách, mỗi nút con sinh ra, ta kiểm tra trạng thái của chúng có tồn tại trong hai tập
OPEN và CLOSE hay không trước khi thêm nó vào trong tập hợp OPEN để tránh việc
xét lại các phương án đã xét trước đó.
Để tăng tốc độ duyệt tìm các nút trùng lặp nên đã sử dụng tập hash như một bảng
băm rồi đem ra so sánh.
Hàm ước lượng Heuristic h(n)
Hàm ước lượng : h(n) = h1+ h2 ( h1 là tổng chi phí ngắn nhất để đưa các ô sai về vị trí
đúng theo khoảng cách Manhattan, h2 là hàm chặn)
Gọi x là khoảng cách theo chiều dọc sai vị trí, y là khoảng cách theo chiều ngang sai vị
trí thì h2 công thêm max(x,y) với mỗi ô có (x+y)>1
2. Cấu trúc chương trình

Đây là hình ảnh mô tả một cách tổng quát các lớp trong project chương trình minh họa của
nhóm:
11


a. Class Puzzle là thành phần chính của project, chứa giao diện của chương trình và những
thao tác quan trọng
int[] calculator(Image img, int wt, int ht) : Tính kích thước các ô nhỏ sau khi cắt ảnh
12
void initUI() : Khởi tạo giao diện ứng dụng
void loadImage(URL url): Lấy hình ảnh theo địa chỉ lưu trữ
void loadImage(String url): Lấy hình ảnh theo tên đường dẫn.
void actionPerformed(ActionEvent e) : Sự kiện bắt click chuột trên màn hình.
Image scaleImage(Image sourceImage, int width, int height): Căn chỉnh hình ảnh cho phù hớp
int canMove(int id) : Kiểm tra xem node có thể di chuyển được hay không
boolean Test(int[] val, int posBlank): Kiểm tra xem trạng thái ban đầu có được sau khi tạo ngẫu
nhiên có thỏa mãn yêu cầu hay không
b. Class Point
int check()

boolean move() : Dịch chuyển.
c. Class MyEvent
ActionEvent Pop() :
void Push(ActionEvent e)
void popAll()
boolean hasLog()
d. Class TreeNode
Void updateG(Tree t)
rePlaceFather(TreeNode t, Tree tree)
final int h(int finish[])

final int f()
boolean isSame(int[] n): So sánh trạng thái
boolean isSameOpen(TreeNode[][] hash, Tree t)
ArrayList<TreeNode> findPart(TreeNode[][] hash, int[] finish, Tree t)
e. Class Tree

void addOpen(TreeNode t) : Thêm Node vào tập hợp OPEN
void addHash(TreeNode n): Thêm Node vào tập hợp HASH
13
TreeNode getOpen() : Lấy một Node ra từ trong danh sách OPEN
void AStar() : Cài đặt thuật toán tìm kiếm A*
void start(TreeNode st, TreeNode fn) : Tiến hành thực hiên tìm kiếm
void stop(): Kết thúc quá trình tìm kiếm ( khi quá thời gian quy định hoặc khi quá trình tìm
kiếm kết thúc).
3. Vấn đề còn tồn tại
- Hàm đánh giá Heuristic chưa đánh giá được hoàn chỉnh, chỉ sử dụng được ở các mức thâp
- Duyệt tìm ở mức cao, phần tử trong hash có số phần tử con lớn nên thuật toán bị chậm
4. Hướng phát triển
- Tìm hàm ước lượng tối ưu hơn, đánh giá được giá trị tốt hơn và có thể sử dụng ở các mức cao
hơn
- Xây dựng hàm băm tối ưu hơn để tăng tốc tìm kiếm
- Tiếp tục nghiên cứu thuật toán , áp dụng cho công việc và học tập – nghiên cứu sau này

II. Sử dụng sản phẩm
Đây là màn hình giao diện đầu tiên của chương trình
- Trong mục lựa chọn, hãy chọn độ khó phù hợp.
- Nếu bạn muốn sử dụng hình ảnh mặc đỉnh của chương trình thì hãy ấn vào nút “Tạo mới” để
bắt đầu chơi, nếu không hãy chọn nút “Chọn ảnh” để lấy hình ảnh trên máy tính của mình lên
chương trình.
14

Một File Open Dialog hiện lên, hãy chọn tới file ảnh mà bạn muốn sử dụng rồi nhấn “Open”
- Trong mỗi bước dịch chuyển một ô hình ảnh, bạn có thể sử dụng nút điều hướng trên thanh
công cụ để trở về trạng thái của bước trước.
- Trong trường hợp muốn chương trình tự động sắp xếp dựa trên thuật toán A* cài đặt trước thì
hãy ấn nút “ Sắp xếp ”.

15

×