Thủ tục cắt tỉa alpha – beta (α-β prunning)

Một phần của tài liệu Tổng hợp các Đề thi tuyển sinh Cao học nghành Công nghệ thông tin; Môn thi: Ngôn ngữ lập trình (Trang 33 - 46)

III. SỬ DỤNG HEURISTIC TRONG CÁC TRÒ CHƠI

III.3. Thủ tục cắt tỉa alpha – beta (α-β prunning)

Minimax yêu cầu phải có sự phân tích qua hai bước đối với không gian tìm kiếm: Bước đầu truyền xuống đến độ sâu của lớp áp dụng heuristic và bước sau để truyền ngược các giá trị trên cây. Minimax lần theo tất cả các nhánh trong không gian bao gồm cả những nhánh mà một thuật toán thông minh hơn có thể bỏ qua hay tỉa bớt. Các nhà nghiên cứu trong lĩnh vực chơi game đã xây dựng một kỹ thuật tìm kiếm gọi là cắt tỉa alpha –beta nhằm nâng cao hiệu quả tìm kiếm trong các bài toán trò chơi hai đối thủ.

Ý tưởng của tìm kiếm alpha – beta rất đơn giản: Thay vì nếu như tìm kiếm toàn bộ không gian đến một độ sâu lớp cố định, tìm kiếm alpha – beta thực hiện theo kiểu tìm kiếm sâu. Có hai giá trị, gọi là alpha và beta được tạo ra trong quá trình tìm kiếm. Giá trị alpha liên quan với các nút MAX và có khuynh hướng không bao giờ giảm. Ngược lại giá trị beta liên quan đến các nút MIN và có khuynh hướng không bao giờ tăng. Giả sử có giá trị alpha của một nút MAX là 6, MAX không cần phải xem xét giá trị truyền ngược nào nhỏ hơn hoặc bằng 6 có liên quan với một nút MIN nào đó bên dưới. Alpha là giá trị thấp nhất mà MAX có thể nhận được sau khi cho rằng MIN cũng sẽ nhận giá trị tốt nhất của nó. Tương tự nếu MIN có giá trị beta là 6 nó cũng không cần xem xét các nút nằm dưới nó có giá trị lớn hơn hoặc bằng 6.

Để bắt đầu thuật toán tìm kiếm alpha – beta, ta đi xuống hết độ sâu lớp theo kiểu tìm kiếm sâu, đồng thời áp dụng đánh giá heuristic cho một trạng thái và tất cả các trạng thái anh em của nó. Giả thuyết tất cả đều là nút MIN. Giá trị tối đa của các nút MIN này sẽ được truyền ngược lên cho nút cha mẹ (là một nút MAX). Sau đó giá trị này được gán cho ông bà của các nút MIN như là một giá trị beta kết thúc tốt nhất. Tiếp theo thuật toán này sẽ đi xuống các nút cháu khác và kết thúc việc tìm kiếm đối với nút cha mẹ của chúng nếu gặp bất kỳ một giá trị nào lớn hơn hoặc bằng giá trị beta này. Quá trình này gọi là cắt tỉa beta (β cut). Cách làm tương tự cũng được thực hiện cho việc cắt tỉa alpha (α cut) đối với các nút cháu của một nút MAX.

Hai luật cắt tỉa dựa trên các giá trị alpha và beta là:

1. Quá trình tìm kiếm có thể kết thúc bên dưới một nút MIN nào có giá trị beta nhỏ hơn hoặc bằng giá trị alpha của một nút cha MAX bất kỳ của nó.

2. Quá trình tìm kiếm có thể kết thúc bên dưới một nút MAX nào có giá trị alpha lớn hơn hoặc bằng giá trị beta của một nút cha MIN bất kỳ của nó.

Việc cắt tỉa alpha – beta như vậy thể hiện quan hệ giữa các nút ở lớp n và các nút ở lớp n+2 và do quan hệ đó toàn bộ các cây con bắt nguồn ở lớp n+1 đều có thể loại khỏi việc xem xét.

Chú ý rằng giá trị truyền ngược thu được hoàn toàn giống như kết quả Minimax, đồng thời tiết kiệm được các bước tìm kiếm một cách đáng kể.

A có β = 3 (Trị nút A sẽ không lớn hơn 3) B bị cắt tỉa β, vì 5 > 3

C có α = 3 (Trị nút C sẽ không nhỏ hơn 3) D bị cắt tỉa α, vì 0 < 3

E bị cắt tỉa α, vì 2 < 3 Trị nút C là 3

Hình 4.9 – Thực hiện giải thuật cắt tỉa alpha – beta

TỔNG KẾT CHƯƠNG IV: Các heuristic tìm kiếm đã được giới thiệu thông qua các trò chơi đơn giản như trò đố 8 ô, Tic-tac-toe, … và cũng đã được phát triển đến các không gian bài toán phức tạp hơn. Chương này cũng đã trình bày việc áp dụng heuristic cho các trò chơi đối kháng có hai người chơi, dùng cách rút gọn tối thiểu trên độ sâu lớp và cắt tỉa alpha - beta để thực hiện việc tính trước các nước đi và dự đoán hành vi của đối thủ. Việc áp dụng các heuristic này đã làm cho không gian bài toán trở nên ngắn gọn hơn, thời gian tìm kiếm một lời giải có thể chấp nhận được là tối thiểu và quá trình tìm kiếm vì thế cũng trở nên đơn giản hơn khá nhiều. Phần chương V tiếp theo, chúng ta sẽ xem xét các kỹ thuật cao câp hơn cho việc cài đặt các thuật toán.

IV BÀI TẬP CHƯƠNG IV

IV.1. Xét bài toán trò đố 8 ô như sau:

Start Goal

1 2 3 8 4 7 6 5 1 2 3

6 7 8 5 4

Dùng các hàm lượng giá heuristic sau, hãy

triển khai không gian trạng thái của bài toán theo giải thuật leo núi đến mức 5:

a) h1 = số lượng các vị trí sai khác so với trạng thái goal.

b) h2 = tổng số độ dời ngắn nhất của các ô về vị trí đúng (khoảng cách Manhattan) IV.2. Trong cây tìm kiếm dưới đây, mỗi nút có 2 giá trị đi kèm: giá trị bên trái của nút (in

nghiêng) thể hiện giá trị heuristic của nút, và giá trị bên phải nút thể hiện thứ tự nút được duyệt qua. Với mỗi chiến

lược tìm kiếm dưới đây, hãy viết danh sách thứ tự các nút được duyệt, so sánh và cho biết ta đã dùng giải thuật tìm kiếm nào trên cây :

a) Tìm kiếm rộng BFS b) Tìm kiếm sâu DFS

c) Tìm kiếm tốt nhất đầu tiên d) Tìm kiếm leo núi

IV.3. Thực hiện giải thuật Minimax trên cây sau đây:

A 1

3 B 7 7 C 2 6 D 3

6 E 8 4 F 6 5 G 4

5 I 5 2 H 9

0

3 5

7

5 7 8

4

MAX A

B C

E

D F G H

J K L

I

M N

Sẽ có gì khác biệt nếu như ta dùng giải thuật cắt tỉa alpha – beta để định trị nút gốc cho cây?

IV.4. Hãy áp dụng giải thuật cắt tỉa alpha-beta cho các cây sau đây. Cho biết các nhánh được cắt là alpha-cut hay beta-cut và giá trị nút gốc sau khi định trị:

a)

A

G B

E D

I 7

C

H A F

J 6 K 8 L 3 M 5 N 4 P 7 Q 5

MAX

A

H B

F

D

I 7 G

6

2 9 3

MAX

E

C

8 J

6 5 3 1 5 2 4 7 9 4

b)

Võ Huỳnh Trâm – Trần Ngân Bình

79

Chương IV ...63

TÌM KIẾM HEURISTIC ...63

I. MỞ ĐẦU ...64

II. THUẬT TOÁN TÌM KIẾM HEURISTIC ...67

II.1. Tìm kiếm leo núi (Hill climbing – Pearl 1984)...67

II.2. Tìm kiếm tốt nhất đầu tiên (Best – first – search)...67

II.3. Cài đặt hàm đánh giá heuristic (heuristic evaluation function) ...69

II.4. Tính khả chấp, tính đơn nhất và khả năng cung cấp thông tin của heuristic ....70

III. SỬ DỤNG HEURISTIC TRONG CÁC TRÒ CHƠI...72

III.1. Thủ tục minimax ...72

III.2. Áp dụng minimax đến độ sâu lớp cố định...73

III.3. Thủ tục cắt tỉa alpha – beta (α-β prunning) ...75

BÀI TẬP CHƯƠNG IV...77

ĐẠI SỐ BOOLE

1. Vẽ mạch logic cho các hàm sau a. f(x,y,z)=xyz+xyz

b. f(x,y,z)=xyz+xyz+xyz+xyz+xyz

c. f(x,y,z)=xyz+xyz+xyz+xyz+xyz+xyz

2. Dùng phương pháp Quine-McClusky, tìm dạng chuẩn tắc tối thiểu của các hàm booble trên và vẽ mạch logic các dạng tối thiểu tìm được.

Đề thi tuyển sinh cao học ngành công nghệ thông tin Môn: Ngôn ngữ lập trình

Thời gian 180 phút - Không được sử dụng tài liệu

Bài 1. Cho dãy số nguyên dương khác nhau từng đôi một A=a1,a2,…,an, n<=100 và hoán vị P = [p1,p2,…,pn] của các số [1,2,…,n]

Hãy viết các chương trình con thực hiện các công việc sau đây:

1. Đọc các dãy số A, P từ bàn phím và kiểm tra tính đúng đắn của dữ liệu nhập vào.

2. Tạo ra một nội dung mới của dãy A=a[p1],…,a[pn] mà không dùng mảng phụ nào khác ngoài A và P đã cho.

Ví dụ, với dãy A=8,6,2,1,3,4 và hoán vị P=5,4,6,2,1,3 ta có nội dung mới của dãy A=3,1,4,6,8,2. Viết hai phương án lặp và đệ quy.

3. Với dãy A đã cho, hãy xác định một hoán vị nào đó P sao cho a[p1]<=…<=a[pn].

Ví dụ, với dãy A như trên, ta có P=4,3,5,6,2,1 thỏa mãn tính chất trên. Viết hai phương án đệ quy và lặp.

Bài 2. Khai báo kiểu của một danh sách tuyến tính móc nối và một cây nhị phân như sau:

Type tro=^ptu;

Ptu=record

Gtri:integer;

Tiep:tro;

End;

Pointer=^nut;

Nut=record

Value:integer;

Trai,phai:pointer;

End;

Var ds:tro;

Goc:point;

Viết các chương trinh con thực hiện các công việc sau đây:

1. Procedure Dungcay(ds:tro; var goc:pointer);

Nhằm xây dựng cây nhị phân tìm kiếm có gốc được trỏ bởi goc trên cơ sở các phần tử của danh sách ds đã cho. Giả thiết rằng các phần tử của danh sách có giá trị khác nhau từng đôi một.

Ví dụ, với danh sách các phần tử:

8 3 9 4 1 10 Ta xây dựng được cây nhị phân tìm kiếm như sau:

8

3 9

1 4 10

2. Procedure cay_NP_min(ds:tro;var goc:pointer);

Nhằm xây dựng cây nghị phân tìm kiếm có gốc được trỏ bởi goc, tưng ứng với một cây hoán vị nào đó của các phân tử trong danh sách ds sao cho độ cao của cây nhận được là nhỏ nhất.

Bài 3. Trên đĩa có một tệp văn bản (TEXT) có tên là ‘VB.TXT’. Mỗi dòng có độ dài không quá 80, gồm nhiều từ. Mỗi từ là một dãy liên tiếp các ký tự được phân cách bằng dấu trắng, dấu phẩy, dấu chấm, dấu chấm phẩy, dấu hai chấm, dấu chấm than, dấu hỏi, dấu ngoặc đơn đóng và dấu ngoặc đơn mở.

Lập chương trình con thực hiện các công việc sau đây:

1. Đọc các dòng của tệp văn bản.

2. Với mỗi dòng, đếm số từ xuất hiện trong đó và đưa ra màn hình kết quả tính được.

3. Đưa ra màn hình từ dài nhất trong văn bản.

ĐỀ THI MÔN TIN HỌC

Thời gian 120 phút Bài 1: Cho thủ tục viết trên PASCAL chuẩn như sau:

Procedure R(x,y:integer);

Begin

If y>0 then Begin

X:=x+1;

Y:=y-1;

writeln(x,y);

R(x,y);

writeln(x,y);

End;

End;

a. Thực hiện thủ tục trên với lời gọi R(5,3). Cho biết các kết quả in ra.

b. Kết quả sẽ ra sao nếu x không phải là tham số trị mà là tham số biến (thêm từ khóa var cho riêng x trong sanh sách tham số) và ta thực hiện các lệnh x:=5; R(x,3);

Bài 2. Xét các cây nhị phân có nút gán nhản bởi các chữ cái viết hoa.

a. Hãy vẽ tất cả các cây nhị phân có dãy duyết theo thứ tự giữa là ABCD.

b. Có chăng một cây nhị phân mà các dãy duyệt theo các thứ tự giữa và thứ tự sau lần lượt là CADB và CBAD? Nói rõ vì sao?

c. Giả sử các dãy duyệt là các xâu ký tự (chữ cái) đọc vào từ bàn phím. Hãy viết một hàm (FUNCTION) cho phép kiểm tra với hai xâu uv đã cho (với độ dài không định trước), thì đó có phải là các dãy duyệt theo các thứ tự giữa và sau của cùng một cây nhị phân không. Hàm này trả lại giá trị True hay False.

Bài 3. Trong hệ soạn thảo, văn bản đang xử lý được lưu ở bộ nhớ trong dưới dạng một danh sách nối kép và lộn vòng như sau:

xxxx

Dòng 1

Dòng 2

Dòng n

… Danhsach

xxxx

Danhsach

Trường hợp chung

Trường hợp văn bản rỗng

Chú ý rằng các phần tử được nối kép bởi hai con trỏ ngược nhau và tạo thành vòng kín. Ngoài ra để tránh phiền phức khi xử lý ở đầu hay cuối văn bản, người ta đưa thêm vào dòng thứ nhất một phần tử giả không chứa văn bản (gọi là lính canh).

Khai báo của danh sách này như sau:

Type str80=String[80];

Tro=^dongvb;

Dongvb=record

Truoc:tro;

Dong:str80;

Sau:tro;

End;

Var danhsach:tro;

Giả sử danh sách đã được khởi tạo với một văn bản rỗng, nghĩa là chỉ gồm một phần tử là lính canh và con trỏ danhsach trỏ vào lính canh đó.

a. Gọi Bloc(db,cb) là một khối liền nhau các phần tử có chứa văn bản kể từ phần tử trỏ bới db đến phần tử trỏ bởi cb. Hãy viết một thủ tục dưới dạng:

Procedure chuyenBl(ds,db,cb,noiden:tro);

Cho phép trong danh sách trỏ bởi ds, chuyển dời Bloc(db,cb) không rỗng tới sau phần tử trỏ bởi noiden (noiden không ở trong Bloc).

b. Hãy viết một thủ tục dưới dạng:

Procedure chepBl(ds,db,cb,noiden:tro);

Cho phép trong danh sách trỏ bởi ds, chép lại (mà không xóa) Bloc(bd,cb) không rỗng tới sau phần tử trỏ bởi noiden (noiden không ở trong Bloc).

ĐỀ THI IFI 9/96

Môn thi: Tin học

Bài 1. Hãy cho biết kết quả hiển thị của chương trình sau đây và giải thích kết quả đó.

Program IFI(output);

Var i:integer;

A:array[1..10]of integer;

Function mot:integer;

Begin i:=i+1;

Mot:=1;

End;

Begin

For i:=1 to 10 do a[i]:=i*1;

i:=5;

a[mot+i]:=a[mot+i];

For i:=1 to 10 do write(output,a[i]:4);

Writeln;

End.

Bài 2. Hãy viết một chương trình đệ quy cho phép sản sinh và hiển thị tất cả dãy n bit (tức là dãy các số 0,1 có độ dài n, chằng hạn lấy n = 10).

Bài 3. Người ta biểu diễn các thông tin của một thư viện dưới dạng một cây tìm kiếm nhị phân với khóa là TenTG (tên tác giả). Mỗi nút của cây là một bản ghi gồm trường TenTG và 4 trường con trỏ: hai con trỏ TraiPhai lần lượt trỏ tới các nút con trái và nút con phải, hai nút DauCuoi lần lượt trỏ tới phần tử đầu và phần tử cuối của một danh sách tuyến tính móc nối dùng để ghi nhận các sách có trong thư viện của tác giả đó. Mỗi phần tử của danh sách này là một bản ghi gồm có hai trường: trường TenSach và trường TiepTheo. Có thể hình dung cây như hình vẽ sau:

Goc Nam

Lien Yen ×

× An × × Long × × Sinh ×

…... …...

…...

…...

…...

Người ta cho khai báo cấu trúc dữ liệu nói trên như sau:

Type str25=string[25];

Trosach=^sach;

Sach=record

Tensach:string;

Tieptheo:trosach;

End;

troTg=^tacgia;

tacgia=record

trai:troTg;

tentg:str25;

dau,cuoi:trosach;

phai:troTg;

end;

var goc:troTg;

a. Hãy viết một hàm

Function nut(goc:troTg;ten:str25):troTg;

Cho kết quả là một con trỏ.

* Bẳng Nil khi goc = nil, nếu không thì

* Trỏ tới nút có TenTg = ten, nếu nút đó tồn tại, nếu không thì

* Trỏ tới một nút trong đó Ten > TenTGTrai = Nil, hoặc là

* Trỏ tới một nút trong đó Ten > TenTGPhai = Nil.

b. Hãy viết một thủ tục:

Procedure Bosung(var goc:trTG; Ten:str25;tuade:string);

Cho phép bổ sung tên một tác giả (ten) với một cuốn sách (TuaDe) vào thư viện trỏ bởi Goc theo cách sau:

• Nếu Ten TuaDe chưa có trong thư viện thì không phải làm gì nữa.

• Nếu Ten đã có và TuaDe chưa có thì bổ sung TuaDe đó vào cuối danh sách tương ứng với nút có tên TenTG = Ten.

• Nếu TenTuaDe đều chưa có thì bổ sung một nút mới vào thư viện, với TenTg = TenTenSach = TuaDe.

ĐỀ THI MÔN TIN HỌC IFI 97

(120 phút)

Bài 1. Cho biết kết quả in ra của chương trình sau đây và giải thích kết quả đó.

Program IFI97(Output) Var i:integer;

a:array[1..2]of integer;

Procedure ky_cuc(var a1,a2:integer);

Var t:integer;

Begin t:=a1;

a2:=a2+1;

If t<>a1 then writeln(‘ky cuc!’);

End;

BEGIN i:=1;

A[1]:=1;

A[2]:=1;

Ky_cuc(i,i);

Ky_cuc(a[i],a[i]);

W END.

riteln(i,a[1],a[2]);

Bài 2. Hãy viết một chương trình đệ qui để tìm phần tử lớn nhất trong một mảng A[1..n] (các phần tử của mảng là các số nguyên) bằng cách chia đôi mảng, phỏng theo ý tưởng của giải thuật tìm kiếm nhị phân.

Bài 3: Cho khai báo của một danh sách tuyến tính móc nối như sau:

Type contro=^kieuphantu;

Kieuphantu=record

Giatri:integer;

Tieptheo:contro;

End;

Var danhsach: contro;

Hãy viết một hàm

Function da_sap(danhsach:contro):boolean;

cho phép kiểm tra một danh sách là đã được sắp thứ tự (không giảm) theo trường giatri chưa. Hãy viết hàm theo hai cách: Dạng lặp và dạng đệ qui.

Bài 4. Người ta biểu diễn một biểu thức số học với các toán tử cộng, trừ, nhân, chia hai ngôi và cộng, trừ một ngôi bằng một cây, trong đó một toán tử được chứa ở một nút trong và mỗi biến được chứa ở một lá của cây. Chẳng hạn: biểu thức với ngoặc đơn đầy đủ (((a-b)*x)-(((-c)/d)/e)) được biểu diễn bởi cây sau:

Một phần của tài liệu Tổng hợp các Đề thi tuyển sinh Cao học nghành Công nghệ thông tin; Môn thi: Ngôn ngữ lập trình (Trang 33 - 46)

Tải bản đầy đủ (PDF)

(46 trang)