You are on page 1of 13

L3-4.

UNINFORMED, INFORMED
SEARCH
Uninformed search
- Giải quyết vấn đề bằng tìm kiếm: Khái niệm, Phát biểu bài toán trạng thái đơn, Tìm kiếm theo
cấu trúc cây; Đánh giá chiến lược tìm kiếm
- Ví dụ yếu tố nào dùng để đánh giá chiến lược tìm kiếm, có cần kiểm tra tất cả các khả năng để
đảm bảo tìm kiếm hoàn chỉnh – tối ưu?
- Tìm kiếm cơ bản: Tìm kiếm theo chiều rộng (BFS); Tìm kiếm với chi phí cực tiểu (UCS); Tìm kiếm
theo chiều sâu, giới hạn độ sâu, sâu dần (DFS, DLS, IDS)
- Ví dụ: So sánh các chiến lược tìm kiếm (tìm kiếm nào sử dụng ít bộ nhớ hơn, tìm kiếm nào nhanh
hơn, khác nhau trong triển khai fringer như thế nào?); So sánh thứ tự duyệt, tìm đường đi trên
cây (đối với trường hợp cụ thể)

Informed search
- Phương pháp, đặc điểm các chiến lược tìm kiếm có thông tin bổ sung; So sánh các chiến lược
tìm kiếm có thông tin bổ sung
- Ví dụ: Phân biệt hàm đánh giá các phương pháp tìm kiếm (tham lam, A*, UCS), phương pháp
nào sử dụng đường đã đi thực hiện, đường đi ước đến đích (hay tổng hai yếu tố trên), khi nào
phương pháp trên tối ưu-hoàn chỉnh
- Ví dụ: So sánh với tìm kiếm cơ bản (fringe, mở rộng node, thông tin sử dụng), chỉ ra đường đi
trên ví dụ cụ thể
- Local search (đặc điểm, khác biệt chỉ số thực thi, ví dụ dung lượng bộ nhớ)
- Minnimax, alpha-beta (so sánh với tìm kiếm cơ bản, đặc điểm giá trị giá trị alpha-beta)
Chương trình demo
I. Cài đặt
- Python 3.9 (trên máy tôi, python 3.10 có lỗi khi sử dụng thư viện matplotlib.pyplot)
o Instal matplotlib
 python -m pip install matplotlib
 python -m pip install pycairo
- Pycharm: PyCharm 2021.2.2 (Community Edition)

II. Blind search (blind_search.py)


Minh họa các phương pháp tìm kiếm mù (BFS, UCS, DFS, DLS, IDS), chỉ ra khác biệt trong duyệt các node
trong quá trình tìm kiếm.

1. Run option: search method = “BFS”


search_method = "BFS" # BFS/UCS/DFS/DLS/IDS

- Duyệt node theo chiều sâu


tăng dần (theo các hàng)
- Bộ nhớ lớn

2. Run option: search method = “UCL”


search_method = "UCS" # BFS/UCS/DFS/DLS/IDS

- Duyệt các node theo chi phí


đến node gốc tăng dần
- Chỉ số thực thi tương tự BFS
3. Run option: search method = “DFS”
search_method = "DFS" # BFS/UCS/DFS/DLS/IDS

- Duyệt node sâu trước, theo


các nhánh cây
- Bộ nhớ nhỏ

4. Run option: search method = “DLS” (limit = 4)


search_method = "DLS" # BFS/UCS/DFS/DLS/IDS

- Duyệt node sâu trước đến độ


sâu cho giới hạn (n=4)
- Bộ nhớ nhỏ

5. Run option: search method = “IDS”


search_method = "IDS" # BFS/UCS/DFS/DLS/IDS

- Lặp lại DLS với giới hạn tăng


dần
- Bộ nhớ nhỏ
Run option: Tree_cirle = True (chưa hoàn thiện)
Tree_cirle = False # show tr

III. Heuristic search (queencheck.py)


Ví dụ về tìm kiếm với tri thức bổ sung (Informed search), thuật giải GA cho bài toán 8 quân hậu. Viết
code theo thuật toán slide 42-43

Có thể thuyết minh thêm về

- Thay đổi tính fitness: hàm fitness(board) (dòng 47) để quan sát tốc độ tìm ra lời giải (hiện đang
có 2 option để thử)
- Chọn lựa cá thể (cho tái sx, lai ghép) theo fitness: theo phương pháp “roulette wheel selection”
(hàm selectOne(population) dòng 61)

Các options:
# demo option
#1-show chromosome presentation and fitness calculation
#2-show crossover operator
#3-show mutation operator
#4-run GA
Option = 1 (show chromosome presentation and fitness calculation)

Option = 2 (show crossover operator)

Option = 3 (show mutation operator)

Option = 4 (run GA)


IV. Tìm kiếm đối kháng (mininmax.py)
Demo thuật toán minimax với trò chơi tic-tac-toe, phương thức hàm min/max, prunning. Các hàm
min/max được viết (sát) theo slide lớp học

Các options:
# demo option:
# 0: show initial state
# 1: show action and transition model
# 1.5: terminal test and utility function: in the code
# 2: run program

Size = 3
Prunning = False
DepthLimit = False
Depth = 4

Demo = 0 (Size = 3, Prunning = False): show initial state

Demo = 1 (Size = 3, Prunning = False): show action and transition model

Demo = 2 (Size = 3, Prunning = False): run program

Other options and observations:


- Chạy minimax có prunning: prunning = True (quan sát thấy số move kiểm tra giảm đi)
- Chạy minimax với số ô lớn hơn (Size = 4, 5, có thể rất lâu)
- Sử dụng DepthLimit để tăng tốc độ
V. Tìm kiếm đối kháng (chess.py)
Demo thuật toán minimax với trò chơi cờ vua. Các hàm min/max được viết (sát) theo slide lớp học.

Giới thiệu cho sinh viên về ví dụ xây dựng trò chơi cờ vua (tham khảo để làm bài tập lớn): Có thể sử dụng
thư viện về luật chơi (biểu diễn bàn cờ, quân cờ, danh sách nước đi hợp lệ); Tuyệt đối tự viết code tìm
nước đi tối ưu (score, minimax, pruning...).

Chương trình minh họa sử dụng thư viện (chess) của python để theo dõi, in trạng thái bàn cờ, liệt kê các
nước đi hợp lệ. Các hàm tự viết để demo: min/max, tính điểm, ma trận vị trí quân cờ.

Option = 0 (chess piece, board presentation, board display)

Option = 1 (chess piece, board presentation, board display)

Option = 3 (two agents playing)


Các trình bày khác
- Giới thiệu thư viện chess của python
- Hàm score tính điểm quân cờ (code)
- Ma trận tính điểm quân cờ theo vị trí (code)
- Giới thiệu về trò chơi cờ vua (dưới đây)
- Các nhóm (project) hiểu và phát triển các kỹ thuật nào?

VI. Trò chơi cờ vua


Phát biểu bài toán
- Trạng thái bắt đầu
- Hàm chuyển trạng thái:
o các nước đi hợp lệ
- Kiểm tra kết thúc trò chơi:
o Chiếu hết? Hòa cờ? (thêm: hết giờ, phạm luật)
- Hàm tiện ích:
o đánh giá thế cờ, giá trị quân cờ, vị trí quân cờ

Tham khảo: https://en.wikipedia.org/wiki/Rules_of_chess

Ví dụ xây dựng hệ thống từ đầu (demo in python)


- Tự biểu diễn bàn cờ, quân cờ, nước đi
- Ví dụ hàm tìm nước đi hợp lệ, tính điểm bản cờ, thuật toán minimax
- Demo
o # 0: chess piece, board presentation, board display
o # 1: possible moves of pieces
o # 2: score pieces and score board
o # 3: play a move

Ví dụ dùng thư viện (python chess library)


- Tham khảo: https://python-chess.readthedocs.io/en/latest/#
- Ví dụ hàm tìm nước đi hợp lệ, tính điểm bản cờ, thuật toán minimax (như trên)
- Tính điểm theo vị trí quân cờ (ma trận điểm theo từng quân cờ, vị trí)

Cân nhắc
- Vấn đề đối với giới hạn độ sâu (ăn quân tại độ sâu tới hạn?)
- Thêm yếu tố ngẫu nhiên (vd chọn ngẫu nhiên trong các nước đi tốt nhất nếu gần score)
- Học từ CSDL các ván cờ mẫu
- Quản lý thời gian tính toán (thời gian cho nước cờ, ván cờ)
- Hiển thị GUI

Lưu ý
- Có thể sử dụng thư viện về luật chơi (biểu diễn bàn cờ, quân cờ, danh sách nước đi hợp lệ)
- Tuyệt đối tự viết code tìm nước đi tối ưu (score, minimax, pruning...)
VII. Tìm kiếm thỏa mãn ràng buộc
Demo CSP với thuật toán tìm kiếm quay lui (có và không có kiểm tra tiến). Các hàm được viết theo (sát)
slide lớp học.

Tìm kiếm quay lui (mainCSP_BT.py)


Thực hiện (implement) thuật toán tìm kiếm quay lui, với các hàm recursiveBackTracking(),
orderDomainValues(), selectUnassignedVar() như trong bài giảng (slide 18).

Minh họa thuật toán quay lui trong quá trình tô màu các bang nước Úc (như trong silde bài giảng) với
các tùy chọn về thứ tự xem xét các biến (các bang được tô màu) và thứ tự xem xét các giá trị (các màu
tô) của biến.

Option = 0 ( thứ tự các bang như trong slide, thứ tự màu tô như trong domain – red, green, blue)
# 0: default options
if Demo == 0:
Variables = ['WA', 'NT', 'Q', 'NSW', 'V', 'SA', 'T'] # order in the class slides
OrderDomainValueChange = False # same as order of Domains
BackJump = False
Quá trình Backtracking lặp lại với các biến “NT”, “NSW”, SA” (biến thứ 2, 4, 6) vì màu “red” trùng với giá
trị được tô cho biến trước đó.
Option = 1
# 1: order of value for each variable (example of change orderDomainValues() function
elif Demo == 1:
Variables = ['WA', 'NT', 'Q', 'NSW', 'V', 'SA', 'T']
OrderDomainValueChange = True # order from next item compared to last order
BackJump = False
Thay đổi thứ tự màu (giá trị), với màu tô là màu tiếp theo so với màu được tô trước đó. Tránh được
backtracking các biến thứ 2, 4, 6. Có thể gặp vấn đề mới và phải backtracking nhiều lần ở sau (khi 3 bang
đầu được tô cả 3 màu dẫn đến không thể tổ màu bang “SA” sau này).

Option = 2 Thay đổi thứ tự bang cần tô (thứ tự biến)


# 2: order of variables (cleat to explain)
elif Demo == 2:
Variables = ['SA', 'WA', 'NT', 'Q', 'NSW', 'V', 'T'] # change order of 'SA' (variable most constraints)
OrderDomainValueChange = True # order from next item compared to last used one
BackJump = False # without BackJump implementation
Thay đổi thứ tự bang cần tô (thứ tự biến), xét trước biến có tham gia vào nhiều ràng buộc (biến “SA”).
Kết quả giảm số lần backtracking khá nhiều.

Option = 3, 4: backjumping demo


# 3: back-jumping demo
elif Demo == 3:
Variables = ['WA', 'NT', 'Q', 'NSW', 'V', 'T', 'SA'] # order with 'T' in the middle of variables
OrderDomainValueChange = True # order from next item compared to last used one
BackJump = False # without BackJump implementation

# 4: back-jumping demo: with backJump implementation


elif Demo == 4:
Variables = ['WA', 'NT', 'Q', 'NSW', 'V', 'T', 'SA']
OrderDomainValueChange = True # order from next item compared to last used one
BackJump = True # with BackJump implementation
Với Option = 3, chọn thứ tự các biến (“SA” xét cuối cùng) và thứ tự giá trị được gán (màu tiếp theo màu
được tô ở biến trước) để phải thực hiện rất nhiều thao tác backtracking.
... (còn rất nhiều dòng backtracking để đến kết quả cuối cùng)

Option = 4, như option = 3 với tùy chọn có backjuping, số lần thực hiện backtracking giảm đáng kể (3-4
lần)

Tìm kiếm quay lui với tùy chọn forward-checking(mainCSP_FC.py)


Thực hiện (implement) thuật toán tìm kiếm quay lui như trên nhưng với implement thêm option
forward-checking (slide 30) để giảm thất bại. Các options tương tự chương trình ở trên.
# 0: default options
if Demo == 0:
Variables = ['WA', 'NT', 'Q', 'NSW', 'V', 'SA', 'T'] # order in the class slides
OrderDomainValueChange = False # same as order of Domains
BackJump = False

# 1: order of value for each variable (example of change orderDomainValues() function


elif Demo == 1:
Variables = ['WA', 'NT', 'Q', 'NSW', 'V', 'SA', 'T']
OrderDomainValueChange = True # order from next item compared to last order
BackJump = False

# 2: order of variables (cleat to explain)


elif Demo == 2:
Variables = ['SA', 'WA', 'NT', 'Q', 'NSW', 'V', 'T'] # change order of 'SA' (variable most constraints)
OrderDomainValueChange = True # order from next item compared to last used one
BackJump = False # without BackJump implementation

# 3: back-jumping demo
elif Demo == 3:
Variables = ['WA', 'NT', 'Q', 'NSW', 'V', 'T', 'SA'] # order with 'T' in the middle of variables
OrderDomainValueChange = True # order from next item compared to last used one
BackJump = False # without BackJump implementation

# 4: back-jumping demo: with backJump implementation


elif Demo == 4:
Variables = ['WA', 'NT', 'Q', 'NSW', 'V', 'T', 'SA']
OrderDomainValueChange = True # order from next item compared to last used one
BackJump = True # with BackJump implementation
Dưới đây là minh họa trong trường hợp xấu nhất Otption = 3 đối với trường hợp thuật toán quay lui
không có forward-checking (mainCSP_BT.py). Khi thực hiện với option forward-checking, các thất bại bị
loại hoàn toàn (mainCSP_FC.py) trong bài toán tô màu nước Úc.

You might also like