1. Trang chủ
  2. » Công Nghệ Thông Tin

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

16 5,3K 14

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 657,36 KB

Nội dung

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

Trang 1

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

Trang 2

Lời nói đầu 3

A Thuật toán A* 4

I Tìm hiểu thuật toán 4

1 Khái niệm 4

2 Ứng dụng 8

II Phân tích bài toán 9

1 Vấn đề 9

2 Xây dựng giải pháp 9

B Cài đặt 11

I Xây dựng ứng dụng 11

1 Phương pháp giải quyết bài toán 12

2 Cấu trúc chương trình 12

3 Vấn đề còn tồn tại 15

4 Hướng phát triển 15

II Sử dụng sản phẩm 15

Trang 3

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

Trang 4

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 đó

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

Trang 5

- Cài đặt giải thuật BFS

Để 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

Trang 6

+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*

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

Trang 7

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ị

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)

Trang 8

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:

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

Trang 9

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:

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

Trang 10

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

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ó

Trang 11

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

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 đó

Trang 12

Để 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:

Trang 13

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

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()

Trang 14

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

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

Trang 15

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.

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

Ngày đăng: 23/10/2014, 23:47

HÌNH ẢNH LIÊN QUAN

Hình ảnh minh họa BFS - 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
nh ảnh minh họa BFS (Trang 5)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w