1 GIẢI TOÁN BẰNG PHƯƠNG PHÁP TÌM KIẾM
1.2.1.4. Bài toán khảo sát
Agent không biết không gian trạng thái của bài toán, không biết thông tin kết quả của hành động. Giống như đi từ nơi này đến nơi khác mà không có bản đồ. Đây là bài toán khó nhất đối với agent thông minh. Agent phải thử nghiệm và từ từ khám phá xem hành động của nó làm gì và sắp xếp các trạng thái đang tồn tại. Agent học bản đồ môi trường và sử dụng nó
để giải quyết bài toán.
1.2.2. Định nghĩa bài toán và giải pháp
Bài toán là tập hợp các thông tin agent sẽ dùng để quyết định xem sẽ làm gì. Những thành phần cơ bản của bài toán gồm trạng thái và hành động:
• Trạng thái ban đầu của agent.
• Tập hợp các hành động sẵn có của agent. Thuật ngữ toán tử được dùng để biểu diễn sự mô tả hành động theo trạng thái tìm kiếm bằng cách thực thi các hành động trong trạng thái cụ thể. Ví dụ, cho hàm S và trạng thái cụ thể x, S(x) trả về tập các trạng thái có thể tìm thấy từ x bởi bất cứ hành động đơn giản nào.
• Sự kiểm tra mục tiêu dùng để xác định xem trạng thái nào đó có phải là trạng thái mục tiêu không. Hay khi có tập các trạng thái mục tiêu rõ ràng, sự kiểm tra chỉ đơn giản xem agent có tìm ra một trong các trạng thái đó hay không. Nhưng đôi khi, mục tiêu được xác định bởi các thuộc tính trừu tượng, không phải tập các trạng thái được liệt kê rõ ràng.
• Hàm chi phí đường đi là hàm gán chi phí cho một con đường. Với chi phí cho một con đường là tổng chi phí của các hành động riêng rẽ dọc theo con đường. Ký hiệu của hàm chi phí đường đi làg. Với:
o Không gian trạng thái của bài toán là tập hợp tất cả các trạng thái có thể tìm thấy từ trạng thái ban đầu bởi bất kỳ chuỗi hành động nào.
o Đường đi trong không gian trạng thái là bất kỳ chuỗi hành động nào dẫn từ trạng thái này sang trạng thái khác.
o Chi phí đường đi chỉ ra giải pháp này phù hợp hơn giải pháp kia. Như vậy, trạng thái ban đầu, tập hợp các toán tử, sự kiểm tra mục tiêu và hàm chi phí đường đi định nghĩa bài toán. Ta có thể định nghĩa kiểu dữ
liệu trình bày các bài toán như sau:
Thể hiện của kiểu dữ liệu này sẽ là đầu vào cho thuật toán tìm kiếm của chúng ta. Đầu ra của thuật toán là một giải pháp, đó là đường đi từ trạng thái khởi đầu đến trạng thái thỏa mãn hàm kiểm tra mục tiêu.
1.2.3. Đo mức độ thực thi của việc giải toán 1.2.3.1. Các phương pháp đo độ thực thi Có ít nhất 3 cách đểđo tính hiệu quả của việc tìm kiếm.
a) Nó có tìm ra giải pháp trong tất cả các trường hợp hay không? b) Giải pháp tìm thấy có phải là giải pháp tốt không (chí phí đường đi
thấp)?
datatypeBÀI TOÁN
components:TRẠNG THÁI BAN ĐẦU, TẬP CÁC TOÁN TỬ, KIỂM TRA MỤC TIÊU, HÀM CHI PHÍ ĐƯỜNG ĐI
c) Chi phí tìm kiếm liên kết với thời gian và bộ nhớ yêu cầu để tìm ra giải pháp là gì?
Tổng chi phí tìm kiếm là tổng của chi phí đường đi và chi phí tìm kiếm. 1.2.3.2. Ví dụ
Ví dụ, bài toán tìm kiếm lộtrình từ Arad đến Bucharet.
− Chi phí đường đi có thể tươngứng với tổng số dặm của con đường.
− Chi phí tìm kiếm phụ thuộc vào từng tình huống. Trong môi trường tĩnh, chi phí tìm kiếm có thể bằng 0 bởi vìđộđo thực thi phụ thuộc vào thời gian. Ví dụ đi từ Arad đến Bucharet, môi trường là bán
động vì tính toán dài hơn, chi phí sẽ cao hơn. Trong trường hợp này, chi phí tìm kiếm biến đổi gần như xấp xỉ với thời gian tính toán (ít nhất là với lượng thời gian nhỏ).
Để tính tổng chi phí, ta phải cộng số dặm và mili giây. Điều này không dễ
vì ta không có tỉ lệ trao đổi chuẩn giữa hai đơn vị này. Agent phải biết cách quyết định, tài nguyên nào giành cho tìm kiếm và tài nguyên nào dành cho thực thi. Đối với những bài toán có không gian trạng thái rất nhỏ, ta dễ dàng tìm thấy những giải pháp với chi phí đường đi thấp nhất. Nhưng với không gian tìm kiếm lớn, bài toán phức tạp, rất khó khăn để
có được chi phí tốiưu cả hai mặt – agent có thể thu được giải pháp tốiưu nhưng phải tìm kiếm trong thời gian dài, hay agent có thể tìm kiếm trong thời gian ngắn và thu được giải pháp với chi phí đường đi lớn hơn.
1.2.4. Chọn trạng thái và hành động
Giả sử, xét bài toán “Lái xe từ Arad đến Bucharest sử dụng các con
đường trong bản đồ hình 3.2.” Không gian trạng thái tương ứng có 20 trạng thái, một trạng thái được định nghĩa bằng một vị trí duy nhất, xác
Hình 3.2 Bản đồđơn giản của Romaria
Bài toán được mô tả như sau:
1. trạng thái ban đầu: “ở Arad”
2. các toán tử: Arad →Zerind Arad→Sibiu
3. sự kiểm tra mục tiêu: “Đây có phải là Bucharet không?” hay x =
“at Bucharest”
4. chi phí đường đi: có thể là số dặm, cũng có thể là thời gian lưu thông. Nhưng bản đồ của chúng ta thì không xác định chúng, nên ta giả sử hàm chi phí đường đi sẽđo số bước phải đi qua.
5. giải pháp: chuỗi toán tử đi từ trạng thái ban đầu đến trạng thái mục tiêu.
Có rất nhiều giải pháp nhưng giải pháp đi qua Sibiu và Fagaras, có chi phí đường đi là 3 là giải pháp tốt nhất.
Môi trường thế giới thực rất phức tạp. Đối với cách tiếp cận giải quyết bài toán không gian trạng thái phải được mô tả trừu tượng. Đây gọi
là sự trừu tượng hoá. Quá trình này bỏ qua chi tiết của các trạng thái và hành động.
Cụ thể:
• Trạng thái trừu tượng: tập các trạng thái thực. Ví dụ: “at Arad”, “at Bucharest”. Bỏ qua các trạng thái môi trường khác như: trạm dừng kế tiếp bao xa, điều kiện đường đi, thời tiết, v.v…
• Toán tử trừu trượng: mô tả các hành động thực trong môi trượng. Ví dụ: “Arad → Zerind” bỏ qua việc đi đúng luật, tiêu thụ nhiên liệu, v.v…
• Giải pháp trừu tượng: tập các con đường trong thế giới thực. Việc thực thi những hành động trừu tượng trong giải pháp trừu tượng dễ
hơn so với bài toán gốc.
1.3. Tìm kiếm giải pháp
Việc tìm kiếm giải pháp được thực hiện bằng cách tìm qua không gian trạng thái. Ý tưởng là duy trì và mở rộng tập các chuỗi giải pháp cục bộ. Phần này trình bày cách tạo ra chuỗi giải pháp và cách lưu chúng trong những cấu trúc dữ liệu thích hợp.
1.3.1. Tạo các chuỗi hành động
Bản chất của việc tìm kiếm là: chọn một trạng thái và đặt những cái khác qua một bên cho lần sau khi lựa chọn đầu tiên này không đưa đến giải pháp. Với mỗi trạng thái được chọn, ta kiểm tra xem nó có phải là trạng thái mục tiêu không. Nếu không phải, xét tiếp những trạng thái mới được tạo ra từ trạng thái hiện hành bằng cách áp dụng các toán tử. Đây gọi là quá trình mở rộng trạng thái. Các quá trình lựa chọn, kiểm tra và mở rộng tiếp tục cho đến khi giải pháp được tìm thấy hoặc cho đến khi không còn
trạng thái nào để mở rộng nữa. Việc chọn trạng thái nào để mở rộng được xác định bởi giải pháp tìm kiếm.
Ví dụ để giải quyết bài toán từ Arad đến Bucharest, ta bắt đầu với trạng thái khởi đầu là Arad. Kiểm tra xem nó có phải là trạng thái mục tiêu không. Rõ ràng là không phải, điều này rất quan trọng để tránh gặp phải vấn đề là “bắt đầu từ Arad, đến Arad.” Vì đây không phải là trạng thái mục tiêu nên ta, nên ta phải khảo sát các trạng thái khác. Áp dụng các operator với trạng thái ở Arad, tạo ra tập các trạng thái mới “ở Sibiu”, “ở
Timisoara” và “ở Zerind”, vì có con đường trực tiếp từ Arad đến các thành phố này. Do có nhiều trạng thái để chọn, ta chọn một trạng thái và
để các trạng thái khác cho lần lựa chọn sau.
Giả sử chọn Zerind. Kiểm tra xem nó có phải là trạng thái mục tiêu không (trong trường hợp này là không), sau đó mở rộng nó “ở Arad” và “ở Oradea.” Bây giờ, có thể chọn một trong hai trạng thái, hoặc trở về
và chọn Sibiu hay Timisoara. Quá trình này tiếp tục cho đến khi tìm thấy giải pháp, Để dễ dàng cho quá trình tìm kiếm, ta xây dựng cây tìm kiếm (search tree) trong không gian trạng thái. Nút gốc của cây tìm kiếm gọi là nút tìm kiếm (search node) ứng với trạng thái ban đầu. Các nút lá
ứng với trạng thái không có kế thừa trong cây vì chúng chưa được mở
rộng, hoặc đã mở rộng rồi nhưng tạo ra tập rỗng. Ở mỗi bước thuật toán tìm kiếm chọn một nút là để mở rộng.
Hình 3.3 thể hiện sự mở rộng cây tìm kiếm đối với bài toán tìm đường đi từ Arad đến Bucharet.
Thuật toán tìm kiếm tổng quát như sau: a) Trạng thái mở đầu Arad Arad Zerind Timisoara Sibiu b) Sau khi mởrộng Arad Arad Zerind Timisoara Sibiu Orade Fagara Arad Rimnicu c) Sau khi mởrộng Sibiu
Hình 3.3.Cây tìm kiếm cục bộ cho việc tìm kiếm tuyến đường từ Arad đến Bucharest
function TÌM KIẾM(bài toán,chiến lược) trả về một giải pháp hay thất bại
khởi tạo cây tìm kiếm sửdụng trạng thái banđầu củabài toán
loop do
if không có trạng thái nàođể mởrộngthen returnthất bại chọn một nút láđể mởrộng theochiến lược
if nútđó là trạng thái mục tiêu then returngiải pháp tương ứng
elsemở rộng nút và thêm nút kết quảvào cây tìm kiếm
Phân biệt giữa không gian trạng thái và cây tìm kiếm.
• Trong không gian trạng thái số trạng thái là hữu hạn.
• Trong cây tìm kiếm số nút là vô hạn.
Trong bài toán tìm đường đi, chỉ có 20 trạng thái trong không gian trạng thái, nhưng có vô số đường đi trong không gian trạng thái này. Vì vậy, có vô số nút trong cây tìm kiếm. Ví dụ Arad-Sibiu-Arad-Sibiu… Một thuật toán tìm kiếm hiệu quả sẽ tránh được sự lẩn quẩn như vậy.
1.3.2. Cấu trúc dữ liệu của cây tìm kiếm
Có nhiều cách biễu diễn nút, nhưng ở đây, giả sử nút là một cấu trúc dữ
liệu có 5 thành phần:
• Trạng thái của nút trong không gian trạng thái;
• Nút cha của nó trong cây tìm kiếm;
• Toán tử được áp dụng để tạo ra nút;
• Chiều sâu của nút – số nút trên đường đi từ nút gốc đến nút này;
• Chi phí đường đi từ trạng thái ban đầu đến nút này. Kiểu dữ liệu nút:
Nút và trạng thái
• Nút là cấu trúc dữ liệu tính toán dùng để biểu diễn cây tìm kiếm trong những bài toán cụ thể, được tạo ra bởi một thuật toán cụ thể.
• Trạng thái thể hiện dạng (hoặc tập các dạng) của môi trường.
datatypenút
components: TRẠNG THÁI, NÚT CHA, TOÁN TỬ, CHIỀU SÂU, CHI PHÍ ĐƯỜNG ĐI
Vì vậy, nút có chiều sâu và có nút cha, trong khi trạng thái không có. Ta có thể có hai nút khác nhau nhưng có cùng một trạng thái, nếu trạng thái
đó được tạo ra bởi hai chuỗi hành động khác nhau.
Phương pháp tìm kiếm là một hàm, hàm này sẽ chọn nút kế tiếp
được mở rộng trong tập các nút chờ được mở rộng. Hàm tìm kiếm phải xem qua tất cả các nút trong tập này để chọn nút thích hợp nhất. Giả sử
rằng tất cả các nút được đặt trong một hàng đợi. Các thao tác trên hàng
đợi như sau:
• TẠO HÀNG ĐỢI(các thành phần) tạo một hàng đợi với các thành phần được cho.
• RỖNG?(Hàng đợi) trả về true nếu không có thành phần nào trong hàng đợi.
• LẤY PHẦN TỬĐẦU(Hàng đợi) trả về và xoá thành phần ở trước hàng đợi.
• CHÈN(Các thành phần,Hàng đợi) chèn một tập các thành phần vào hàng đợi.
Với những định nghĩa này, thuật toán tìm kiếm tổng quát được cải tiến như sau:
function TÌM KIẾM(bài toán,CHÈN)trả vềmột giải pháp hay thất bại
tập các nút – TẠO HÀNG ĐỢI(TẠO NÚT(TRẠNG THÁI BAN ĐẦU [bài
toán]))
loop do
iftập các nútlà rỗngthen returnthất bại
nút– LẤY PHẨN TỬĐẦU(tập các nút)
ifKIỂM TRA MỤC TIÊU[bài toán]được áp dụng với TRẠNG THÁI(nút) thành côngthen
returnnút
tập các nút– CHÈN(tập các nút,MỞ RỘNG(nút,TẬP TOÁN TỬ[bài
toán]))