Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.17 MB, 12 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<b>TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HCMKHOA CƠNG NGHỆ THƠNG TIN</b>
Tìm kiếm tia (Beam Search) là thuật tốn tìm kiếm heuristic mà ở đó nó sẽ khai phá một đồ thị bằng cách tìm ra node khả quan, tối ưu nhất trong một danh sách các
<b>node được giới hạn. Tìm kiếm tia là sự cải tiến của BeFS (Best-First Search) mà ở</b>
đó nó tốn ít dung lượng bộ nhớ hơn.
<b>Tìm kiếm đầu tiên tốt nhất (Best-First Search) tìm kiếm tất cả các node khả thi</b>
để đi đến được mục tiêu. Trong khi đó, tìm kiếm tia chỉ tìm một số lượt node nhất
<b>định và giữ những node này làm ứng cử viên để tìm tới đích – giống với tìm kiếm</b>
<b>tham lam (Greedy Best-First Search).</b>
<b>Tìm kiếm tia sử dụng breadth-first search (tìm kiếm theo chiều rộng) để xây</b>
dựng nên cây tìm kiếm của mình. Tại mỗi tầng của cây tìm kiếm, nó sẽ truy mọi nút biên và sắp xếp chúng theo chiều tăng dần của giá trị heuristic. Tuy nhiên, khác với
<b>Best-First Search, nó sẽ chỉ giữ lại một số lượng nút biên xác định trước – được gọi</b>
<b>là Beam Width (W) – và chỉ những nút được giữ lại này sẽ được mở rộng tiếp.Chỉ số W càng lớn thì sẽ có ít nhánh bị bỏ đi – với W = thì sẽ khơng có nhánh nàobị loại bỏ và thuật toán bây giờ sẽ thành breadth-first search (tìm kiếm theo chiều</b>
<b>rộng), cịn với W = 1</b> thì nó sẽ trở thành thuật tốn <b>tìm kiếm tham lam (GreedyBest-First Search). Chỉ số W sẽ giới hạn dung lượng bộ nhớ cần để thực hiện việc</b>
tìm kiếm. Tìm kiếm tia khơng phải là giải pháp tối ưu vì khơng có gì đảm bảo được việc nó sẽ tìm ra được đường đi tốt nhất cũng như việc nhánh chứa nút mục tiêu có thể sẽ bị loại bỏ.
Nói tóm lại, tìm kiếm tia trả về cho ta giá trị đầu tiên tìm thấy. Một khi nó đã tìm đạt đến độ sâu tối đa thì nó sẽ đánh giá các giải pháp và trả về giải pháp với độ khả thi cao nhất.
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">1. Khởi tạo 2 danh sách trên. 2. Thêm nút khởi đầu vào OpenList. 3. Chạy vòng lặp:
a. Nếu OpenList rỗng trả về kết quả.
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">b. Chọn nút có thích hợp nhất và bỏ nút đó từ OpenList qua ClosedList. c. Nếu nút là mục tiêu trả về path.
d. Tìm các nút lân cận nút đó.
e. Nếu những nút lân cận khơng xuất hiện trong OpenList và ClosedList thì ta thêm vào OpenList để chờ duyệt. Nếu nó đã có trong OpenList thì ta so sánh chi phí giữa qng đường cũ và mới, nếu nó nhỏ hơn thì ta thay thế nó.
f. Nếu số lượng node trong OpenList > Beam Width ( thì ta chọn ra node thích
<b>Ứng dụng của Tìm kiếm tia (Beam Search):</b>
Một trong những ứng dụng phổ biến nhất của tìm kiếm tia đó là việc máy dịch (machine translation) trong mơ hình Encoder và Decoder. Khi dịch ngôn ngữ này sang ngôn ngữ khác, trước hết ta mã hóa một chuỗi các từ đó từ ngơn ngữ nguồn và sau đó giải mã thành một chuỗi các từ trong
ngôn ngữ đích. Trong q trình giải mã,
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">đối với mỗi từ trong chuỗi, có thể có nhiều tùy chọn khác nhau và đó là lúc mà tìm kiếm tia đi vào hoạt động.
Sau đây là một ví dụ đơn giản về ứng dụng của tìm kiếm tia trong giai đoạn giả mã với chỉ số heuristic là xác suất một từ (cụm từ) có thể có trong văn bản được dịch (W = 3).
Ưu điểm:
<b>- Tốc độ (Speed): Tìm kiếm theo tia là thuật tốn tương đối nhanh để tìm chuỗi từ</b>
hoặc hành động có khả năng nhất so với các thuật tốn khác như tìm kiếm tồn diện (exhaustive search).
<b>- Độ chính xác (Accuracy): Tìm kiếm tia thường tạo ra kết quả đầu ra chất lượng cao</b>
bằng cách cắt bớt khơng gian tìm kiếm và tập trung vào các ứng cử viên triển vọng nhất.
<b>- Tính linh hoạt (Flexibility): Tìm kiếm tia có thể được sửa đổi để phù hợp với các</b>
trường hợp sử dụng khác nhau, bằng cách điều chỉnh độ rộng tia hoặc kết hợp các kinh nghiệm khác.
Nhược điểm:
<b> - Tối ưu cục bộ (Local Optima): Tìm kiếm tia có thể bị kẹt trong tối ưu cục bộ,</b>
nghĩa là nó có thể khơng tìm thấy chuỗi từ hoặc hành động tối ưu, đặc biệt trong trường hợp chuỗi khả dĩ nhất không rõ ràng.
<b> - Đầu ra không đầy đủ (Incomplete Output): Tìm kiếm tia chỉ trả về một chuỗi</b>
đầu ra duy nhất, có thể khơng phải lúc nào cũng là chuỗi tốt nhất.
<b> - Chiều rộng tia (Beam Width): Chọn đúng chiều rộng tia có thể là một thách thức,</b>
quá hẹp và bạn có thể bỏ lỡ các ứng cử viên tốt, quá rộng và cuối cùng bạn có thể khám phá quá nhiều ứng cử viên kém chất lượng.
<b> - Thiếu tính đa dạng (Lack of Diversity): Tìm kiếm tia thường tạo ra các chuỗi đầu</b>
ra quá giống nhau, đây có thể là một vấn đề trong trường hợp mong muốn có nhiều đầu ra khác nhau.
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7"><b>Ví dụ về việc khơng tối ưu:</b>
<b>Bước 1: OPEN= {A}Bước 2: OPEN= {B, C}Bước 3: OPEN= {C, E}Bước 4: OPEN= {F, E}Bước 5: OPEN= {G, E}</b>
<b>Bước 6: Tìm được mục tiêu {G}, Dừng lại</b>
=> Tóm lại, tìm kiếm theo tia là một thuật tốn hữu ích có thể được sử dụng để tìm chuỗi từ hoặc hành động có khả năng xảy ra nhất theo cách tương đối hiệu quả. Tuy nhiên, nó có những hạn chế như tối ưu cục bộ và thiếu tính đa dạng, đồng thời yêu cầu điều chỉnh cẩn thận để đạt được kết quả tốt nhất.
Độ phức tạp về thời gian và khơng gian của tìm kiếm tia phụ thuộc vào một số yếu tố, bao gồm:
- <b>Kích thước của khơng gian tìm kiếm (Size of the search space):</b> Độ phức tạp về thời gian và không gian của tìm kiếm theo tia tăng theo kích thước của khơng gian tìm kiếm. Nói chung, khơng gian tìm kiếm càng lớn thì yêu cầu tìm kiếm tia thời gian và không gian càng nhiều.
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8"><b> - Độ rộng tia (Beam width): Độ phức tạp về thời gian và khơng gian của tìm</b>
kiếm tia cũng phụ thuộc vào độ rộng tia. Chiều rộng tia lớn hơn thường dẫn đến kết quả tốt hơn nhưng cũng địi hỏi nhiều thời gian và khơng gian hơn.
- <b>Hệ số phân nhánh (Branching factor):</b> Hệ số phân nhánh của khơng gian tìm kiếm cũng ảnh hưởng đến độ phức tạp về thời gian và khơng gian của tìm kiếm tia. Hệ số phân nhánh cao hơn có nghĩa là có nhiều hành động khả thi hơn để thực hiện ở mỗi bước, điều này làm tăng độ phức tạp về thời gian và khơng gian.
=>Nói chung, độ phức tạp về thời gian của tìm kiếm tia là O(b^d), trong đó b là hệ số phân nhánh và d là độ sâu của khơng gian tìm kiếm. Điều này có nghĩa là thời gian cần thiết để thực hiện tìm kiếm theo tia tăng theo cấp số nhân với độ sâu của khơng gian tìm kiếm.
<b> *Độ phức tạp khơng gian của tìm kiếm tia cũng là O(b^d) trong trường hợp xấu</b>
nhất. Điều này là do tìm kiếm tia cần theo dõi các ứng viên hiện tại ở mỗi bước và số lượng ứng viên có thể tăng theo cấp số nhân với độ sâu của khơng gian tìm kiếm.
**Tuy nhiên, trên thực tế, độ phức tạp về thời gian và không gian thực tế của việc tìm kiếm tia có thể thấp hơn so với trường hợp xấu nhất, tùy thuộc vào vấn đề cụ thể đang được giải quyết và độ rộng tia được chọn.
Có một số biến thể của tìm kiếm theo tia có thể được sử dụng để cải thiện hiệu suất của nó, một số trong số đó là:
<b>- Tìm kiếm tia có truy vết ngược (beam search results in limited discrepancybacktracking - BULB): Thuật toán này cũng giống như thuật tốn tìm kiếm tia bình</b>
thường khi chúng sẽ trả về một kết quả khả thi, nhưng nếu kết quả đó chưa hiệu quả thì chúng sẽ truy ngược lại (<b>backtrack)</b> để tìm ra kết quả tốt nhất.
<b>- Local beam search: Trong phạm vi tìm kiếm cục bộ thì tìm kiếm tia (beamsearch) sẽ được coi là tìm kiếm tia cục bộ, với thuật tốn giống hệt với thuật tốn tìm</b>
kiếm tia. Nó cũng chọn ra 1 chỉ số W và ở mỗi tầng của cây tìm kiếm, nó sẽ chọn ra W nhánh để tiếp tục cơng việc tìm kiếm cho tới khi tìm được mục tiêu.
<b>- Tìm kiếm tia ngẫu nhiên (stochastic beam search): Thuật tốn này cũng giống</b>
với thuật tốn tìm kiếm tia nhưng vì tìm kiếm tia hay bị kẹt lại trong miền cục bộ nên thay vì giữ nguyên giá trị W từ đầu đến cuối thì nó sẽ chọn chỉ số W tiếp theo theo cách ngẫu nhiên, với xác suất phụ thuộc vào đánh giá heuristic của các trạng thái.
=> Nhìn chung, việc lựa chọn biến thể phụ thuộc vào nhiệm vụ cụ thể và chất lượng đầu ra mong muốn, tính đa dạng và hiệu quả tính toán.
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9"><b>1. Trong local beam search, beam width là gì?</b>
A. Số lượng các nút con của một nút trong cây tìm kiếm. B. Số lượng các trạng thái được lưu trữ trong bộ nhớ tạm thời. C. Số lượng các trạng thái được tạo ra trong mỗi vịng lặp của thuật tốn. D. Số lượng các trạng thái được duyệt trong mỗi vòng lặp của thuật toán.
<b>2. Trong local beam search, số lượng trạng thái được xem xét tại mỗi bước là:</b>
a) 1
b) Nhiều hơn 1 c) Khơng giới hạn
<b>3. Điều gì xảy ra khi beam width bằng 1 trong local beam search?</b>
A. Thuật tốn tìm kiếm nhanh hơn. B. Thuật tốn tìm kiếm chính xác hơn.
C. Thuật tốn trở thành thuật tốn tìm kiếm tham lam.
D. Thuật tốn tìm kiếm có thể tìm kiếm được giải pháp tối ưu hơn.
<b>4. Điều gì xảy ra khi beam width tăng trong local beam search?</b>
A. Thuật tốn tìm kiếm nhanh hơn. B. Thuật tốn tìm kiếm chính xác hơn.
C. Thuật tốn tìm kiếm có khả năng rơi vào bẫy cục bộ ( tối ưu cục bộ) cao hơn. D. Thuật tốn tìm kiếm có thể tìm kiếm được giải pháp tối ưu hơn.
<b>→ Giải thích: Nhiều trạng thái (states) được kiểm tra đồng thời (explored</b>
simultaneously), tăng beam width có thể giúp thuật tốn tìm kiếm khám phá một phần lớn hơn của khơng gian tìm kiếm, nhưng đồng thời cũng tăng khả năng bị mắc kẹt trong điểm tối ưu cục bộ (Local Optimal). Vì beam width lớn hơn có nghĩa là có nhiều trạng thái được xem xét ở mỗi bước, điều chỉnh các con đường tìm kiếm dựa trên các giải pháp tốt nhất dẫn đến bị mắc kẹt trong các giải pháp tối ưu cục bộ và không thể đi đến giải pháp tối ưu tồn cục. Do đó, việc tăng beam width khơng làm cho thuật tốn tìm kiếm nhanh hơn hoặc chính xác hơn, mà tăng nguy cơ bị mắc kẹt trong một giải pháp phụ thuộc vào điểm tối ưu cục bộ.
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10"><b>b. Bài tập về nhà:</b>
<b>Bài 1: Bài toán người đi giao hàng - Traveling Salesman Problem – TSP </b>
Có một người giao hàng cần đi giao hàng tại n thành phố. Anh ta xuất phát từ một thành phố nào đó, đi qua các thành phố khác để giao hàng và trở về thành phố ban đầu. Mỗi thành phố chỉ đến một lần, và khoảng cách từ một thành phố đến các thành phố khác đã được biết trước. Hãy tìm một chu trình (một đường đi khép kín thỏa mãn điều kiện trên) sao cho tổng độ dài các cạnh là nhỏ nhất.
Định nghĩa bài toán gồm các phương thức sau:
1 show
Kế thừa từ lớp bài tốn.
Xuất ra ma trận chi phí đường đi và vị trí bắt đầu
2 init
Khởi tạo đối tượng TSP với n thành phố và ngẫu nhiên tạo ma trận chi phí di chuyển giữa các thành phố cùng với vị
trí bắt đầu.
3 goal
Kế thừa từ lớp bài tốn. Hiển thị con đường tốt nhất và chi phí để đi đường đó.
4 <sup>Randomize</sup><sub>_state</sub>
Kế thừa từ lớp bài tốn. Tạo ra mảng ngẫu nhiên (rand) n*n , mỗi phần tử A[i][j] là chi phí đi từ thành phố i đến j. Và
1 vị trí bắt đầu ngẫu nhiên (start_city)
5 cost <sup>Kế thừa từ lớp bài toán. Trả về tổng chi phí (đường đi) của</sup><sub>hành trình đang đi</sub>
6 check <sup>Kế thừa từ lớp bài tốn. Kiểm tra xem hành trình đang xét</sup><sub>có phải là tối ưu nhất</sub> 7 <sup>Generate</sup>
_sol_path cách thêm một thành phố vào cuối các con đường hiện tại.<sup>Kế thừa từ lớp bài toán. Sinh ra các con đường mới bằng</sup> 8 <sub>K_best_sol</sub> Kế thừa từ lớp bài toán. Chọn k con đường tốt nhất từ
danh sách paths.
Sau đó, định nghĩa lớp tác tử sử dụng phương pháp local beam search để giải quyết bài toán trên.
<b>Bài 2: Cho trước một tập các công việc (jobs) và một tập các máy (machines),</b>
mỗi cơng việc có thời gian thực hiện khác nhau trên từng máy. Yêu cầu tìm phân bố công việc trên các máy sao cho tổng thời gian thực hiện trên mỗi máy là nhất quán và là thấp nhất.
Đầu vào của bài toán bao gồm:
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">Một ma trận C có kích thước m x n, trong đó m là số lượng máy và n là số lượng công việc. Giá trị C[i,j] là thời gian thực hiện công việc j trên máy i.
Một số nguyên k là số lượng trạng thái con tối ưu được duy trì trong thuật tốn Local Beam Search.
Một số nguyên max_iter là số lần sinh ra trạng thái mới để cập nhật trạng thái hiện tại trong thuật toán Local Beam Search.
Đầu ra của bài toán là:
Một phân bố tối ưu của các công việc trên các máy, sao cho tổng thời gian thực hiện trên mỗi máy là nhất quán và là thấp nhất.
Định nghĩa bài toán gồm các phương thức sau:
1 <sup>__init__(self, n,</sup><sub>m, w)</sub>
Kế thừa từ lớp bài toán. Khởi tạo lớp với các đối số w: ma trận trọng số kích thước nxm mô tả trọng số của
mỗi công việc đối với từng máy chủ.
2 randomize_state
Tạo ra một ma trận m*n với giá trị ngẫu nhiên trong khoảng từ 0 đến 100. Trong đó, m là số lượng máy và n là
số lượng cơng việc. Tạo ngẫu nhiên k (có thể cho k từ 2->10)
3 cost
Kế thừa từ lớp bài toán. Tính tốn giá trị chi phí của một trạng thái bất kỳ, bao gồm tổng trọng số của tất cả các
công việc trên các máy chủ.
4 <sup>generate_neigh</sup><sub>bours</sub>
Kế thừa từ lớp bài toán. Phương thức tạo ra các trạng thái mới bằng cách hốn đổi các cơng việc giữa các máy chủ
trong trạng thái hiện tại.
Ví dụ, nếu trạng thái hiện tại là [1, 2, 3, 4, 5] thì hàm generate_neighbour có thể tạo ra các trạng thái mới như [1, 3, 2, 4, 5], [2, 1, 3, 4, 5], [1, 2, 4, 3, 5], vv. Tổng quát hơn, hàm này tạo ra một trạng thái mới bằng cách hoán đổi vị trí của hai phần tử bất kỳ trong trạng thái hiện tại.
5 goal được trạng thái tối ưu, hiển thị kết quả tìm được với giá trị<sup>Kế thừa từ lớp bài tốn. Phương thức được gọi khi tìm</sup> chi phí tương ứng.
6 get_best_states Kế thừa từ lớp bài tốn. Chọn ra k trạng thái tốt nhất trong danh sách trạng thái được cung cấp, dựa trên giá trị chi phí
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">tính được từ phương thức calculate_cost(). 7 <sup>Generate_sol_p</sup><sub>ath</sub> <sub>cách thêm một thành phố vào cuối các con đường hiện tại.</sub><sup>Kế thừa từ lớp bài toán. Sinh ra các con đường mới bằng</sup> 8 <sub>K_best_sol</sub> Kế thừa từ lớp bài toán. Chọn k con đường tốt nhất từ
danh sách paths.
</div>