Professional Documents
Culture Documents
Lý thuyết..................................................................................................................................1
Bài tập......................................................................................................................................1
Bài tập 1: Dùng thuật toán AKT giải bài toán TACI sau:......................................................1
Bài tập 2 (bỏ)........................................................................................................................2
Bài tập 3: A* duyệt đồ thị....................................................................................................3
Bài tập 4: Tháp Hà Nội........................................................................................................4
Code lập trình A* trên python..................................................................................................5
THỰC HÀNH 2
Lý thuyết
Phân biệt AT, AKT, A*
AT AKT A*
Thao tác trên cây Thao tác trên cây Thao tác trên đồ thị
1 7 1 4 7
5 4 8 2 5 8
2 3 6 3 6
Trạng thái ban đầu (a) Trạng thái kết thúc (b)
Cách 1: Tính số ô sai vị trí
Cách 2: Khoảng cách ngắn nhất để di chuyển về trạng thái đích theo chiều
ngang và chiều dọc để ai về đúng vị trí bi
Với hàm heuristic h2 là tổng các (ai,bi) là số bước dịch chuyển theo chiều ngang và
chiều dọc) để ô ai về đúng vị trí bi
Bài tập 2 (bỏ)
2 3 4 1 2 3 4
1 6 7 8 5 6 7 8
5 9 15 11 9 10 11 12
13 10 14 12 13 14 15
(START) (GOAL)
Bài tập 3: A* duyệt đồ thị
Xét lại bài toán tìm đường đi ngắn nhất từ Arab đến Bucharest trên bản đồ Rumani.
Cho trước hàm heuristic của bài nay h(x) là khoảng cách đường chim bay giữa các
thành phố và cho bởi bảng bên cạnh.
Bản đồ của Romania với khoảng cách tính theo km
Khoảng cách đường chim bay từ một thành phố đến Bucharest
Kết quả:
Bài tập 4: Tháp Hà Nội
Gọi n là tổng số đĩa cần chuyển
m là số đĩa đã nằm đúng vị trí ở cột thứ 3
k là số đĩa nằm sai vị trí ở cột thứ 3
Có thể thấy cần chuyển các đĩa nằm sai vị trí ra khỏi cột 3 (k đĩa), sau đó chuyển các
đĩa chưa đúng vị trí vào đúng vị trí của nó (n-m-k đĩa), cuối cùng chuyển k đĩa sai vị
trí vào lại. Như vậy bạn sẽ có công thức là: k + (n-m-k) + k = n-m+k
Giải bài toán tháp Hà Nội với N=3
1 1
2 2
3 3
START GOAL
6 A
2 3
1
5
3 4 C
from collections import defaultdict
from queue import PriorityQueue
data = defaultdict(list)
data['A']=['B',2,'C',1, 'D',3, 6]
data['B']=['E',5,'F', 4, 3]
data['C']=['G',6,'H', 3, 4]
data['D']=['I',2,'J', 4, 5]
data['E']=[3]
data['F']=['K',2,'L',1,'M', 4, 1]
data['G']=[6]
data['H']=['N',2,'O', 4, 5]
data['I']=[5]
data['J']=[4]
data['K']=[2]
data['L']=[0]
data['M']=[4]
data['N']=[0]
data['O']=[4]
class Node:
def __init__(self,name,par =None, g=0, h=0) :
self.name=name
self.par=par
self.g=g
self.h=h
def display(self):
print(self.name, self.g, self.h)
def __lt__(self, other):
if other == None:
return False
return self.g + self.h < other.g + other.h
def __eq__(self, other):
if other == None:
return False
return self.name == other.name
if equal(O, G) == True:
print('tim kiem thanh cong')
getPath(O)
print('distance:',(O.g + O.h))
return
#{check child of}
i = 0
while i < len(data[O.name]) -1:
name = data[O.name][i]
g = O.g + data[O.name][i+1]
h = data[name][-1]
tmp = Node(name = name, g = g, h = h)
tmp.par = O