Tài liệu Thuật Toán Và Thuật Giải 13 pdf

5 323 0
Tài liệu Thuật Toán Và Thuật Giải 13 pdf

Đang tải... (xem toàn văn)

Thông tin tài liệu

Gọi lượng nước chứa trong bình Y là y (0<=y<=VY) Như vậy, điều kiện kết thúc của bài toán sẽ là : x = z hoặc y = z Điều kiện đầu của bài toán là : x = 0 và y=0 Quá trình giải được thực hiện bằng cách xét lần lượt các luật sau, luật nào thỏa mãn thì sẽ được áp dụng. Lúc này, các luật chính là các "kinh nghiệm" hay tri thức mà ta đã chuyển giao cho máy tính. Sau khi áp dụng luật, trạng thái của bài toán sẽ thay đổi, ta lại tiếp tục xét các luật kế ti ếp, nếu hết luật, quay trở lại luật đầu tiên. Quá trình tiếp diễn cho đến khi đạt được điều kiện kết thúc của bài toán. Ba luật này được mô tả như sau : (L1) Nếu bình X đầy thì đổ hết nước trong bình X đi. (L2) Nếu bình Y rỗng thì đổ đầy nước vào bình Y. (L3) Nếu bình X không đầy và bình Y không rỗng thì hãy trút nước t? bình Y sang bình X (cho đến khi bình X đầy hoặc bình Y hết nước). Trên thực tế, lúc đầu để giải trườ ng hợp tổng quát của bài toán này, người ta đã dùng đến hơn 15 luật (kinh nghiệm) khác nhau. Tuy nhiên, sau này, người ta đã rút gọn lại chỉ còn 3 luật như trên. Bạn có thể dễ dàng chuyển đổi cách giải này thành chương trình như sau : . x := 0; y := 0; WHILE ( (x <> z) AND (y<>z) ) DO BEGIN IF (x = Vx) THEN x := 0; IF (y = 0) THEN (y:= Vy); IF (y > 0) THEN BEGIN k:= min(Vx - x, y); x := x + k; y := y - k; END; END; . Thử "chạy" chương trình trên với số liệu cụ thể là : Vx = 3, Vy = 4 và z = 2 Ban đầu : x = 0, y = 0 Luật (L2) -> x = 0, y = 4 Luật (L3) -> x = 3, y = 1 Luật (L1) -> x = 0, y = 1 Luật (L3) -> x = 1, y = 0 Luật (L2) -> x = 1, y = 4 Luật (L3) -> x = 3, y = 2 3 luật mà chúng ta đã cài đặt trong chương trình ở trên được gọi là cơ sở tri thức. Còn cách thức tìm kiếm lời giải bằng cách duyệt tuần tự từng luật và áp dụng nó được gọi là động cơ suy diễn. Chúng ta s ẽ định nghĩa chính xác hai thuật ngữ này ở cuối mục. Người ta đã chứng minh được rằng, bài toán đong nước chỉ có lời giải khi số nước cần đong là một bội số của ước số chung lớn nhất của thể tích hai bình. z = n ´ USCLN(VX, VY) (với n nguyên dương) Cách giải quyết vấn đề theo kiểu này khác so với cách giải bằng thuật toán thông thường là chúng ta không đưa ra một trình tự giải quy ết vấn đề cụ thể mà chỉ đưa ra các quy tắc chung chung (dưới dạng các luật), máy tính sẽ dựa vào đó (áp dụng các luật) để tự xây dựng một quy trình giải quyết vấn đề. Điều này cũng giống như việc chúng ta giải toán bằng cách đưa ra các định lý, quy tắc liên quan đến bài toán mà không cần phải chỉ ra cách giải cụ thể. Vậy thì điểm thú vị nằ m ở điểm nào? Bạn sẽ có thể cảm thấy rằng chúng ta vẫn đang dùng tri thức "cứng" ! (vì các tri thức vẫn là các câu lệnh IF được cài sẵn trong chương trình). Thực ra thì chương trình của chúng ta đã "mềm" hơn một tí rồi đấy. Nếu không tin, các bạn hãy quan sát phiên bản kế tiếp của chương trình này. FUNCTION DK(L INTEGER):BOOLEAN; BEGIN CASE L OF 1 : DK := (x = Vx); 2 : DK := (y = 0); 3 : DK := (y>0); END; END; PROCEDURE ThiHanh(L INTEGER):BOOLEAN; BEGIN CASE L OF 1 : x := 0; 2: y := Vy; 3 : BEGIN k := min(Vx-x,y); x := x+k; y := y-k; END; END; END; CONST SO_LUAT = 3; BEGIN WHILE (x<>z) AND (y<>z) DO BEGIN FOR i:=1 TO SO_LUAT DO IF DK(L) THEN ThiHanh(L); END; END. Đoạn chương trình chính cũng thi hành bằng cách lần lượt xét qua 3 lệnh IF như chương trình đầu tiên. Tuy nhiên, ở đây, biểu thức điều kiện được thay thế bằng hàm DK và các hành động ứng với điều kiện đã được thay thế bằng thủ tục ThiHanh. Tính chất "mềm" hơn của chương trình này thể hiện ở chỗ, nếu muốn bổ sung "tri thức", ta ch ỉ phải điều chỉnh lại các hàm DK và ThiHanh mà không cần phải sửa lại chương trình chính. Bây giờ hãy giả sử rằng ta đã có hàm và thủ tục đặc biệt sau : FUNCTION GiaTriBool(DK : String) : BOOLEAN; PROCEDURE ThucHien(ThaoTac : String) ; hàm GiaTriBool nhận vào một chuỗi điều kiện, nó sẽ phân tích chuỗi, tính toán rồi trả ra giá trị BOOLEAN của biểu thức này. Ví dụ : GiaTriBoolean(‘6<7’) sẽ trả ra FALSE Thủ tục ThucHien cũng nhận vào một chuỗi, nó cũng s ẽ phân tích chuỗi rồi tiến hành thực hiện những hành động được miêu tả trong chuỗi này. Với hàm và thủ tục này, chương trình của chúng ta sẽ như sau : CONST SO_LUAT = 3; TYPE Luat RECORD DK : String; ThiHanh : String;   . k; y := y - k; END; END; . Thử "chạy" chương trình trên với số liệu cụ thể là : Vx = 3, Vy = 4 và z = 2 Ban đầu : x = 0, y = 0 Luật (L2) ->

Ngày đăng: 15/12/2013, 02:15

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan