You are on page 1of 7

Contents

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*

đỉnh đỉnh đỉnh

Cung Cung Cung

Giá thành cung Giá thành cung Giá thành cung

Tri thức bổ sung Tri thức bổ sung

Thao tác trên cây Thao tác trên cây Thao tác trên đồ thị

 Mối quan hệ giữa AT, AKT, A*


Bài tập
Bài tập 1: Dùng thuật toán AKT giải bài toán TACI sau:

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

Arad 366 Mehadia 241

Bucharest 0 Neamt 234

Craiova 160 Oradea 380

Dobreta 242 Pitesti 98

Eforie 161 R.Vilcea 193

Fagaras 178 Sibiu 253

Giurgiu 77 Timisoara 329

Hirsova 151 Urziceni 80

Iasi 226 Vaslui 199

Lugoj 244 Zerind 374

 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

Code lập trình A* trên python


 Hình minh họa

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

def equal(O, G):


if O.name == G.name:
return True
return False
def checkInPriority(tmp, c):
if tmp == None:
return False
return(tmp in c.queue)
def getPath(O):
print(O.name)
if O.par != None:
getPath(O.par)
else:
return

def AStar(S = Node, G = Node):


Open = PriorityQueue()
Closed = PriorityQueue()
S.h = data[S.name][-1]
Open.put(S)
while True:
if Open.empty() :
print('tim kiem that bai')
return
O = Open.get()
Closed.put(O)
print('duyet:', O.name, O.g, O.h)

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

ok1 = checkInPriority(tmp, Open)


ok2 = checkInPriority(tmp, Closed)
if not ok1 and not ok2:
Open.put(tmp)
i += 2

Chạy thuật toán


AStar(Node('A'),Node('N'))

You might also like