Phần 17: Heuristic Search – Lập trình AI bằng Python

Tìm kiếm heuristic đóng 1 vai trò quan trọng trong trí tuệ nhân tạo. Trong bài này, ta sẽ xem chi tiết về nó.
Table of Contents
1. Khái niệm Heuristic Search trong AI :
Heuristic là 1 quy tắc ngón tay cái dẫn ta tới biện pháp có thể xảy ra. Phần lớn những vấn đề trong trí tuệ nhân tạo đều có tính chất cấp số nhân và có nhiều biện pháp khả thi. Bạn không biết chính xác biện pháp nào là đúng và việc kiểm tra toàn bộ các biện pháp sẽ rất tốn kém.
Do đó, việc sử dụng heuristic thu hẹp việc tìm kiếm biện pháp và xóa bỏ những tùy chọn sai. Phương pháp sử dụng heuristic để dẫn đầu tìm trong không gian tìm kiếm được gọi là Heuristic Search. Những kỹ thuật heuristic rất có ích vì có thể tăng cường tìm kiếm khi các bạn sử dụng chúng.
2. Điểm khác biệt giữa Uninformed và Informed Search :
Có 2 loại chiến lược kiểm soát hay kỹ thuật tìm kiếm: không được thông tin và được thông báo :
Uninformed Search :
Nó còn được gọi là chiến lược tìm kiếm mù hay kiểm soát mù. Nó được đặt tên như thế bởi chỉ có thông tin về định nghĩa vấn đề và không có thông tin bổ sung thêm nào nữa về các trạng thái. Loại kỹ thuật tìm kiếm này sẽ tìm tất cả không gian trạng thái để tìm biện pháp. Tìm kiếm đầu tiên theo chiều rộng (BFS) và Tìm kiếm đầu tiên theo chiều sâu (DFS) .
Informed Search :
Nó còn được gọi là chiến lược tìm kiếm theo cách heuristic hay chiến lược điều khiển heuristic. Nó được đặt tên như thế vì có thêm những thông tin về các trạng thái. Thông tin bổ sung thêm này rất có ích để tính toán tùy chọn giữa những nút con để khám phá và mở rộng. Sẽ có 1 hàm heuristic được liên kết với mỗi nút. Tìm kiếm đầu tiên tốt nhất (BFS), A *, Trung bình và Phân tích là các ví dụ về tìm kiếm có thông tin.
Constraint Satisfaction Problems (CSPs)
Ràng buộc nghĩa là hạn chế hay giới hạn. Trong AI, vấn đề thỏa mãn hạn chế là các vấn đề phải được giải quyết dưới những ràng buộc. Trọng tâm phải là không vi phạm các ràng buộc trong khi giải quyết những vấn đề đó. Cuối cùng, khi ta đạt biện pháp cuối cùng, CSP phải tuân theo các hạn chế.
3. Giải quyết vấn đề thực với Constraint Satisfaction
Những phần trước đã nhắc đến tới việc tạo nên những vấn đề về thỏa mãn hạn chế. Hiện tại, ta hãy áp dụng điều đó cho những vấn đề trong thế giới thực. Những ví dụ về những vấn đề trong thế giới thực được giải quyết bằng cách thỏa mãn ràng buộc như dưới đây:
a. Quan hệ đại số :
Với sự giúp đỡ của bài toán thỏa mãn ràng buộc, chúng ta sẽ có thể giải quyết các quan hệ đại số. Trong ví dụ này, ta sẽ nỗ lực giải 1 quan hệ đại số đơn giản a * 2 = b. Nó sẽ trả về giá trị của a và b trong khoảng mà ta sẽ xác định.
Sau khi hoàn thành chương trình Python này, bạn sẽ có thể hiểu nhiều điều căn bản về cách giải quyết được vấn đề với sự hài lòng về ràng buộc.
Chú ý rằng trước khi viết chương trình, ta cần cài đặt gói Python có tên là python-binding
pip set up python-constraint
Những bước dưới đây cho các bạn thấy 1 chương trình Python để giải quyết mối quan hệ đại số bằng cách sử dụng thỏa mãn ràng buộc:
import package deal constraingt :
from constraint import *
Tạo object mannequin với tên là downside() :
downside = Problem()
Hiện tại, hãy xác định các biến. Chú ý rằng tại đây ta có 2 biến a và b, và ta đang xác định 10 là phạm vi của chúng, nghĩa là ta đã được nhận biện pháp trong 10 số đầu tiên.
downside.addVariable('a', vary(10))
downside.addVariable('b', vary(10))
Tiếp theo, xác định ràng buộc chi tiết mà chúng tôi muốn áp dụng đối với vấn đề này. Quan sát rằng tại đây ta đang dùng ràng buộc a * 2 = b
downside.addConstraint(lambda a, b: a * 2 == b)
Tạo object của mannequin getSolution()
options = downside.getSolutions()
In output :
print (options)
Kết quả như dưới đây :
[{'a': 4, 'b': 8}, {'a': 3, 'b': 6}, {'a': 2, 'b': 4}, {'a': 1, 'b': 2}, {'a': 0, 'b': 0}]
b. Magic Square :
Hình vuông ma thuật là sự sắp xếp những số riêng biệt, thường là số nguyên, trong 1 lưới vuông, trong đó những số trong mỗi hàng, trong mỗi cột và những số trong đường chéo, toàn bộ cộng lại thành những được gọi là “hằng số ma thuật” .
Sau đây chính là cách thực thi từng bước mã Python đơn giản để tạo các ô vuông ma thuật:
Xác định 1 hàm có tên magic_square, như dưới đây :
def magic_square(matrix_ms):
iSize = len(matrix_ms[0])
sum_list = []
Đoạn mã dưới đây hiển thị mã cho chiều dọc của hình vuông:
for col in vary(iSize):
sum_list.append(sum(row[col] for row in matrix_ms))
Chiều ngang của hình vuông:
sum_list.prolong([sum (lines) for lines in matrix_ms])
for i in vary(0,iSize):
dlResult +=matrix_ms[i][i]
sum_list.append(dlResult)
drResult = 0
for i in vary(iSize-1,-1,-1):
drResult +=matrix_ms[i][i]
sum_list.append(drResult)
if len(set(sum_list))>1:
return False
return True
Đưa ra giá trị của ma trận và kiểm tra kết quả :
print(magic_square([[1,2,3], [4,5,6], [7,8,9]]))
Bạn sẽ có thể quan sát rằng kết quả đầu ra sẽ là False vì tổng không lên tới cùng những.
print(magic_square([[3,9,2], [3,5,7], [9,1,6]]))
Bạn sẽ có thể quan sát rằng kết quả đầu ra sẽ là True vì tổng là cùng những, ở đây chính là 15.