, trong trường hợp ngược lạ
Các phương pháp giải quyết vấn đề cơ bảnCác phương pháp giải quyết vấn đề cơ bản
2.3.3. Tìm kiếm lời giải trên đồ thị Và/Hoặc
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Tương tự như trong không gian trạng thái, ta cũng có các phương pháp sau: thái, ta cũng có các phương pháp sau:
Tìm kiếm theo chiều rộng.
Tìm kiếm theo chiều sâu.
Tìm kiếm cây lời giải có giá nhỏ nhất.
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Các quá trình này khác hẳn với các quá trình lựa chọn trong không gian trạng thái.
Thay cho việc tìm kiếm đỉnh thoả mãn điều kiện đích, chúng ta phải tiến hành tìm kiếm đồ thị lời giải.
phải kiểm tra đỉnh đầu có giải được hay không, nếu đỉnh đầu giải được thì kết thúc, ngược lại tiếp tục xét các nút.
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Nếu đỉnh đang xét không phải là đỉnh kết thúc và nó là đỉnh lá, tức là đỉnh không giải được. Lúc này phải kiểm tra đỉnh đàu có phải không giải được hay không, nếu đúng thì dừng, ngược lại tiếp tục tìm kiếm.
Trước khi tìm kiếm lời giải trong đồ thị
VÀ/HOẶC, chúng ta xây dựng các hàm kiểm tra một đỉnh n nào đó tại thời điểm đang xét có giải được hay không giải được
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Function giaiduoc(n):boolean;
{ If <n so cap> then giaiduoc =true else if T(n)<>null then
if T(n)⊂VA then giaiduoc =AND(giaiduoc(m)) với m∈T(n) else giaiduoc =OR(giaiduoc(m)) với m∈T(n)
else giaiduoc =false; }
Function khonggd(n):boolean; { If T(n)<>null then
if T(n)⊂VA then khonggd =OR(khongd(m)) với m∈T(n) else khonggd =AND(khongd(m)) với m∈T(n)
else if <T(n) khong so cap> then khonggd =true else khonggd =false;
}
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
a.Phương pháp tìm kiếm chiều rộng
Procedure TKR; { Push(n0, MO);
While MO<>null do
{ n=pop(MO); push(DONG, n);
if T(n)<>null then for m ∈T(n) do { push(m, MO);
if T(m)=null then if giaiduoc(m) then
if giaiduoc(n0) then exit; else for k∈MO do
if giaiduoc(k) then MO=MO-[k] Else If khonggd(m) then
If khonggd(n0) then Exit; Else For k∈MO do
if khonggd(k) then MO=MO-[k] }
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Nhận xét:
Nếu tồn tại cây lời giải thì thủ tục tìm kiếm rộng sẽ dừng và cho kết quả là cây lời giải có độ cao nhỏ nhất.
Ví dụ: Xét đồ thị
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Các đỉnh kết thúc là các đỉnh đánh dấu *. Quá trình tìm kiếm lời giải phương pháp tìm kiếm rộng có thể trình bày:
n T(n) MO DONG A A B, C, D B C D A B E*, F C D F A B C G D F G A B C D H*, I F G I A B C D F J G I J A B C D F G K0 I J A B C D F G
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
b.Tìm kiếm theo chiều sâu
Ví dụ: Xét đồ thị
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Quá trình tìm theo chiều sâu tiến hành như sau:
n T(n) MO DONG
A
A B, C B C
C F* , G BG
G L*, M* : giải được ⇒ A giải được
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Cây lời giải
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
c.Tìm kiếm cây lời giải cực tiểu
Cây G=(V, E) biểu diễn sự phân rã của bài toán gốc n0.
Ứng với mỗi phép chuyển bài toán n sang bài toán v tốn chi phí c(u,v).
c: E R+
(u,v) c(u,v)
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Tìm cây lời giải có tổng chi phí bé nhất.
với KGTT, sử dụng hàm đánh giá để sắp thứ tự các nút trong MO trước khi xử lý và hàm h(n) là giá của đường đi tối ưu từ đỉnh n→DICH. Trong cây VÀ/HOẶC đó chính là khái niệm giá tối ưu của cây lời giải với gốc là đỉnh n đã cho.
Đối với đỉnh n∈V, giá của n được tính phụ thuộc vào quy ước chọn giá chung của đồ thị. Có 2
loại giá: giá cực đại (max) và giá tổng cộng (∑).
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Giá tối ưu của cây lời giải có gốc n như sau:
Nếu n là đỉnh kết thúc thì h(n) = 0
Nếu n không phải là đỉnh kết thúc và n là đỉnh hoặc có tập T(n) = {n1,. . .,nk} khác rỗng thì h(n) = min(c(n,ni)+h(ni)).
Nếu n không phải là đỉnh kết thúc và n là đỉnh và có tập T(n) = {n1,. . .,nk} khác rỗng thì:
Đối với giá tổng cộng
Đối với giá cực đại
2.3.3. Tìm kiếm lời giải trên đồ thị Và/Hoặc
∑= = + = k i i i h n n n c n h 1 )) ( ) , ( ( ) ( )) ( ) , ( ( ) (n c n ni h ni h = ΜΑΧ +
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
h(n) không xác định đối với những đỉnh không giải được.
Tương tự như trong không gian trạng thái ta xác đinh ước lượng của h là h0 tại các đỉnh không phải là đỉnh không giải được.. Cây lời giải được xây dựng dần dần trong quá trình mở rộng cây lựa chọn, tại mỗi thời điểm các nút lá của nó thuộc một trong ba dạng sau:
Các đỉnh kết thúc.
Các đỉnh lá không phải là đỉnh kết thúc.
Các đỉnh chưa được xử lý.
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Trong cây tìm kiếm, ở mỗi bước có thể chứa một tập các cây con có gốc n0 sao cho chúng có thể trở thành phần trên của cây lời giải đầy đủ. Ta gọi các cây này là cây lời giải tiềm tàng gốc n0.
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Như vậy bài toán tìm kiếm cây lời giải cực tiểu có thể đưa về hai bài toán con:
Bài toán 1. Xác định ước lượng h0(n)
(1) n là đỉnh lá
Nếu n là đỉnh kết thúc thì h0(n) = 0
Nếu n không phải là đỉnh kết thúc thì h0(n) không xác đinh (có thể gán giá trị ∞ )
Nếu n chưa được xử lý thì h0(n) nhận một giá trị ước lưọng dựa trên thông tin về bài toán
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
(2) n không phải là đỉnh lá, T(n) = {n1,…,nk}
Nếu n là đỉnh Hoặc thì h0(n) = min(c(n,ni)+h(ni))
Nếu n là đỉnh Và thì
Đối với giá tổng cộng
Đối với giá cực đại
h0(n) = Max(c(n,ni)+h0(ni))
2.3.3. Tìm kiếm lời giải trên đồ thị Và/Hoặc
∑= = + = k i i i h n n n c n h 1 0 0( ) ( ( , ) ( ))
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Bài toán 2. Xây dựng cây lời giải tiềm tàng G’ mô tả quá trình chuyển bài toán n0 về bài toán n. Gọi G’ = (V’, E’) là đồ thị con của G với tập đỉnh V’ xác định như sau:
n0 ∈ V’
Với mỗi n ∈ V’ có các đỉnh con n1,…, nk.
Nếu n là đỉnh hoặc thì chọn đỉnh con ni vào V’ sao cho c(n,ni) + h0(ni) nhỏ nhất và
khonggd(ni) = false.
Nếu n là đỉnh và thì chọn tất cả các đỉnh ni vào
2.3 Tìm kiếm lời giải trên đồ thị và/hoặc
Thuật toán.
Input: Cây và hoặc G = (V,E) với gốc n0. Giá trị ước lương ban đầu h0. Tập đỉnh kết thúc. c: E R+ và laọi chi phí (tổng công hoặc cực đại)
Output: Cây lời giải tối ưu.
Method:
push(MO,n0);
while MO <> null do
{ Xây dựng cây tiềm tàng G’;
n = pop(MO ∩Lá(G’); Push(DONG,n); if n là đỉnh kết thúc then
{ if giaiduoc(n0) then exit; // Cây lời giải là G’ for k ∈MO do
if giaiduoc(k) then MO := MO – [k]; }
else if T(n) <> null then for m ∈ T(n) do { push(MO,m);
Tính lại h0(m); }
else if khonggd(n) then
{ if khonggd(n0) then exit; for k ∈ MO do
if khonggd(k) then MO = MO – [k]; for m ∈ DONG do Tính lại h0(m); }
Cout<<“khong co loi giai;