Bài Tập Thực Hành 1. Cài đặt thuật toán Tìm kiếm theo chiều rộng 2. Cài đặt thuật toán Tìm kiếm theo chiều sâu 3. Cài đặt thuật toán Tìm kiếm leo đồi 4. Cài đặt thuật toán Tìm kiếm tốt nhất đầu tiên 5. Cài đặt thuật toán Tìm kiếm A 6. Cài đặt thuật toán Tìm kiếm Nhánh cận
TỔNG HỢP CÁC CHIẾN LƯỢC TÌM KIẾM (MỚI) I Tìm kiếm mù Tìm kiếm rộng void Breath_First_Search () { OPEN //Lưu trạng thái sinh chờ phát triển CLOSE //Lưu trạng thái phát triển OPEN u0 //uo trạng thái bắt đầu CLOSE = ø while (OPEN != ø) { Xóa u đầu OPEN Thêm u vào CLOSE if (u đích) { Thơng báo tìm kiếm thành cơng; exit; } for (mỗi trạng thái v kề u) if (v khơng có OPEN CLOSE) { Thêm v vào cuối OPEN father(v) u; // Cha đỉnh v } } //Kết thúc vịng while Thơng báo tìm kiếm thất bại; } Tìm kiếm sâu void Depth_First_Search () { OPEN //Lưu trạng thái sinh chờ phát triển CLOSE //Lưu trạng thái phát triển OPEN u0 //uo trạng thái bắt đầu CLOSE = {ø} while (OPEN != ø) { Xóa u đầu OPEN Thêm u vào CLOSE if(u đích) { Thơng báo tìm kiếm thành công; exit; } for trạng thái v kề u if(v khơng có OPEN CLOSE) { Thêm v vào đầu OPEN father(v) u; // Cha cua đỉnh v } } Thơng báo tìm thất bại; } II Tìm kiếm kinh nghiệm Tìm kiếm tốt nhất-đầu tiên void Best_First_Search(){ OPEN // Lưu trạng thái sinh chờ phát triển CLOSE // Lưu trạng thái phát triển OPEN u0 //uo trạng thái bắt đầu CLOSE = {ø} while (OPEN != ø) { Xóa u đầu OPEN Thêm u vào CLOSE if(u đích) { Thơng báo tìm kiếm thành công; exit; } for (mỗi trạng thái v kề u ) if(v khơng có OPEN CLOSE) { Thêm v vào OPEN father(v) u; // Cha đỉnh v } Sắp xếp OPEN theo thứ tự tăng dần hàm h } Thơng báo tìm thất bại; } Tìm kiếm leo đồi void Hill_Climbing_Search(){ OPEN // Lưu trạng thái chờ phát triển - Stack OPEN1 // Lưu giữ tạm thời trạng thái kề u phát triển u CLOSE // Lưu trạng thái phát triển OPEN u0 //uo trạng thái bắt đầu CLOSE = {ø} while (OPEN != ø) { Xóa u đầu OPEN Thêm u vào CLOSE if(u đích) { Thơng báo tìm kiếm thành cơng; exit; } for (mỗi trạng thái v kề u ) if(v khơng có OPEN CLOSE) { Thêm v vào OPEN1 father(v) u; // Cha đỉnh v } Sắp xếp OPEN1 theo thứ tự tăng dần hàm h Chuyển hết OPEN1 vào đầu OPEN } Thông báo tìm thất bại; } III Tìm kiếm tối ưu Tìm kiếm A* void Astar() { OPEN u0 //uo trạng thái bắt đầu CLOSE = ø g(u0) 0 while (OPEN != ø) { xóa u đầu OPEN Thêm u vào CLOSE if(u đích) { Thơng báo tìm kiếm thành cơng; exit; } for (mỗi trạng thái v kề u ) { g(v) g(u)+cost(u,v) if(v khơng có OPEN CLOSE) { f(v) g(v) + h(v) Thêm v vào OPEN father(v) u; // Cha đỉnh v } else if(v xuất OPEN) { if(g(v) < gcũ(v)) { cập nhật giá trị g , f v father(v) u } } Else { // tức v xuất CLOSE if(g(v) < gcũ(v)) { xóa v cũ khỏi CLOSE thêm v vào OPEN cập nhật giá trị g , f v father(v) u } }//end for Sắp xếp OPEN theo thứ tự tăng dần hàm f } //end while Thơng báo thất bại } Tìm kiếm nhánh cận void Branch_and_Bound { OPEN u0 CLOSE = {ø} c=c0 //cận c khởi tạo ban đầu số đủ lớn nhan:while (OPEN != ø){ xóa u đầu OPEN Thêm u vào CLOSE if(u đích) { if(g(u) ≤ c) { cg(u) // cập nhật độ dài đường tối tưu tạm thời goto nhan } } if(f(u) > c) goto nhan for (mỗi trạng thái v kề u ) { g(v) g(u)+cost(u,v) if(v khơng có OPEN CLOSE) { f(v) g(v) + h(v) Thêm v vào OPEN1 father(v) u; // Cha đỉnh v } else if(v xuất OPEN) { if(g(v) < gcũ(v)) { cập nhật giá trị g , f v father(v) u Thêm v vào OPEN1 } } else { //v xuất CLOSE if(g(v) < gcũ(v)) { xóa v cũ khỏi CLOSE thêm v vào OPEN1 father(v) u } } } Sắp xếp OPEN1 theo thứ tự tăng dần hàm f Chuyển OPEN1 vào đầu OPEN cho trạng thái đầu OPEN1 thành đầu OPEN } }