Tải bản đầy đủ (.ppt) (21 trang)

slide thuyết trình đồ án Đồ Án Mê cung và đường đi

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 (238.35 KB, 21 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA CÔNG NGHỆ THÔNG TIN
ĐỒ ÁN
CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN
Sinh viên thực hiện:
Nguyễn Xuân Thạch : 07T3
Lê Trần Lam : 07T3
Nguyễn Văn Nam : 07T3
Lê Trung Dũng : 07T3
Giáo viên hướng dẫn: Phan Thanh Tao
Đề tài: MÊ CUNG VÀ TÌM ĐƯỜNG ĐI TRONG MÊ CUNG
Nội dung báo cáo

Phần 1 : Cơ sở lý thuyết

Phần 2 : Mô tả bài toán

Phần 3 : Thuật toán

Phần 4 : Chương trình

Phần 5 : Kết quả & đánh giá

Mê cung

Thuật toán Loang

Hàng đợi
Phần 1: Cơ sở lý thuyết
MÊ CUNG
Là một hệ thống các con đường hoặc


lòng hang động.
Ô tường
Ô có thể đi
Ô bắt đầu, kết thúc
Phần 1: Cơ sở lý thuyết
THUẬT TOÁN LOANG
Là thuật toán duyệt theo chiều rộng
Duyệt mọi khả năng có thể có của bài toán
Mô hình hoá thuật toán Loang
Từ đỉnh hiện tại, duyệt qua tất cả đỉnh
có thể đến
Lặp lại quá trình đó đến khi gặp cấu
hình mong muốn, ngược lại bài toán
không có kết quả
Phần 1: Cơ sở lý thuyết
HÀNG ĐỢI
Là một cấu trúc dữ liệu dùng để chứa các đối tượng làm việc theo cơ chế FIFO
Hai thao tác quan trọng trong cấu trúc hàng đợi là :
EnQueue(o): thêm đối tượng o vào cuối hàng đợi.
DeQueue(): lấy đối tượng ở đầu queue ra khỏi hàng đợi và trả về giá trị của nó
Ứng dụng hàng đợi: khử đệ quy, quản lý các tiến trình,
tìm kiếm theo chiều rộng, quay lui, vét cạn…
Phần 1: Cơ sở lý thuyết

Yêu cầu bài toán

Giải quyết bài toán

Cấu trúc dữ liệu


Các hàm, thủ tục
Phần 2: Mô tả bài toán
YÊU CẦU BÀI TOÁN
Cho một mê cung và tìm đường đi trong mê cung đó.
1 0 1 1 1 1 1 1 1 1
1 0 1 0 0 0 0 0 0 1
1 0 0 0 1 1 0 1 1 1
1 1 0 0 0 1 0 0 0 1
1 1 0 1 0 0 1 1 0 1
1 0 0 1 1 0 1 1 0 1
1 1 0 1 0 0 0 0 0 1
1 1 0 0 0 1 1 1 0 1
1 0 0 1 0 0 0 0 0 1
1 1 1 1 1 1 1 1 0 1
1 0 1 1 1 1 1 1 1 1
1 0 1 0 0 0 0 0 0 1
1 0 0 0 1 1 0 1 1 1
1 1 0 0 0 1 0 0 0 1
1 1 0 1 0 0 1 1 0 1
1 0 0 1 1 0 1 1 0 1
1 1 0 1 0 0 0 0 0 1
1 1 0 0 0 1 1 1 0 1
1 0 0 1 0 0 0 0 0 1
1 1 1 1 1 1 1 1 0 1
Dữ liệu vào : mê cung
( biểu diễn bằng ma trận 2
chiều với giá trị 0, 1), đỉnh
bắt đầu, đỉnh kết thúc.
Dữ liệu ra : Đường đi giữa 2
đỉnh cho trước trong dữ liệu vào

Phần 2: Mô tả bài toán
GiẢI QUYẾT BÀI TOÁN
Ngôn ngữ sử dụng : C++
Cấu trúc dữ liệu : Hàng đợi
typedef struct tagDNode
{
int x;
int y;
struct tagDNode* next;
struct tagDNode* father;
}DNODE;
typedef struct tagDList
{
DNODE* pHead;
DNODE* pTail;
}QUEUE;
Phần 2: Mô tả bài toán
Giải quyết bài toán

Các hàm, thủ tục

DNODE* GetNode(int u,int v); //khởi tạo 1 node

void EnQueue(QUEUE &l,DNODE* newe); //Thêm 1 node (newe)
vào hàng đợi

DNODE* DeQueue(QUEUE &l); //Lấy ra 1 node ra khỏi hàng đợi
Phần 2: Mô tả bài toán

Tìm đường đi (ngắn nhất)


Tìm tất cả đường đi (có thể có)
Phần 3: Thuật toán
Bước 1:
Nạp đỉnh vào vào hàng đợi
p=GetNode(xstart, ystart);
EnQueue(maze,p);
Bước 2 :
While(maze.pHead != NULL)// Lặp trong khi hàng đợi chưa rỗng
{ p=DeQueue(maze)// Lấy 1 đỉnh từ hàng đợi để xét
Kiểm tra đỉnh đó là đỉnh ra ?
Nếu đúng :In kết quả, kết thúc thuật toán
Nếu sai :
Kiểm tra các hướng có thể đi từ đỉnh đó ?
Nếu đi được :
g=GetNode(xnew,ynew);
EnQueue(maze,g);// Nạp đỉnh mới vào hàng đợi
g->father=p;// Đánh dấu đỉnh dẫn tới g
}
Phần 3: Thuật toán
Tìm đường ngắn nhất
DNODE* S, Sw; //S là stack chứa các phần tử chứa đỉnh tạo thành đường đi
//Sw là stack chứa các đỉnh tạm thời
//S là stack chứa các đỉnh tạo thành đường đi
Bước 2:
Xét đỉnh đầu tiên ở S
Nếu có đường đi từ đỉnh đó
{
Nạp tất cả đỉnh g đi được vào Sw;
Đánh dấu tất cả g->father=S;

Nạp đỉnh đầu của Sw vào S;
Xoá đỉnh đầu tiên của Sw;
Lặp lại bước 2:
}
Phần 3: Thuật toán
Tìm tất cả đường
Bước 1:
Nạp đỉnh vào Stack S
Nếu như không thể đi được nữa (bị tắt đường)
{
Nếu như Sw = NULL thì kết thúc
Nếu không
{
Xoá lùi các đỉnh trong S cho tới vị trí Sw->father;// nghĩa là tại đỉnh
mà ở đó có ngã rẽ
Nạp đỉnh đầu của Sw vào S;
Xoá đỉnh đầu của Sw;
Lặp lại bước 2:
}
}
Phần 3: Thuật toán
Tìm tất cả đường
Nếu đỉnh hiện tại là đỉnh ra
{
Xuất kết quả (nghĩa là xuất các đỉnh trong S);
Nếu Sw = NULL thì kết thúc
Nếu không
{
Xoá lùi trong S tới vị trí Sw->father;
Nạp đỉnh đầu của Sw vào S;

Xoá đỉnh đầu của Sw;
Lặp lại bước 2:
}
}
Phần 3: Thuật toán
Tìm tất cả đường

Chương trình được viết trong môi trường
MFC (Visual C++)

Kết quả được thể hiện dưới dạng đồ hoạ
(Toàn bộ chương trình nằm trong file nguồn
kèm theo)
Phần 4: Chương trình
Mở file mê cung và ta có hình sau:
Phần 5: Kết quả và đánh giá
Click menu Best Path và chương trình sẽ vẽ đường đi
Phần 5: Kết quả và đánh giá
Click menu All Path, sau đó click menu View để xem các kết quả
Phần 5: Kết quả và đánh giá

Bài toán hiệu quả khi lời giải nằm gần gốc của cây tìm kiếm

Nhưng do sử dụng cấu trúc hàng đợi nên đã giảm đáng
kể số lần tìm kiếm giải vô ích so với cách dùng tập hợp
lưu các đỉnh kế tiếp

Trường hợp xấu nhất thì bài toán sẽ vét cạn toàn bộ.
Tuy nhiên thuật toán này luôn luôn tìm ra lời giải.
Phần 5: Kết quả và đánh giá


Nhóm xin phép được kết thúc phần trình bày của mình ở
đây.

Trong quá trình thực hiện đồ án không tránh khỏi những
khó khăn, thiếu sót.

Chúng em mong nhận được ý kiến đóng góp của các
thầy cô và các bạn để hoàn thiện đồ án tốt hơn.
Cám ơn !
Lời kết

×