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

Ứng dụng phương pháp Nhánh cận trong dạy và học chuyên tin tại trường THPT Chuyên Quảng Bình

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 (392.76 KB, 85 trang )

MỤC LỤC
QUYẾT ĐỊNH GIAO ĐỀ TÀI LUẬN VĂN THẠC SĨ (BẢN SAO) 3
LỜI CAM ĐOAN 4
MỞ ĐẦU 1
1. Tính cấp thiết của đề tài 1
2. Mục tiêu nghiên cứu 2
3. Đối tượng và phạm vi nghiên cứu 3
4. Phương pháp nghiên cứu 3
5. Bố cục của đề tài 4
6. Tổng quan tài liệu tham khảo 4
CHƯƠNG 1 5
PHƯƠNG PHÁP NHÁNH CẬN 5
1.1. KỸ THUẬT ĐỆ QUY 5
1.1.1. Thuật toán quay lui 5
1.1.2. Giải bài toán bằng cách sử dụng Đệ quy quay lui 6
1.2. PHƯƠNG PHÁP NHÁNH CẬN 11
1.2.1. Bài toán tối ưu tổ hợp 11
1.2.2 Cách giải một bài toán bằng phương pháp nhánh cận 13
CHƯƠNG 2 16
CHƯƠNG TRÌNH CHUYÊN SÂU MÔN TIN HỌC TRƯỜNG THPT
CHUYÊN 16
2.1 CHƯƠNG TRÌNH CHUYÊN SÂU MÔN TIN HỌC KHỐI 10 16
2.1.1 Mục đích 16
2.1.2 Kế hoạch và nội dung dạy học 16
2.2 CHƯƠNG TRÌNH CHUYÊN SÂU MÔN TIN HỌC KHỐI 11 24
2.2.1 Mục đích 24
2.2.2 Kế hoạch và nội dung dạy học 25
2.3 CHƯƠNG TRÌNH CHUYÊN SÂU MÔN TIN HỌC KHỐI 12 35
2.3.1 Mục đích 35
2.3.2 Kế hoạch và nội dung dạy học 36
2.4 ĐỊNH HƯỚNG PHƯƠNG PHÁP DẠY HỌC CHUYÊN ĐỀ


“PHƯƠNG PHÁP NHÁNH CẬN” 41
2.4.1 Tiến trình dạy và học trên lớp 41
2.4.2 Tiến trình tự học của học sinh 42
CHƯƠNG 3 44
SỬ DỤNG PHƯƠNG PHÁP NHÁNH CẬN GIẢI MỘT SỐ BÀI TOÁN
TIÊU BIỂU 44
3.1 BÀI TOÁN NGƯỜI DU LỊCH 44
3.1.1 Phát biểu bài toán 44
3.1.2 Thuật toán 45
3.1.3 Độ phức tạp của thuật toán 61
3.1.4 Cài đặt thuật toán 64
3.2. BÀI TOÁN XẾP BA LÔ 64
3.2.1. Phát biểu bài toán 64
3.2.2. Thuật toán 65
3.2.3 Độ phức tạp của thuật toán 72
3.2.4 Cài đặt thuật toán 72
3.3. BÀI TOÁN ĐỒ THỊ CON ĐẦY ĐỦ CỰC ĐẠI 73
3.3.1 Phát biểu bài toán 73
3.3.2 Thuật toán 75
3.3.3 Độ phức tạp của thuật toán 77
3.3.4 Cài đặt thuật toán 78
KẾT LUẬN 79
TÀI LIỆU THAM KHẢO 80
QUYẾT ĐỊNH GIAO ĐỀ TÀI LUẬN VĂN THẠC SĨ (BẢN SAO).
LỜI CAM ĐOAN
Tôi cam đoan đây là công trình nghiên cứu của riêng tôi.
Các số liệu, kết quả nêu trong luận văn là trung thực và chưa từng được
ai công bố trong bất kỳ công trình nào khác.
Tác giả
Trần Lương Vương

MỞ ĐẦU
1. Tính cấp thiết của đề tài
Chương trình đào tạo và bồi dưỡng học sinh có năng khiếu Toán, Tin
học bậc Trung học phổ thông đã được thực hiện trong nhiều năm qua. Qua
những năm thực hiện nó như là một chu trình đặc biệt gắn với sự trưởng thành
và hoàn thiện một mô hình đào tạo đặc biệt. Đó là đào tạo mũi nhọn, đào tạo
các thế hệ học sinh có năng khiếu trong lĩnh vực Toán học, Tin học. Lớp lớp
các thế hệ thầy và trò đã dũng cảm đi lên, tìm tòi và sáng tạo để tiếp cận với
thế giới hiện đại, cập nhật thông tin và nghiên cứu các phương pháp. Gắn với
việc đổi mới phương pháp dạy và học của chương trình đào tạo chuyên,
ngành Giáo dục và Đào tạo đang tích cực đổi mới phương pháp dạy và học để
đào tạo những thế hệ học sinh giỏi có kết quả cao trong các kỳ thi học sinh
giỏi cấp Quốc gia và giành được nhiều huy chương trong các kỳ thi Olympic
quốc tế mà trong đó có kỳ thi Olympic Tin học.
Có thể nói, giáo dục mũi nhọn phổ thông đã thu được những thành tựu
rực rỡ, được Nhà nước đầu tư có hiệu quả, xã hội thừa nhận và bạn bè quốc tế
khâm phục. Các đội tuyển quốc gia tham dự các kỳ thi olympic quốc tế có bề
dày thành tích mang tính ổn định và có tính kế thừa. Đặc biệt, đội tuyển Tin
học quốc gia tham dự thi Olympic quốc tế đã đạt được nhiều thành tích nỗi
bật. Tuy ra đời muộn hơn hệ chuyên Toán nhưng hệ THPT chuyên Tin học đã
sớm khẳng định vị thế của mình, đang trên đà hoàn thiện và phát triển đúng
hướng.
Để nâng cao chất lượng đào tạo mũi nhọn khối chuyên Tin học trường
THPT Chuyên Quảng Bình các thầy cô giáo luôn luôn cố gắng đổi mới
phương pháp, xây dựng các chuyên đề dạy và học các thuật toán trong tin học
để nâng cao chất lượng cũng như hiệu quả giáo dục. Để giải quyết tốt bài toán
thì học sinh cần phải có một số kỹ thuật quan trọng trong việc tiếp cận bài
1
toán và tìm thuật toán. Có rất nhiều lớp thuật toán khác nhau như: Vét cạn;
Chia để trị; Quy hoạch động; Tham lam; Nhánh cận; Các thuật toán trên đồ

thị; Các thuật toán trên Cây… Trong các lớp thuật toán trên tôi chọn đề tài
“Ứng dụng phương pháp Nhánh cận trong dạy và học chuyên tin tại trường
THPT Chuyên Quảng Bình”.
Các bài toán trên thực tế có muôn hình muôn vẻ, không thể đưa ra một
cách thức chung để tìm giải thuật cho mọi bài toán. Chúng ta chỉ khảo sát một
vài bài toán cụ thể và học cách nghĩ, cách tiếp cận vấn đề, cách thiết kế giải
thật. Từ đó rèn luyện kỹ năng linh hoạt khi giải các bài toán thực tế.
2. Mục tiêu nghiên cứu
Với mục tiêu giáo dục là đào tạo nhân tài cho quê hương và đất nước cho
nên việc đổi mới phương pháp dạy và học của giáo viên và học sinh khối
chuyên tin đang ngày càng được đẩy mạnh. Đề tài “Ứng dụng phương pháp
Nhánh cận trong dạy và học chuyên tin tại trường THPT Chuyên Quảng
Bình” được thực hiện nhằm nâng cao chất lượng và hiệu quả đào tạo. Tạo
điều kiện tốt nhất cho học sinh giành được các giải cao trong các kỳ thi học
sinh giỏi môn tin học cấp tỉnh, cấp quốc gia và hướng đến có giải trong kỳ thi
olympic tin học quốc tế.
Đổi mới phương pháp dạy và học của khối chuyên tin tại trường THPT
Chuyên Quảng Bình. Từ đó, giáo viên và học sinh nắm được phương pháp
nhánh cận thông qua việc khảo sát một số bài toán cụ thể, tiêu biểu. Học được
cách nghĩ, cách tiếp cận vấn đề, cách thiết kế giải thuật và rèn luyện kỹ năng
linh hoạt khi giải các bài toán. Vận dụng được thuật toán nhánh cận vào giải
một số bài toán cụ thể để giáo viên và học sinh tiếp cận với phương pháp
nhánh cận một cách nhanh chóng và hiệu quả. Nắm bắt được một số kỹ thuật
quan trọng trong việc tiếp cận bài toán, tìm và thiết kế thuật toán.
2
3. Đối tượng và phạm vi nghiên cứu
Tìm hiểu phương pháp nhánh cận, mục tiêu và kế hoạch dạy học chương
trình chuyên sâu môn tin học để thực hiện việc đổi mới phương pháp trong
việc dạy học thuật toán tại trường THPT Chuyên Quảng Bình. Trên cơ sở đó
tiến phân tích và thiết kế thuật toán và cài đặt các bài toán tiểu biểu có thể giải

được bằng phương pháp nhánh cận. Các bài toán được cài đặt chương trình
bằng ngôn ngữ lập trình Free Pascal để minh họa quá trình thực hiện thuật
toán.
4. Phương pháp nghiên cứu
Bài toán đặt ra trong thực tế yêu cầu tìm ra một nghiệm thỏa mãn một số
điều kiện nào đó và nghiệm đó là tốt nhất theo một chỉ tiêu cụ thể, đó là lớp
bài toán tối ưu. Nghiên cứu lời giải các lớp bài toán tối ưu thuộc về lĩnh vực
quy hoạch toán học.
Tuy nhiên cũng cần phải nói rằng trong nhiều trường hợp chúng ta chưa
thể xây dựng một thuật toán nào thực sự hữu hiệu để giải bài toán tối ưu, mà
cho tới nay việc tìm nghiệm của chúng vẫn phải dựa trên mô hình liệt kê toàn
bộ các cấu hình có thể và đánh giá, tìm ra cấu hình tốt nhất. Việc tìm cấu hình
theo cách này còn có tên gọi là vét cạn. Chính nhờ kỹ thuật này cùng với sự
phát triển của máy tính điện tử mà nhiều bài toán khó đã tìm thấy lời giải.
Mô hình thuật toán quay lui là tìm kiếm trên một cây phân cấp. Nếu giả
thiết rằng mỗi nút nhánh của cây chỉ có 2 nút con thì cây có độ cao n sẽ có tới
2
n
nút lá, con số này lớn hơn rất nhiều lần so với kích thước dữ liệu đầu vào n.
Chính vì vậy mà nếu như ta có thao tác thừa trong việc chọn x
i
thì sẽ phải trả
giá rất lớn về chi phí thực thi thuật toán bởi quá trình tìm kiếm lòng vòng vô
nghĩa trong các bước chọn kế tiếp x
i + 1
, x
i + 2
, … Khi đó, một vấn đề đặt ra là
trong quá trình liệt kê lời giải ta cần tận dụng những thông tin đã tìm được để
3

loại bỏ sớm những phương án chắc chắn không phải tối ưu. Kỹ thuật đó gọi là
kỹ thuật đánh giá nhánh cận trong tiến trình quay lui.
- Thu thập tài liệu: Tìm các cuốn sách, các tài liệu viết về nội dung giải
toán bằng phương pháp nhánh cận. Các tài liệu viết về các ngôn ngữ lập trình.
Các bài toán tiêu biểu có thể giải được bằng phương pháp nhánh cận. Các
phần mềm ứng dụng mô phỏng thuật toán.
- Nghiên cứu lý thuyết: Trên cơ sở các tài liệu thu thập được, tiến hành
đọc, phân loại và viết báo cáo.
- Cài đặt chương trình: Cài đặt chương trình cho các thuật toán đã được
xây dựng, thực hiện và kiểm tra chương trình. Cài đặt ứng dụng mô phỏng
cho các thuật toán.
5. Bố cục của đề tài
Chương 1: Phương pháp nhánh cận
Nội dung của chương là trình bày thuật toán đệ quy. Phát biểu bài toán
tối ưu tổ hợp và thuật toán giải bài toán tối ưu tổ hợp bằng phương pháp
nhánh cận.
Chương 2: Chương trình chuyên sâu môn tin học trường THPT chuyên.
Nội dung của chương là trình bày phân phối chương trình môn Tin học
dành cho học sinh chuyên tin ở trường THPT chuyên.
Chương 3: Sử dụng phương pháp nhánh cận giải một số bài toán tiêu
biểu.
Nội dung của chương là phát biểu các bài toán, phân tích và thiết kế
thuật toán, cài đặt chương trình cho các bài toán.
6. Tổng quan tài liệu tham khảo
Khi triển khai nghiên cứu đề tài tôi đã tham khảo các tài liệu về toán rời
rạc, lý thuyết đồ thị, cấu trúc dữ liệu và giải thuật, toán ứng dụng, các giải
thuật nâng cao và ngôn ngữ lập trình Turbo Pascal.
4
CHƯƠNG 1
PHƯƠNG PHÁP NHÁNH CẬN

1.1. KỸ THUẬT ĐỆ QUY
1.1.1. Thuật toán quay lui
Thuật toán quay lui dùng để giải bài toán liệt kê các cấu hình. Thuật toán
này làm việc theo cách:
- Mỗi cấu hình được xây dựng bằng cách xây dựng từng phần tử
- Mỗi phần tử được chọn bằng cách thử tất cả các khả năng.
Giả sử cấu hình hình cần liệt kê có dạng x
1
, x
2
, … x
n
, khi đó thuật toán
quay lui sẽ xét tất cả các giá trị x
1
có thể nhận, thử cho x
1
nhận lần lượt các
giá trị đó. Với mỗi giá trị thử gán cho x
1
, thuật toán sẽ xét tất cả các giá trị x
2
có thể nhận, lại thử cho x
2
nhận lần lượt các giá trị đó. Với mỗi giá trị thử gán
cho x
2
lại xét tiếp các khả năng chọn x
3
, cứ tiếp tục như vậy… Mỗi khi ta tìm

được đầy đủ một cấu hình thì liệt kê ngay cấu hình đó.
Từ những phân tích trên ta xây dựng mô hình quay lui như sau:
//Thủ tục này thử cho x[i] nhận lần lượt các giá trị mà nó có thể nhận
Procedure Try(i);
Begin
For «Mọi giá trị v có thể gán cho x[i]» do
If «Gán được» then
Begin
«Cho x[i] := v»;
«Ghi nhận việc cho x[i] nhận giá trị V (nếu cần)»;
if «x[i] là phần tử cuối cùng trong cấu hình» then
«Thông báo cấu hình tìm được»
else
5
Try(i + 1); //Gọi đệ quy để chọn tiếp x[i+1]
«Nếu cần, bỏ ghi nhận việc thử x[i] := v để thử giá trị
khác»;
end;
End;
1.1.2. Giải bài toán bằng cách sử dụng Đệ quy quay lui
Bài toán liệt kê các dãy nhị phân:
Biểu diễn dãy nhị phân độ dài N dưới dạng dãy x
1…N
.
Yêu cầu: Viết chương trình liệt kê tất cả dãy nhị phân có độ dài bằng N.
Dữ liệu vào: Cho trong file văn bản NHIPHAN.INP, có cấu trúc như
sau:
- Dòng 1: Ghi số nguyên dương N. (2 ≤ N ≤ 100).
Dữ liệu ra: Ghi ra file văn bản NHIPHAN.OUT theo cấu trúc sau:
- Trên mỗi dòng: Ghi một dãy nhị phân có độ dài N tìm được.

Ví dụ:
NHIPHAN.INP NHIPHAN.OUT
3 000
001
010
011
100
101
110
111
6
Thuật toán:
Ta sẽ liệt kê các dãy này bằng cách thử dùng các giá trị {0, 1} gán
cho x
i
. Với mỗi giá trị gán cho x
i
lại thử các giá trị có thể gán cho x
i+1
, …
Sau đây là chương trình liệt kê các dãy nhị phân với quy định khuôn
dạng Input/Output theo yêu cầu của bài toán.
Chương trình:
Program Liet_ke_day_nhi_phan;
Const fi = 'NHIPHAN.INP';
fo = 'NHIPHAN.OUT';
Var N:Integer;
X:AnsiString;
f:Text;
Procedure Read_Data;

Begin
Assign(f,fi);
Reset(f);
Readln(f,N);
Close(f);
Assign(f,fo);
ReWrite(f);
End;
Procedure Attemp(i:Integer); //Thu cac cach chon x[i]
Var j:AnsiChar;
Begin
For j:='0' to '1' do //Xet cac gia tri j co the gan cho x[i]
Begin //Voi moi gia tri do
X[i]:=j; //Thu dat X[i]
7
if i=N then
Writeln(f,x) //Neu i = N thi in ket qua ra file
Else
Attemp(i+1); //Neu x[i] chua phai la phan tu cuoi cung thi tim tiep
x[i+1]
End;
End;
BEGIN
Read_Data;
SetLength(X,N);
Attemp(1); //Khoi dong thuat toan quay lui
Close(f);
END.
Khi N = 3, các lời gọi đệ quy thực hiện thuật toán quay lui có thể
vẽ như cây trong Hình 1-1

Bài toán liệt kê các tập con có K phần tử:
Cho tập A gồm các phần tử {1, 2, …, N} theo thứ tự tăng dần.
8
Yêu cầu: Hãy viết chương trình liệt kê tất cả các tập con có k phần tử
theo thứ tự tăng dần là tập con của tập A.
Dữ liệu vào: Cho trong file văn bản SUBSET.INP, có cấu trúc như sau:
- Dòng 1: Ghi hai số nguyên dương N và K. (2 ≤ N ≤ 100, 1 ≤ K < N).
Dữ liệu ra: Ghi ra file văn bản SUBSET.OUT theo cấu trúc sau:
- Trên mỗi dòng: Ghi một tập con có độ dài k tìm được, các phần tử cách
nhau một dấu cách.
Ví dụ:
SUBSET.INP SUBSET.OUT
5 3 1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
Thuật toán:
Bài toán liệt kê tập con K phần tử của tập S = {1,2,…,n} có thể quy về
bài toán liệt kê các dãy K phần tử x
1…N
, trong đó 1 ≤ x
1
< x
2

< …< x
k


≤ n. Nếu
sắp xếp các dãy này theo thứ tự từ điển ta nhận thấy:
- Tập con đầu tiên (cấu hình khởi tạo) là {1,2,…,k}.
- Tập con cuối cùng (cấu hình kết thúc) là {n - k + 1, n -k +2,…,n}
- Xét một tập con {x
1…k
} trong đó 1 ≤ x
1
< x
2
< …< x
k


≤ n, ta có nhận
xét rằng giới hạn trên (giá trị lớn nhất có thể nhận) của x
k
là n, của x
k-1
là n - 1,
của x
k-2
là n - 2… Tổng quát: giới hạn trên của của x
i
là n - k + i.
Còn tất nhiên, giới hạn dưới (giá trị nhỏ nhất có thể nhận) của x

i
là x
i -1
+ 1.
9
Từ các nhận xét trên ta có giá trị cận dưới và cận trên của x
i

là:
x
i -1
+ 1 ≤ x
i
≤ n - k + i
(Giả thiết rằng có thêm một số x
0
= 0 khi xét công thức trên với i = 1)
Thuật toán quay lui sẽ xét tất cả các cách chọn x
1
từ 1 (= x
0
+1) đến n -
k + 1, với mỗi giá trị đó, xét tiếp tất cả các cách chọn x
2
từ x
1
+1 đến n - k +
2, … cứ như vậy khi chọn được đến x
k
thì ta có một cấu hình cần liệt kê.

Dưới dây là chương trình liệt kê các tập con k phần tử bằng thuật toán
quay lui với khuôn dạng dữ liệu vào ra theo yêu cầu của bài toán.
Program Liet_ke_tap_con_K_phan_tu;
Const fi = 'SUBSET.INP';
fo = 'SUBSET.OUT';
maxN=100;
Var N,K:Integer;
X:array[0 maxN] of Integer;
f:Text;
Procedure Read_Data;
Begin
Assign(f,fi);
Reset(f);
Readln(f,N,K);
Close(f);
Assign(f,fo);
ReWrite(f);
End;
Procedure Write_Data;
Var i:Integer;
Begin
For i:=1 to K do
10
Write(f,X[i], ' ');
Writeln(f);
End;
Procedure Attemp(i:Integer);
Var j:Integer;
Begin
For j:= X[i-1] + 1 to N-K+i do

Begin
X[i]:=j;
if i=K then
Write_Data
Else
Attemp(i+1);
End;
End;
BEGIN
Read_Data;
X[0]:=0;
Attemp(1);
Close(f);
END.
1.2. PHƯƠNG PHÁP NHÁNH CẬN
1.2.1. Bài toán tối ưu tổ hợp
Trong rất nhiều vấn đề ứng dụng thực tế của tổ hợp, các cấu hình của tổ
hợp còn được gán cho một giá trị bằng số đánh giá giá trị sử dụng của cấu
hình đối với mục đích sử dụng cụ thể nào đó.
11
Khi đó xuất hiện bài toán: Hãy lựa chọn trong số các cấu hình tổ hợp
chấp nhận được cấu hình có giá trị sử dụng tốt nhất. Các bài toán như vậy
chúng ta sẽ gọi là bài toán tối ưu tổ hợp.
Dưới dạng tổng quát bài toán tối ưu tổ hợp có thể phát biểu như sau:
Tìm cực tiểu (hay cực đại) của hàm
( )
min(max),f x
→
với điều kiện
x D


, trong đó
D
là tập hữu hạn các phần tử.
Hàm
( )
f x
được gọi là hàm mục tiêu của bài toán, mỗi phần tử
x D

được gọi là một phương án còn tập
D
gọi là tập các phương án của bài toán.
Tập
D
được mô tả như là tập các cấu hình tổ hợp thỏa mãn một số tính
chất cho trước nào đó.
Phương án
*
x D

đem lại giá trị nhỏ nhất (lớn nhất) cho hàm mục tiêu
được gọi là phương án tối ưu, khi đó
( )
* *
f f x
=
được gọi là giá trị tối ưu của
bài toán.
Một trong những phương pháp hiển nhiên nhất để giải bài toán tối ưu tổ

hợp đặt ra là: Trên cơ sở các thuật toán liệt kê tổ hợp ta tiến hành duyệt từng
phương án của bài toán, đối với mỗi phương án ta đều tính giá trị hàm mục
tiêu tại nó, sau đó so sánh giá trị hàm mục tiêu tại tất cả các phương án được
liệt kê để tìm ra phương án tối ưu. Phương pháp xây dựng theo nguyên tắc
như vậy có tên gọi là phương pháp duyệt toàn bộ. Duyệt toàn bộ là khó có thể
thực hiện được ngay cả trên những máy tính điện tử hiện đại nhất.
Ví dụ để liệt kê hết 15! = 1307674368000 hoán vị trên máy tính điện tử
với tốc độ tính toán 1 tỷ phép tính một giây, nếu để liệt kê một hoán vị cần
phải làm 100 phép tính, thì ta cần một khoảng thời gian là 130767 giây, lớn
hơn 36 giờ. Vì vậy cần phải có những biện pháp nhằm hạn chế việc tìm kiếm
thì mới có hy vọng giải được các bài toán tối ưu tổ hợp thực tế.
12
Tất nhiên để có thể đề ra những biện pháp như vậy cần phải nghiên cứu
kỹ tính chất của bài toán tối ưu tổ hợp cụ thể. Trong một số trường hợp cụ thể
ta có thể xây dựng những thuật toán hiệu quả để giải bài toán đặt ra. Tuy
nhiên phải nhấn mạnh rằng trong nhiều trường hợp (ví dụ bài toán người du
lịch, bài toán cái túi, bài toán đồ thị con đầy đủ cực đại) chúng ta chưa thể xây
dựng được phương pháp hữu hiệu nào khác ngoài phương pháp duyệt toàn bộ.
Khi đó, một vấn đề đặt ra là trong quá trình liệt kê lời giải ta cần tận dụng các
thông tin đã tìm được để loại bỏ những phương án chắc chắn không phải tối
ưu.
Trong phần tiếp theo ta sẽ xét một sơ đồ tìm như vậy để giải các bài toán
tối ưu tổ hợp với tên gọi là thuật toán nhánh cận.
1.2.2 Cách giải một bài toán bằng phương pháp nhánh cận
Ta sẽ mô tả tư tưởng của thuật toán trên mô hình bài toán tối ưu tổ hợp
tổng quát sau:
( )
{
}
min :

n
f x x D R
∈ ⊂
,
trong đó D là tập hữu hạn phần tử, là miền các phương án; x là một
phương án thuộc miền D.
Phương pháp nhánh cận được mô tả như sau:
Từ miền D ta phân nhánh thành hai miền D
1
, D
2
, trên mỗi nhánh ta xây
dựng hàm g xác định trên các miền D
1
, D
2
để tính giá trị cận dưới.
Gọi
1
β
là cận dưới của nhánh D
1
, gọi
2
β
là cận dưới của nhánh D
2
.
So sánh giá trị các cận dưới
1

β

2
β
, Nếu
1
β

2
β
thì bước tiếp theo sẽ
chọn nhánh D
1
để tiếp tục, ngược lại thì chọn nhánh D
2
.
Giả sử tại đây ta chọn nhánh D
1
tiếp tục phát triển thuật toán, thì lúc này
ta cũng phân nhánh D
1
thành hai nhánh D
11
và D
12
. Tiếp tục dùng hàm g để
tính cận dưới cho các nhánh D
11
và D
12

. Tương tự ta gọi Gọi
11
β
là cận dưới
13
của nhánh D
11
, gọi
12
β
là cận dưới của nhánh D
12
. Lại tiếp tục so sách các giá
trị cận dưới
11
β

12
β
để chọn nhánh cần phát triển trong bước tiếp theo. Quá
trình trên cứ lặp đi lặp lại cho đến khi không thể phân nhánh được nữa, lúc
này ta có phương án tối ưu tạm thời trong quá trình tìm nghiệm của bài toán.
Gọi
*
β
là nghiệm tối ưu tạm thời, lúc này thuật toán nhánh cận sẽ tiếp
tục với những nhánh còn lại sao cho giá trị của hàm g tại đó nhỏ hơn
*
β
.

Thuật toán phân nhánh của phương pháp nhánh cận có thể minh họa
bằng sơ đồ sau:

1
β

2
β
11
β

12
β

21
β

22
β

111
β

112
β


*
β
Ta xây dựng thuật toán nhánh cận bằng thủ tục đệ quy tổng quát như sau:

Procdure Try(k)
(* Phát triển phương án bộ phận (a
1
, a
2
, …a
k-1
) theo thuật toán quay lui
có kiểm tra cận dưới trước khi tiếp tục phát triển phương án*)
Begin
For a
k
∈ A
k
do
if <chấp nhận a
k
> then
Begin
x
k
:=a
k
;
if n = k then
<Cập nhật kỷ lục>
14
D
D
1

D
11
D
2
D
22
D
21
D
12
D
11
1
D
11
2
D
*
else
if
( )
1 2 k
, , ,g a a a


f
then
Try(k+1)
End;
End;

Khi đó thuật toán nhánh cận được thực hiện nhờ thủ tục sau:
Procedure Nhanh_can;
Begin
f
= +∞;
(* Nếu biết một phương án
x
nào đó thì có thể đặt
f
=
( )
f x
*)
Try(1);
if
f
< +∞ then
<
f
là giá trị tối ưu,
x
là phương án tối ưu>
else
<Bài toán không có phương án>
End;
15
CHƯƠNG 2
CHƯƠNG TRÌNH CHUYÊN SÂU MÔN TIN HỌC
TRƯỜNG THPT CHUYÊN
2.1 CHƯƠNG TRÌNH CHUYÊN SÂU MÔN TIN HỌC KHỐI 10

2.1.1 Mục đích
- Thống nhất trên phạm vi toàn quốc kế hoạch dạy học và nội dung dạy
học môn Tin học cho trường THPT chuyên.
- Thống nhất trên phạm vi toàn quốc nội dung bồi dưỡng học sinh giỏi
môn Tin học cấp THPT.
+ Mục tiêu về kiến thức:
- Mở rộng và nâng cao hệ thống kiến thức chuẩn, cơ bản của tin học lớp 10
THPT.
- Trang bị kiến thức cơ bản về một số thuật toán, giải thuật.
- Trang bị một số kiến thức cơ bản về ngôn ngữ lập trình.
+ Mục tiêu về kĩ năng:
- Thực hiện được một số thuật toán cơ bản.
- Vận dụng dụng được một số thuật toán cơ bản để giải một số bài toán
- Bước đầu sử dụng được ngôn ngữ lập trình để cài đặt được một số thuật
toán, biểu diễn dữ liệu.
+ Mục tiêu về thái độ:
- Có tác phong suy nghĩ và làm việc hợp lý, khoa học và chính xác.
- Tự giác, tích cực trong học tập.
2.1.2 Kế hoạch và nội dung dạy học
Chương trình tin học lớp 10 chuyên tin gồm 123 tiết, trong đó có 70 tiết
dành cho nội dung cơ bản và 53 tiết dành cho nội dung chuyên sâu.
- Nội dung cơ bản môn Tin học cho các trường THPT, được qui định
trong chương trình môn Tin học, lớp 10, ban hành kèm theo Quyết định số
16
16/2006/QĐ-BGDĐT ngày 05 tháng 5 năm2006 của Bộ trưởng Bộ Giáo dục
và Đào tạo.
- Nội dung chuyên sâu bao gồm hai chủ đề mở rộng và chuyên sâu:
Ngôn ngữ lập trình và Phân tích, thiết kế và cài đặt giải thuật.
+ Nội dung chuyên sâu Ngôn ngữ lập trình sử dụng ngôn ngữ lập trình
Free Pascal để mô tả nội dung kiến thức, kĩ năng cần truyền đạt, tuy nhiên khi

thực hiện có thể chọn sử dụng các ngôn ngữ lập trình khác để dạy học.
TT Nội dung (20 tiết) Mức độ cần đạt
1
Khái niệm chương trình
và ngôn ngữ lập trình
2
Các thành phần cơ sở của
ngôn ngữ lập trình TP
Kiến thức
•Biết các khái niệm cơ bản: Bảng chữ cái,
Tên, Tên chuẩn, Tên riêng (từ khoá), Hằng và
Biến.
Kỹ năng
•Biết đặt tên đúng.
3
Cấu trúc tổng quát của
một chương trình TP
Kiến thức
•Biết các thành phần của một chương trình
TP.
Kĩ năng
•Nhận biết được các thành phần của một
chương trình không có chương trình con.
17
TT Nội dung (20 tiết) Mức độ cần đạt
4
Dịch, thực hiện và hiệu
chỉnh chương trình
Kiến thức
•Biết các bước: soạn thảo, dịch, thực hiện

và hiệu chỉnh chương trình.
•Biết một số công cụ của môi trường TP.
Kĩ năng
•Bước đầu sử dụng được chương trình
dịch để phát hiện lỗi.
•Bước đầu chỉnh sửa được chương trình
dựa vào thông báo lỗi của Chương trình
dịch và tính hợp lí của kết quả thu được.
5
Một số kiểu dữ liệu
chuẩn: số nguyên, số thực,
logic, ký tự, xâu
Kiến thức
• Với mỗi kiểu dữ liệu, biết được phạm vi
giá trị, cách khai báo, các hàm chuẩn và
các thủ tục chuẩn có thể dùng.
• Với mỗi biến có kiểu dữ liệu trên, biết
cách nhận giá trị (từ bàn phím và dùng
lệnh gán) và cách viết giá trị ra màn hình.
Kĩ năng
• Biết chọn kiểu dữ liệu thích hợp cho các
biến cần khai báo.
• Biết dùng một số hàm chuẩn và thủ tục
chuẩn viết một số chương trình dùng các
kiểu dữ liệu trên.
18
TT Nội dung (20 tiết) Mức độ cần đạt
6 Tổ chức rẽ nhánh
Kiến thức
•Hiểu được các câu lệnh này dùng để thể

hiện các tình huống phải biện luận khi giải
các bài toán
•Biết cách viết đúng các lệnh về mặt cú
pháp.
Kĩ năng
•Sử dụng được các lệnh để viết các đoạn
chương trình có biện luận cấu trúc rẽ
nhánh trong mô tả thuật toán của môt số
bài toán đơn giản.
•Viết được các lệnh rẽ nhánh khuyết, rẽ
nhánh đầy đủ và áp dụng để thể hiện được
thuật toán của một số bài toán đơn giản.
7 Tổ chức lặp
Kiến thức
•Hiểu nhu cầu của cấu trúc lặp trong biểu
diễn thuật toán.
•Hiểu cấu trúc lặp kiểm tra điều kiện
trước, cấu trúc lặp với số lần định trước.
•Biết cách vận dụng đúng đắn từng loại
cấu trúc lặp vào
19
TT Nội dung (20 tiết) Mức độ cần đạt
Kĩ năng
•Mô tả được thuật toán của một số bài
toán sử dụng lệnh lặp.
•Viết đúng các lệnh lặp kiểm tra điều kiện
trước, lệnh lặp với số lần định trước
•Dùng để viết chương trình giải một số
bài toán.tình huống cụ thể.
8 Kiểu mảng

Kiến thức
•Hiểu được cách dùng dữ liệu kiểu mảng
một chiều và hai chiều.
•Biết cách khai báo mảng và ký hiệu các
phần tử của mảng.
Kĩ năng
•Thực hiện được khai báo mảng, truy cập,
tính toán các phần tử của mảng.
•Cài đặt được thuật toán của một số bài
toán với kiểu dữ liệu mảng một chiều.
9 Kiểu bản ghi
Kiến thức
•Biết kiểu Bản ghi dùng để thể hiện một loạt
đối tượng cùng có chung một số thuộc tính.
•Biết cách khai báo biến kiểu bản ghi.
•Biết truy cập trực tiếp các trường và truy
cập bằng lệnh With Do
Kỹ năng
•Sử dụng được loại biến bản ghi một cách
linh hoạt.
20
TT Nội dung (20 tiết) Mức độ cần đạt
10 Kiểu tập hợp
Kiến thức
• Biết cách khai báo dữ liệu kiểu tập hợp
với các hạn chế so với tập hợp dùng
trong Toán học
• Biết các hàm chuẩn và thủ tục chuẩn
đối với kiểu tập hợp
Kỹ năng

Sử dụng được kiểu tập hợp thể hiện một
số đối tượng trong một số bài toán
11 Tệp và xử lý tệp
Kiến thức
• Biết khái niệm tệp định kiểu và tệp văn
bản và mục đích của các kiểu dữ liệu này
để lưu giữ lâu dài các thông tin tạo lập
được.
• Biết các lệnh và một số hàm, thủ tục
chuẩn khi làm việc với tệp: gán tên cho
biến tệp, mở tệp, đọc thông tin từ tệp, ghi
thông tin vào tệp, đóng tệp.
• Biết các lệnh khai báo tệp định kiểu và
tệp văn bản.
Kĩ năng
• Biết các thao tác tệp, chủ yếu là tệp
văn bản
21

×