Tải bản đầy đủ (.doc) (12 trang)

Bài toán suy diễn

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 (146.82 KB, 12 trang )

Các bài toán có yếu tố suy diễn
Nguyễn Xuân Huy
Trong lĩnh vực trí tuệ nhân tạo ta thường gặp một số bàitoán tin có chứa các yếu tố suy
diễn theo kiểu nếu X suy ra Y và Y suy ra Z thìX cũng suy ra Z. Các bài toán thuộc loại
này không khó lắm, tuy nhiên chúngthường đòi hỏi một số nhận xét tinh tế nhằm rút ngắn
quá trình suy diễn. Chúngta thử trình bày một cách giải vài bài thuộc loại này:
Bài toán Tham quan Một lớp học có n học sinh mang tên A, B, C... Giữa các nhóm họcsinh
có một số quan hệ tạm gọi là quan hệ ảnh hưởng, thí dụ, nếu ta viết AB> C thì có nghĩa là
hai bạn A và B đồng thời cùng thuyết phục thì có thể yêucầu bạn C tham gia một hoạt
động nào đó cùng với mình. Cho biết m quan hệ giữacác nhóm học sinh trong lớp. Giả sử
một nhóm X của lớp muốn rủ các bạn cùng lớpđi tham quan thành Cổ Loa chẳng hạn. Hãy
cho biết những bạn nào sẽ có mặt trongnhóm tham quan đó
Dữ liệu vào ghi trong tệp văn bản THAMQUAN.INP với cấu trúc như sau:
* Dòng đầu tiên: hai số tự nhiên n và m biểu thị sốhọc sinh trong lớp và số các quan hệ, 2
=< n =< 26, 1 =< m =<50.
* Tiếp theo là m dòng, mỗi dòng biểu thị một quan hệdạng X > Y.
* Dòng cuối cùng là danh sách các học sinh trongnhóm X.
Hiển thị trên màn hình danhsách các học sinh đi tham quan, kể cả các bạn trong nhóm X.
Thí dụ:
THAMQUAN.INP
Sau khi thực hiện chương trình ta sẽ thu được: ABCDEFH
Thí dụ trên cho chúng ta biết lớp học có 10 bạn học sinh mang tên là A B C D E F G H I
vàJ. Có 4 quan hệ giữa các nhóm như sau:
(B cóthể rủ được C)
(C vàE có thể rủ được A và F)
H > D (H cóthể rủ được D)
AC > BDEH (A vàC có thể rủ được B, D, E và H)
Hai bạn X = AB đứng ra rủ các bạn trong lớp đi tham quan. Vậy những aisẽ có mặt trong
buổi tham quan
Bài giải
Hãy tưởng tượng vào buổi sáng hôm tham quan, đến giờ hẹn ta chỉ gặp haibạn A và B. Hai


bạn này dĩ nhiên sẽ bàn nhau rủ thêm người cùng đi. Gọi X lànhóm bạn trẻ đứng ra rủ mọi
người lúc đầu và gọi Y là nhóm bạn trẻ sẽ cùng nhaulên đường tham quan.
Đầu tiên ta có Y := X.
Vì B có thể rủ được C như mô tả trong quan hệ (1) nênlát sau C sẽ có mặt. Ta có:
Y = X +[C] = [A,B,C].
Dấu cộng ở đây được hiểu là phép hội hai tập hợp. Cácphần tử của một tập được liệt kê
giữa hai dấu ngoặc vuông.
Bây giờ trong nhóm đã có A và C do đó, theo quanhệ (4) hai bạn này sẽ rủ thêm được D,
Evà H. Ta có Y = [A,B,C,D,E,H]. Lại theo quan hệ (2), hai bạn C và Esẽ đi rủ thêm được
F, do đó Y = [A,B,C,D,E,F,H]. Đến đây ta thấycác bạn không còn rủ thêm được ai nữa.
Vậy nhóm đi tham quan sẽ là: Y =[A,B,C,D,E,H,F].
Để tăng tốc độ xử lý ta có nhận xét thêm sau đây: Mỗiquan hệ chỉ sử dụng tối đa một lần,
do đó ta sẽ đánh dấu quan hệ đã dùng rồi.
Tổ chức dữ liệu. Ta sẽ dùng kiểu tập hợp để biểu diễncác nhóm học sinh.
Trước hết ta định nghĩ kiểu Ten gồm các tên học sinhtừ A đến Z.
Type Ten = 'A'..'Z';
Tiếp theo ta định nghĩa kiểu nhóm là tập hợp các tên:
KieuNhom = set of Ten;
Sau đó ta định nghĩa kiểu mảng các quan hệ như là mộtmảng các tập. Kiểu mảng này sẽ
dùng để biểu diễn vế trái và vế phải của mỗiquan hệ.
Type MangQuanHe = array[0..MN] ofKieuNhom;
Chương trình sử dụng các biến sau đây:
var f: text;
lop: KieuNhom;
n: integer; { so hoc sinh }
m: integer; { so quan he }
trai,phai: MangQuanHe;
s: string;
x, y: KieuNhom;
dau: array[0..mn] of byte;

Tệp f dùng để quản lý dữ liệu vào (tệp THAMQUAN.INP).Biến lop dùng để chứa tên học
sinh của lớp. Sau khi biết giá trị n là số họcsinh, biến lop kiểu tập sẽ được khởi trị như sau:
lop:=[ ];
for i:=0 to n-1 do
lop:=lop+[chr(ord('A')+i)];
Biến m chứa số lượng các quan hệ. Hai mảng traivà phai chứa các tập ở mỗi vế trái và
phải tương ứng của mỗi quan hệ.Với thí dụ đã cho, sau khi đọc dữ liệu từ tệp
THAMQUAN.INP ta thu được
n=10, m=4,
trai[1]=[B], phai[1]=[C]
trai[2]=[C,E], phai[2]=[A,F]
trai[3]=[H], phai[3]=[D]
trai[4]=[A,C], phai[4]=[B,D,E,H]
Thủ tục Ru(x,y) cho biết nhóm x rủ được nhóm y khi đósẽ hoạt động như sau.
procedure Ru(x: KieuNhom; var y:KieuNhom);
var truoc: KieuNhom;
i: integer;
begin
y:=x;
for i:=1 to m do dau[i]:=0;
repeat
truoc:=y;
for i:=1 to m do
if dau[i] = 0 then
if (trai[i] <= y) then
begin
y:=y+phai[i];
dau[i]:=1;
end;
until y=truoc;

end;
Biến truoc dùng để lưu lại nhóm học sinh cómặt trước khi thực hiện một lần duyệt toàn bộ
các quan hệ để kết nạp thêm họcsinh. Nếu sau một lần duyệt như vậy mà số học sinh trong
nhóm không được tăngthêm, tức là y=truoc thì ta dừng thuật toán.
Để đọc dữ liệu từ tệp THAMQUAN.INP vào các biến củachương trình ta dùng thủ tục Doc
sau đây:
Procedure Doc;
var i: integer;
begin
assign(f,fn); {mo tep THAMQUAN.INP}
reset(f);
readln(f,n,m); {Doc cac gia tri n va m}
lop:=[ ]; {Lap danh sach lop gom n hoc sinh}
for i:=0 to n-1 do
lop:=lop+[chr(ord('A')+i)];
for i:=1 to m do {Doc cac quan he}
begin
readln(f,s);
NapQuanHe(i);
end;
readln(f,s); {Doc dong chua nhom x: nhung nguoi dung ra ru nguoikhac}
StrToSet(s,x); {chuyen string s sang kieu tap x}
close(f);
end;
trong đó tên tệp fn được khai báo như một hằng:
fn = 'THAMQUAN.INP';
Thu tuc StrToset(s,x) chuyển xâu ký tự s sang dạngtập x như sau. Đọc lần lượt từng ký tự
s[i] của s. Đó là tên học sinh. Nếu tênnày có trong lớp thì đưa vào nhóm x. Việc kiểm tra
này chỉ cần khi nào trongxâu s có chứa các ký tự lạ như dấu cách chẳng hạn.
Procedure StrToSet(s:string;var x:KieuNhom);

Var i:byte;
begin
x:= [ ];
for i:=1 to length(s) do
if (s[i] in lop) then
x:=x=[s[i]];
end;

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×