1. Trang chủ
  2. » Luận Văn - Báo Cáo

Phương pháp quy hoạch động và vận dụng kết hợp giải các bài toán chuyên tin bậc THPT

26 487 0
Tài liệu đã được kiểm tra trùng lặp

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 26
Dung lượng 481,2 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Lý do chọn đề tài Hiện nay nhiệm vụ phát hiện, đào tạo và bồi dưỡng học sinh giỏi là một nhiệm vụ trọng tâm của các trường THPT Chuyên của tất cả các tỉnh thành trong cả nước, nhằm mục

Trang 1

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC BÁCH KHOA



THÁI PHONG NGHĨA

PHƯƠNG PHÁP QUY HOẠCH ĐỘNG VÀ VẬN DỤNG

KẾT HỢP GIẢI CÁC BÀI TOÁN CHUYÊN TIN BẬC THPT

Chuyên ngành: KHOA HỌC MÁY TÍNH

Mã số: 60.48.01

TÓM TẮT LUẬN VĂN THẠC SĨ KỸ THUẬT

Đà Nẵng – Năm 2018

Trang 2

Công trình được hoàn thành tại TRƯỜNG ĐẠI HỌC BÁCH KHOA

Người hướng dẫn khoa học: PGS TSKH TRẦN QUỐC CHIẾN

Phản biện 1: TS ĐẶNG HOÀI PHƯƠNG

Phản biện 2: TS NGUYỄN THÁI SƠN

Luận văn sẽ được bảo vệ trước Hội đồng chấm Luận văn tốt nghiệp thạc sĩ Khoa học máy tính họp tại Trường Đại học Bách khoa vào

ngày 03 tháng 02 năm 2018

Có thể tìm hiểu luận văn tại:

Thư viện Khoa Công nghệ thông tin, Trường Đại học Bách khoa –

ĐHĐN

Trang 3

MỞ ĐẦU

1 Lý do chọn đề tài

Hiện nay nhiệm vụ phát hiện, đào tạo và bồi dưỡng học sinh giỏi là một nhiệm vụ trọng tâm của các trường THPT Chuyên của tất

cả các tỉnh thành trong cả nước, nhằm mục đích phát hiện bồi dưỡng

và đào tạo nhân tài, tạo ra một đội ngũ học sinh chất lượng cao làm tiền đề để phát triển nâng cao hơn nữa ở bậc đại học, sau đại học cho các em học sinh Môn Tin học tự hào cũng là một môn học quan trọng không kém nên được đưa vào chương trình thi học sinh giỏi các cấp hằng năm như: thi học sinh giỏi cấp Tỉnh (thành phố), thi học sinh giỏi Olympic 30/04 (từ Đà Nẵng trở vào phía Nam), thi học sinh giỏi Quốc gia, bên cạnh đó còn có thi Tin học trẻ không chuyên (cấp Tỉnh và Toàn quốc)

Trong vai trò là một giáo viên Tin học giảng dạy tại trường THPT Chuyên Nguyễn Thiện Thành – TP Trà Vinh, hàng năm đều phải tham gia vào công tác bồi dưỡng học sinh giỏi của bộ môn, cho đến nay qua nhiều năm bồi dưỡng, bản thân tôi nhận thấy, trong cấu trúc của các đề thi học sinh giỏi môn Tin học, số lượng các bài toán trong một đề thi có thể giải bằng phương pháp quy hoạch động thường chiếm từ 30 – 70% của một đề thi, bởi khi ra đề thi ban tổ chức thường rãi đều các chuyên mục của các phương pháp như: duyệt, qui hoạch động và các thuật toán ứng dụng mô hình đồ thị, tuy nhiên trong đó có một số bài toán duyệt và ứng dụng mô hình đồ thị vẫn có thể áp dụng phương pháp quy hoạch động để giải Vì vậy có thể nói, quy hoạch động là một chuyên đề rất quan trọng mà mỗi học sinh thi tham gia đội tuyển học sinh giỏi đều phải nắm được nếu muốn đạt các thứ hạng cao ở các kỳ thi

Trang 4

Với những lý do thiết thực đó, tôi xin chọn thực hiện đề tài:

“PHƯƠNG PHÁP QUY HOẠCH ĐỘNG VÀ VẬN DỤNG KẾT HỢP GIẢI CÁC BÀI TOÁN CHUYÊN TIN BẬC THPT”

2 Mục tiêu nghiên cứu

Xây dựng và phân tích có hệ thống các bài tập có thể giải bằng phương pháp Quy hoạch động, phân lớp chúng thành các lớp bài toán bằng cách nhận diện dựa trên kinh nghiệm của người học từ các bài toán quy hoạch động điển hình, kinh điển Vận dụng kết hợp để giải các bài toán chuyên Tin trong công tác bồi dưỡng học sinh giỏi môn Tin học

3 Đối tượng và phạm vi nghiên cứu

Phương pháp quy hoạch động Cấu trúc dữ liệu phù hợp để quy hoạch động Các đề thi học sinh giỏi tin học các cấp

4 Phương pháp nghiên cứu

Nghiên cứu lý thuyết về phương pháp quy hoạch động, nhận dạng các bài toán có thể giải bằng phương pháp quy hoạch động và phân tích các ưu điểm của nó từ đó kết hợp thêm các phương pháp khác để áp dụng giải các bài toán tối ưu

Thiết kế thuật toán dựa trên phương pháp quy hoạch động

5 Ý nghĩa khoa học và thực tiễn của đề tài

Ý nghĩa khoa học: Nghiên cứu và phân tích phương pháp quy hoạch động Vận dụng kết hợp vào việc giải các bài toán chuyên tin

Ý nghĩa thực tiễn: Giúp cho học sinh đạt kết quả cao hơn trong các

kỳ thi học sinh giỏi Tin học Làm tài liệu tham khảo để hỗ trợ cho học sinh giáo viên tin học dạy bồi dưỡng chuyên tin

Trang 5

CHƯƠNG 1: LÝ THUYẾT VỀ QUY HOẠCH ĐỘNG 1.1 Giới thiệu về phương pháp quy hoạch động

1.1.1 Bài toán tối ưu

1.1.2 Nguyên lý Bellman

1.1.3 Bảng phương án

1.2 Nhận dạng bài toán quy hoạch động

1.3 Ưu điểm của quy hoạch động

1.4 Các bước thực hiện quy hoạch động

1.4.1 Xây dựng công thức truy hồi

Giả sử bài toán mà ta cần tìm là chi phí tối ưu dạng Max Gọi

Từ các giá trị ban đầu nêu trên, ta tăng dần số lượng các phần

tử lên (tăng độ lớn của bài toán), tìm điểm chung trong cách tính các phần tử từ bài toán cơ sở (F0 hoặc F1) đến bài toán đang xét (Fi) Từ đó

ta có được công thức truy hồi

Thông thường công thức truy hồi có dạng:

F i = Max(F i-1 , F i) {với i = 1 n} (*)

Trong đó:

- Fi là giá trị lớn nhất khi xét đến phần tử thứ i

- Max là hàm lấy giá trị lớn nhất của 1 trong các đối số của nó

- Fi-1 là bài toán con đã tối ưu ở bước liền kề trước đó

- Fi-1 cũng được tính theo công thức Fi-1 = Max(Fi-2, Fi-1)

- Và Fi-2 = Max(Fi-3, Fi-2)

- … cho đến

Trang 6

- F1

- F0

1.4.2 Tổ chức dữ liệu và chương trình

1.4.3 Làm tốt (tối ưu thuật toán nếu được)

1.4.4 Truy vết tìm phương án tối ưu

Thông thường kết quả tối ưu của một bài toán quy hoạch động

là sau khi đã giải được bài toán sau cùng (bài toán thứ n, hay Fn), nếu bảng phương án là mảng 2 chiều thì hoặc là giá trị tối ưu (GTTU) nằm

ở cột cuối hoặc là GTTU nằm ở dòng cuối Từ các vị trí chứa các GTTU đó, ta tiến hành truy vết ngược trở về đi qua các bài toán con liền trước nó cũng đã đạt được GTTU, cho đến khi trở về bài toán cơ

sở ban đầu thì dừng

Vậy để có thể truy vết được thì ta phải tiến hành đánh dấu tại GTTU của bài toán thứ i mà ta đạt được Cụ thể, khi tiến hành cài đặt công thức (*) ở trên, ta phải lưu vết:

If Fi-1 > Fi Then

Begin

Fi := Fi-1

Lưu vết {chọn Fi-1} End Else

Lưu vết {không chọn Fi-1}

1.5 Các lớp bài toán quy hoạch động và ứng dụng

1.5.1 Dạng 1: Dãy con đơn điệu dài nhất

Trang 7

1.5.2 1 Mô hình

1.5.2 2 Công thức

1.5.2 3 Cài đặt

1.5.2 4 Một số bài toán biến thể cùng lớp với bài toán “chia kẹo”

1.5.3 Dạng 3: Xâu con chung dài nhất

1.6 Hạn chế của quy hoạch động

CHƯƠNG 2: GIỚI THIỆU MỘT SỐ THUẬT TOÁN VÀ CẤU TRÚC DỮ LIỆU ĐỂ KẾT HỢP VỚI PHƯƠNG PHÁP QUY

HOẠCH ĐỘNG 2.1 Bài toán 1: Phần thưởng

Tuấn là người chiến thắng trong một cuộc thi “tìm hiểu kiến thức vũ trụ” và được nhận các phần thưởng do công ty XYZ tài trợ Các phần thưởng được bố trí trên một bảng hình vuông n x n có dạng một lưới ô vuông kích thước đơn vị Các dòng của bảng được đánh số

từ 1 đến n, từ trên xuống dưới và các cột của bảng được đánh số từ 1 đến n, từ trái qua phải Ô nằm trên giao của dòng i và cột j được gọi là

ô (i,j) và trên ô đó chứa một món quà có giá trị là a[i,j] (1 <= i, j <= n)

Để nhận phần thưởng, Tuấn được phép chọn một hình vuông kích thước k x k chiếm trọn trong một số ô của bảng và nhận tất cả các phần quà có trong các ô nằm trong hình vuông đó

Yêu cầu: Hãy xác định tổng giá trị lớn nhất của món quà mà Tuấn có

thể nhận được

Trang 8

Kết quả: Ghi ra một số nguyên duy nhất là tổng giá trị lớn nhất

của các món quà mà Tuấn có thể nhận được

Ví dụ:

* Cách giải 1: Duyệt từng hình vuông có độ dài cạnh k, với i,j là cặp

chỉ số góc trên bên trái hình vuông và x,y là góc dưới phải hình vuông Với mỗi hình vuông ta tiến hành tính tổng của chúng và so sánh với Max (Max ban đầu bằng - ∞) Độ phức tạp thuật toán là O(n4), không khả thi với yêu cầu của đề bài nếu n lớn

* Cách giải 2: Quy hoạch động

Gọi F[i,j] là tổng các giá trị từ ô[1,1] tới ô[i,j]

Tính tất cả các F[i,j] theo công thức truy hồi sau:

F[i,j]:=F[i,j-1] + F[i-1,j] + a[i,j] – F[i-1,j-1] ;

Sau khi tính, bảng F[i,j] có dạng như sau:

Trang 9

Giải thích

Giả sử ô đang tính F[3,3] đƣợc tính bằng công thức truy hồi:

F[i,j]:=F[i,j-1] + F[i-1,j] + a[i,j] – F[i-1,j-1] ; F[3,3]:=F[3,2] + F[2,3] + a[3,3] – F[2,2]

Trang 10

2.2 Bài toán 2: Đoạn con liên tiếp có tổng lớn nhất

Cho dãy A gồm N số nguyên (N <= 100000) Tìm đoạn con (các phần tử liên tiếp) có tổng lớn nhất

* Cách giải 2: Quy hoạch động

Gọi F1[i] là tổng lớn nhất trong đoạn A[1 i] (có thể không chứa A[i])

Để tính đƣợc F1[i] ta dùng thêm 1 mảng phụ F2 với ý nghĩa: F2[i] là tổng lớn nhất trong đoạn A[1 i] có chứa A[i]

Cơ sở quy hoạch động:

F1[0]=0 ; F2[0] = 0 ;

Công thức truy hồi

F2[i] = Max(F2[i - 1] + A[i], A[i])

F1[i] = Max(F1[i - 1], F2[i])

Dựa vào quan hệ giữa F1[i - 1] và F2[i] để tìm ra phần tử cuối của đoạn con cần tìm Sau đó duyệt lui về 1 cho tới khi nào đạt đƣợc tổng lớn nhất (F1[n]) Độ phức tạp: O(n)

2.3 Quy hoạch động dựa trên bài toán đã đƣợc sắp xếp

2.3.1 Sắp xếp

2.3.2 Phát biểu bài toán

2.3.3 Các thuật toán sắp xếp thông dụng

2.3.3.1 Thuật toán sắp xếp nổi bọt (Bubble Sort)

2.3.3.2 Thuật toán sắp xếp nhanh (Quick Sort)

Trang 11

2.3.3.4 Sắp xếp bằng đếm phân phối (Distribution Counting)

Tại thời điểm G, tọa độ của robot i đang là ai (i=1,2, ,N), Ban

tổ chức công bố một bộ gồm M thẻ lệnh, mỗi thẻ ghi một số nguyên bj

(j=1,2, ,M) và yêu cầu các robot phải phối hợp phân công để mỗi robot đƣợc nhận một thẻ rồi đi chuyển đến tọa độ ghi trong thẻ Chi phí mà một robot di chuyển từ từ tọa độ x đến tọa độ y đƣợc tính là giá trị tuyệt đối của hiệu a-b Ban tổ chức sẽ đánh giá độ thông minh của các robot thông qua tổng chi phí S mà các robot phải chi phí cho việc di chuyển, theo tiêu chí: S càng nhỏ thì cảng đƣợc đánh giá cao

Yêu cầu: Cho biết tọa độ tại thời điểm G của N robot, M giá

trị ghi trong M thẻ lệnh của ban tổ chức, hãy cho biết giá trị nhỏ nhất của S mà các robot có thể đạt đƣợc

Trang 12

Tất cả các số ai, bj, đều nguyên và nằm trong khoảng từ 0 đến 10000 Kết quả: Ghi ra duy nhất số nguyên S tìm được

2

Thuật toán quy hoạch động như sau

 Sắp xếp mảng tọa độ a, b tăng dần (Dùng Quick Sort)

 Gọi F[i,j] là chi phí nhỏ nhất để i robot di chuyển trong j vị trí cho trước:

Vì đã sắp xếp trước tọa độ của các robot và các thẻ nên:

- Ta có: F[0,0]=0; F[0,1]=0; F[0,2]=0;

Trường hợp 1: 1 robot và nhiều thẻ

- Nếu có 1 robot và 1 thẻ thì : F[1,1]=F[0,0] + abs(a[1]-b[1])

- Nếu có 1 robot và 2 thẻ thì F[1,2]=min (F[1,1], F[0,1] + abs(a[1]-b[2]))

- Nếu có 1 robot và 3 thẻ thì F[1,3]=min (F[1,2], F[0,2] + abs(a[1]-b[3]))

-

Trường hợp 2: nhiều robot và nhiều thẻ

- Nếu có 2 robot và 2 thẻ thì F[2,2]=F[1,1] + abs(a[2]-b2])

- Nếu có 2 robot và 3 thẻ thì F[2,3]=min (F[2,2], F[1,2] + abs(a[2]-b[3]))

- Nếu có 2 robot và 4 thẻ thì F[2,4]=min (F[2,3], F[1,3] + abs(a[2]-b[4]))

Trang 13

- …

Từ đó ta suy ra công thức truy hồi

F[i,i]:= F[i-1,i-1] + abs(x[i] – y[i]), với mọi i trong khoảng [1 n]

F[i,j]:= min(F[i,j-1], F[i-1,j-1] + abs(x[i] – y[j]), với mọi i thuộc khoảng [1 n] và j thuộc [i+1 m]

Trang 14

Bài 2: Đoạn gối nhau dài nhất

Cho N đoạn thẳng trên trục số với các điểm đầu ai và điểm cuối bi là những số nguyên trong khoảng 1000 1000, ai < bi Hãy tìm

số lƣợng tối đa K đoạn thẳng gối nhau liên tiếp Hai đoạn thẳng [a,b]

và [c,d] đƣợc gọi là gối nhau nếu xếp chúng trên cùng một trục số thì điểm đầu đoạn này trùng với điểm cuối của đoạn kia, tức là c = b hoặc

d = a

Dữ liệu vào: tệp văn bản DOAN.INP gồm

- Dòng đầu số N cho biết tổng các đoạn

- N dòng tiếp theo , mỗi dòng cho biết 2 số nguyên là điểm đầu ai

và điểm cuối bi

- Các số trên cùng một dòng cách nhau ít nhất một khoảng cách

Dữ liệu ra: tệp văn bản DOAN.OUT chứa:

- Duy nhất một số nguyên cho biết số lƣợng tối đa các đoạn tìm đƣợc

Trang 15

Thuật toán quy hoạch động như sau

Để có thể quy hoạch động trước tiên ta cần sắp xếp tăng dần các đoạn theo đầu phải của chúng Sau đó tiến hành quy hoạch như sau:

 Gọi L[i] là số lượng tối đa các đoạn gối nhau tính từ 1 đến i

 Ban đầu độ dài tối đa tại đoạn thứ i là 1 (vì chỉ có chính nó) Đây là bài toán cơ sở quy hoạch động

 Với mỗi đoạn thứ i, ta tìm tất cả các đoạn thứ j (j=1 i-1) mà

có điểm cuối = điểm đầu của i và độ dài L[j] là lớn nhất Nếu thỏa mãn thì ta thực hiện gán L[i]:=L[j]+1(độ dài của đoạn

thứ i bằng độ dài của đoạn thứ j +1 (j đang là dài nhất)) 2.4 Quy hoạch động kết hợp xử lý Bit để mô tả trạng thái bài toán

2.4.1 Bit và các thao tác xử lý Bit

2.4.1.1 Quy ước về vị trí của các bit

2.4.1.2 Các phép toán logic

2.4.1.3 Một số ứng dụng

2.4.2 Một số bài toán cùng lớp dùng quy hoạch động kết hợp bit

Dưới đây là một số bài toán quy hoạch động kết hợp xử lý bit

để mô tả trạng thái của bài toán

Bài 1: Chọn ô

Cho một bảng hình chữ nhật kích thước 4 × n ô vuông Các

dòng được đánh số từ 1 đến 4, từ trên xuống dưới, các cột được đánh

số từ 1 đến n từ trái qua phải Ô nằm trên giao của dòng i và cột j được gọi là ô (i,j) Trên mỗi ô (i,j) có ghi một số nguyên a ij , i = 1, 2, 3, 4; j

= 1,2, …, n Một cách chọn ô là việc xác định một tập con khác rỗng S của tập tất cả các ô của bảng sao cho không có hai ô nào trong S có chung cạnh Các ô trong tập S được gọi là ô được chọn, tổng các số

trong các ô được chọn được gọi là trọng lượng của cách chọn

Trang 16

Ví dụ: Xét bảng với n=3, trong hình vẽ dưới đây

Cách chọn cần tìm là tập các ô S = {(3,1), (1,2), (4,2), (3,3)} với trọng

lượng 32

Yêu cầu: Hãy tìm cách chọn ô với trọng lượng lớn nhất

Dữ liệu: Vào từ file van bản SELECT.INP:

Dòng đầu tiên chứa số nguyên dương n là số cột của bảng

Dòng thứ j trong số n dòng tiếp theo chứa 4 số nguyên a 1j , a 2j ,

a 3j , a 4j, hai số liên tiếp cách nhau ít nhất một dấu cách, là 4 số

trạng thái, biểu diễn từ 0 tới

24 – 1

Gọi F[i,x] là tổng trọng lượng lớn nhất xét từ cột thứ 1 tới cột thứ i

và trạng thái chọn của cột thứ i được biểu diễn bằng biến x

-1 9 3 -4 5 -6

Trang 17

Ta có công thức truy hồi như sau

F[i,x]:=max(F[i-1,y])+sum(i,x) Trong đó:

Biến x và y là 2 trạng thái tương ứng của cột thứ i và i – 1 Theo yêu cầu của bài toán thì trạng thái x và y phải thỏa mãn, bit thứ k của biến x phải khác bit thứ k của biến y vì việc chọn ô phải thỏa mãn không có hai ô nào có chung cạnh (Getbit(k,x) <> Getbit(k,y))

Hàm Sum(i,x) là trọng số của cột thứ i, tương ứng với trạng thái x Cài đặt: Biến A chứa giá trị của bảng, biến m = 24

– 1 , với m +1 là số trạng thái

Trong chương trình sẽ sử dụng một số hàm như sau:

+ Lấy bit thứ k của trạng thái x: Getbit(k,x)

function getbit(k,x:word):byte;

begin getbit:=(x shr k)and 1;

end;

+ Hàm kiểm tra trạng thái x có thỏa mãn yêu cầu bài toán hay không (không có hai ô nào có chung cạnh), nghĩa là bit thứ k và bit thứ k – 1 của trạng thái x phải khác nhau:

function check(x,y:word):boolean;

Trang 18

F[i,x]:=max(F[i-1,y])+sum(i,x)

Để tính công thức trên ta sử dụng đoạn code sau đây:

vc:=1000000000;

for i:=1 to n do {xét lần lượt n cột}

for x:=0 to 15 do {với mỗi cột xét 2 4 trạng thái}

if ok(x) then {nếu trạng thái x thỏa mãn bài toán}

begin

max:=-vc;

{Tìm trạng thái y của cột thứ i-1 có tổng trọng lượng lớn nhất}

for y:=1 to 15 do

if check(x,y) and ok(y) then

if max<f[i-1,y] then max:=f[i-1,y];

Trang 19

Hình 2.4 Bảng phương án tính F[n,x] của bài “Chọn ô”

Từ bảng lưu vết, xuất ra giá trị được chọn trong bảng dữ liệu vào a:

Trong kì nghỉ hè năm nay Sherry được bố thưởng cho 1 tour

du lịch quanh N đất nước tươi đẹp với nhiều thắng cảnh nổi tiếng (vì Sherry rất ngoan) Tất nhiên Sherry sẽ đi bằng máy bay

Giá vé máy bay từ đất nước i đến đất nước j là Cij (dĩ nhiên Cij có thể khác Cji) Tuy được bố thưởng cho nhiều tiền để đi du lịch nhưng Sherry cũng muốn tìm cho mình 1 hành trình với chi phí rẻ nhất có thể để dành tiền mua quà về tặng mọi người (Các chuyến bay của Sherry đều được đảm bảo an toàn tuyệt đối)

Ngày đăng: 02/04/2018, 21:46

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm