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

Phương pháp quy hoạch động và một số bài toán điển hì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 (198.84 KB, 41 trang )

Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Lời nói đầu.
Theo một nghĩa nào đó, có thể xem máy tính nh một công cụ để giải các bài
toán. ở đây khái niệm bài toán đợc quan niệm một cách rất mềm dẻo bao gồm các
bài toán hiểu theo nghĩa thuần tuý toán học nh những trờng hợp riêng. Nói một cách
đơn giản, ta có thể đồng nhất việc giải một bài toán với việc làm một việc gì đó
bằng máy tính. Nh vậy, học sử dụng máy tính thực chất là học cách làm thể nào
giao cho máy tính làm đợc việc mà ta muốn nó làm. Cần chú ý rằng máy tính là một
vật vô tri vô giác, sự thông minh của máy tính chỉ là sự thể hiện sự thông minh
của ngời sử dụng nó. Cùng một loại máy tính, chất lợng khai thác công cụ đó rất
khác nhau ở mỗi ngời. Vậy thì thế nào là giao cho máy điều cần làm? Nói vắn tắt
đó là việc lập chơng trình cho máy tính. Mỗi chơng trình nhằm mục đích giải một
bài toán nào đó, mục đích đó phải đợc thể hiện thành những dãy thao tác mà máy
có thể thực hiện đợc. Việc viết các mệnh lệnh để giao cho máy thực hiện đợc gọi
là việc lập trình cho máy tính. Ngời lập trình chuyển lời giải bài toán thành các lệnh
cho máy thực hiện. Quá trình đó gồm các giai đoạn.
- Xác định rõ bài toán cần giải quyết.
- Xây dựng thuật toán.
- Viết chơng trình.
- Thử và hiệu chỉnh chơng trình.
- T liệu hoá chơng trình.
Mặc dù không tồn tại một phơng pháp vạn năng có thể giúp ta xây dựng đợc
thuật toán giải quyết mọi vấn đề, nhng các nhà nghiên cứu đã tìm ra một số phơng
pháp xây dựng thuật toán. Mỗi phơng pháp có thể áp dụng để giải quyết một phạm
vi khả rộng các bài toán. Có rất nhiều phơng pháp trong chiến lợc xây dựng thuật
toán nh: Chia- để - trị, phơng pháp tham ăn, quay lui, nhánh và cận,

1




Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

quy hoạch động... Trong khuôn khổ luận văn tốt nghiệp của mình, tôi muốn đợc tìm
hiểu phơng pháp xây dựng thuật toán bằng phơng pháp Quy hoạch động và giải
một số bài toán điển hình - đợc ứng dụng rất nhiều trong thực tế.
Để có thể thực hiện đợc đề tài này, tôi đã đợc sự hởng dẫn rất nhiệt tình của
thầy giáo Trần Xuân Hào, sự ủng hộ của các bạn trong lớp. Tôi xin cảm ơn thầy và
các bạn rất nhiều. Có thể nói, trong quá trình thực hiện đề tài tôi đã cố gắng hết sức
mình. Do đó, kết quả đạt đợc là đáng đợc ghi nhận nhng chắc chắn không tránh
khỏi những thiếu sót, những vấn đề cha làm đợc không phải là ít. Rất mong đợc dạy
bảo, đóng góp ý kiến của các thầy cô giáo và các bạn.
Một lần nữa, tôi xin cảm ơn các thầy cô giáo và các bạn rất nhiều.
Vinh, ngày 05 tháng 05 năm 2004
Sinh viên thực hiện:
Tô Hữu Hùng
Lớp 41B1-CNTT.

2


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Tóm tắt.
Chơng I. Thuật toán và các phơng pháp thiết kế phổ dụng.

I.1. Một số khái niệm cơ bản.
I.1.1. Khái niệm về thuật toán.
I.1.1.1 Sơ lợc về lịch sử.
I.1.1.2. Khái niệm về bài toán tính toán.
I.1.1.3. Khái niệm thuật toán.
I.1.1.4. Mở rộng khái niệm thuật toán.
I.1.2. Xây dựng thuật toán.
I.1.2.1. Quan niệm về thuật toán.
I.1.2.2. Mô tả thuật toán.
I.1.2.3. Hiệu quả của thuật toán.
I.2. Một số phơng pháp thiết kế thuật toán phổ dụng.
I.2.1. Chia - để trị.
I.2.2. Phơng pháp tham ăn.
I.2.3. Phơng pháp quay lui.
I.2.4. Phơng pháp nhánh và cận.
Chơng II. Phơng pháp Quy hoạch động.
II.1. Nội dung phơng pháp.
II.2. Các bớc thực hiện Quy hoạch động.
II.3. Hạn chế của Quy hoạch động.
Chơng III. Một số bài toán điển hình.
III.1. Dãy con không giảm dài nhất.
III.2. Dãy con chung dài nhất của hai dãy số nguyên.
III.3. Xếp hàng mua vé.
III.4. Di chuyển từ tây sang đông.
III.5. Bài toán sắp xếp đồ vật vào Ba lô.
III.6. Tìm đờng đi ngắn nhất giữa 2 thành phố.
3


Luận văn tốt nghiệp


Phơng pháp quy hoạch động và một số bài toán điển hình

Mục lục.
Trang
Lời nói đầu.

1

Tóm tắt đề tài.

3

Chơng I. Thuật toán và các phơng pháp thiết kế phổ dụng.

6

I.1. Một số khái niệm cơ bản.

6

I.1.1. Khái niệm về thuật toán.

6

I.1.1.1 Sơ lợc về lịch sử.

6

I.1.1.2. Khái niệm về bài toán tính toán.


7

I.1.1.3. Khái niệm thuật toán.

8

I.1.1.4. Mở rộng khái niệm thuật toán.

9

I.1.2. Xây dựng thuật toán.

9

I.1.2.1. Quan niệm về thuật toán.

9

I.1.2.2. Mô tả thuật toán.

11

I.1.2.3. Hiệu quả của thuật toán.

12

I.2. Một số phơng pháp thiết kế thuật toán phổ dụng.

13


I.2.1. Chia - để trị.

13

I.2.2. Phơng pháp tham ăn.

14

I.2.3. Phơng pháp quay lui.

15

I.2.4. Phơng pháp nhánh và cận.

18

Chơng II. Phơng pháp Quy hoạch động.

21

II.1. Nội dung phơng pháp.

21

II.2. Các bớc thực hiện Quy hoạch động.

23

II.3. Hạn chế của Quy hoạch động.


24

4


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Chơng III. Một số bài toán điển hình.

26

III.1. Dãy con không giảm dài nhất.

26

III.2. Dãy con chung dài nhất của hai dãy số nguyên.

29

III.3. Xếp hàng mua vé.

33

III.4. Di chuyển từ tây sang đông.

36


III.5. Bài toán sắp xếp đồ vật vào Ba lô.

40

III.6. Tìm đờng đi ngắn nhất giữa 2 thành phố.

46

Kết luận.

51

Tài liệu tham khảo.

52

5


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Chơng I. Thuật toán và các phơng pháp thiết kế phổ dụng.

I.1. Một số khái niệm cơ bản.
I.1.1. Khái niệm về thuật toán.
I.1.1.1. Sơ lợc về lịch sử.
Thuật toán đã đợc biết đến từ rất lâu. Bản thân thuật ngữ Thuật toán (Algorithm)
là viết tắt tên của nhà toán học thế kỷ thứ IX: Abu Jafa Mohammed ibn Musa alKhowarizmi. Khái niệm thuật toán có một lịch sử phát triển lâu dài. Chúng ta hãy

điểm qua một số móc quan trọng.
Đầu tiên, thuật toán đợc hiểu nh là các quy tắc thực hiện các phép tính số học
với các con số đợc viết trong hệ cơ đếm thập phân.
Euclid đề xuất thuật toán để tìm ớc số chung lớn nhất của hai số GCD(x,y).
Hibert vào năm 1900 đã đề xuất một vấn đề rất hóc búa cho cộng đồng các
nhà toán học: Hãy xây dựng một thủ tục mà theo đó sau một số hữu hạn
phép toán có thể xác định một đa thức có nghiệm nguyên hay không. Vấn
đề này đợc biết dới tên gọi Bài toán thứ 10 của Hibert.
Chúng ta có ví dụ về thuật toán, nhng cha có định nghĩa hình thức thể nào là
thuật toán. Để chứng minh là không tồn tại thuật toán giải bài toán tính toán,
ta cần có định nghĩa hình thức của thuật toán.
Năm 1936, hai nhà toán học Turing và Church mỗi ngời đã đề xuất một mô
hình tính toán riêng, mà sau đó đợc chứng minh là tơng đơng.
Bài toán về tính dừng (halting problem) và bài toán về nghiệm nguyên của đa
thức (Integer Root Problem) đã đợc chứng minh là các bài toán không có
thuật toán giải.
Sự xuất hiện của máy tính điện tử là một động lực thúc đẩy sự phát triển
mạnh mẽ của các nhà nghiên cứu về cơ sở lý thuyết của khoa học máy tính
nói chung và thuật toán và độ phức tạp tính toán nói riêng.
6


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

I.1.1.2. Khái niệm bài toán tính toán (Computational Problem).
Một cách không hình thức, bài toán tính toán là ánh xạ từ tập các đầu vào nào
đó vào tập các đầu ra nhất định. Chẳng hạn, đầu vào là một đa thức nhiều biến P
còn đầu ra là bộ những giá trị nguyên của biến số mà tại đó đa thức nhận giá trị 0.

Ta nói một thuật toán hay một máy giải đợc bài toán nếu mọi bộ dữ liệu vào có thể,
nó luôn dừng và đa ra đầu ra đúng của bài toán. Trong cách trình bày hình thức khái
niệm độ phức tạp tính toán, ngời ta luôn giả thiết là cả đầu vào lẫn đầu ra đều là các
xâu nhị phân {0, 1}n.
Định nghĩa. Bài toán tính toán F là ánh xạ từ tập các xâu nhị phân độ dài hữu
hạn vào tập các xâu nhị phân độ dài hữu hạn: F: {0, 1}* {0, 1}*.
Một trong những vấn đề quan trọng nhất trớc khi chúng ta muốn xử lý các
đầu vào không phải là xâu nhị phân, đó là tìm cách biểu diễn chúng dới dạng xâu.
Ta có thể dùng xâu để biểu diễn các đối tợng nh các đa thức, đồ thị, ôtômat, ngôn
ngữ, âm thanh, hình ảnh..., cũng nh mọi tố hợp của các đối tợng này.
Ví dụ.
Mỗi số nguyên x đều có thể biểu diễn dới dạng xâu nhị phân là cách
viết trong hệ đếm nhị phân của nó.
Hệ phơng trình tuyến tính Ax = b có thể biểu diễn dới dạng xâu là
ghép nối của các xâu biểu diễn nhị phân của các thành phần của ma
trận A và vectơ b.
Đồ thị có thể biểu diễn bởi ma trận kề.
Đa thức một biến: P(x) = a0 + a1x + ... +anxn, hoàn toàn xác định bởi
dãy số n, a0, a1, ..., an, mà để biểu diễn dãy số này chúng ta có thể sử
dụng xâu nhị phân.
Máy turing có thể cài đặt để giải mã các biểu diễn này, và vì thế nó có thể
thực hiện đợc những thao tác mà ta đòi hỏi.

7


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình


Ta sẽ dùng <O> để ký hiệu mã hoá của biểu diễn của một đối tợng O dới
dạng xâu. Nếu có nhiều đối tợng O1, O2, ..., On cần biểu diễn thì ta dùng ký hiệu
<O1, O2, ...,On>. Tất nhiên, việc mã hoá một đối tợng có thể thực hiện bằng nhiều
cách. Tuy nhiên việc chọn cách biểu diễn hợp lý có ý nghĩa quan trọng trong việc
xử lý các đối tợng đó. Chẳng hạn, không nên biểu diễn một đồ thị nh là danh sách
tất cả các đờng đi có thể có trên nó.
I.1.1.3. Khái niệm thuật toán.
Định nghĩa. Thuật toán là một hệ thống chặt chẽ và rõ ràng các quy tắc nhằm
xác định một dãy các thao tác trên những đối tợng, sao cho sau một số hữu hạn bớc
thực hiện các thao tác, ta đạt đợc mục tiêu định trớc.
Các đặc trng của thuật toán.
Tính xác định: Mỗi bớc của thuật toán, các thao tác phải hết sức rõ ràng.
Không thể gây nên sự nhập nhằng, lẫn lộn, tuỳ tiện. Nói cách khác là trong
cùng một điều kiện, hai bộ xử lý cùng thực hiện một bớc của thuật toán thì
phải có cùng một kết quả.
Tính hữu hạn dừng: Một thuật toán bao giờ cũng phải dừng lại sau một số
hữu hạn bớc.
Tính đúng đắn: Sau khi thực hiện tất cả các lệnh của thuật toán ta phải đợc
kết quả mong muốn, kết quả đó thờng đợc xác định theo định nghĩa cho trớc.
Tính phổ dụng: Thuật toán có thể giải bất kỳ bài toán nào trong cùng một
lớp các bài toán, có nghĩa là thuật toán có thể làm việc với các dữ liệu khác
nhau, trong một miền xác định và luôn dẫn đến kết quả mong muốn.
Tính có đại lợng vào và ra: Khi bắt đầu, một thuật toán bao giờ cũng nhận
các đại lợng vào mà ta thờng gọi là dữ liệu vào, các dữ liệu vào thờng lấy từ
một tập xác định cho trớc. Sau khi kết thúc, một thuật toán bao giờ cũng cho

8


Luận văn tốt nghiệp


Phơng pháp quy hoạch động và một số bài toán điển hình

ta một số đại lợng ra tuỳ theo chức năng mà thuật toán đảm nhiệm, chúng
thờng đợc gọi là dữ liệu ra.
Tính hiệu quả: Tính hiệu quả của một thuật toán đợc đánh giá dựa trên các
tiêu chuẩn sau.
- Dung lợng bộ nhớ cần có.
- Số các phép toán cần thực hiện.
- Thời gian cần thiết để chạy.
- Có dễ hiểu đối với con ngời không?
- Có dễ cài đặt trên máy không?
I.1.1.4. Mở rộng khái niệm thuật toán.
Để có thể giải các bài toán bằng máy tính chúng ta thờng phải có một quan
niệm rộng rãi hơn về thuật toán. Cụ thể là lu ý đến các đặc điểm sau.
Không cần xác định toàn bộ lời giải các thao tác theo từng bớc một cách chính
xác, đơn vị và rõ ràng. Thay vào đó chỉ cần chỉ ra một cách chuyển từ một bớc
giải i tới bớc giải tiếp i+1, và tìm cách cắt nhỏ bài toán thành các bài toán con,
đó chính là thuật toán Đệ quy rất quan trọng để giải các bài toán tổng quát.
Có nhiều bài toán không có cách giải đúng hoặc cách giải đúng không thể chấp
nhận đợc do hạn chế về thời gian chạy và kích thớc về bộ nhớ. Nhng nếu chúng
ta chấp nhận kết quả gần đúng thì có thể tồn tại nhiều cách giải đỡ phức tạp và
có hiệu quả hơn, đó chính là các thuật toán Heuristic giải các bài toán gần
đúng.
I.1.2. Xây dựng thuật toán.
I.1.2.1. Quan niệm về thuật toán.
Nh chúng ta đã nói ở trên, việc cho một bài toán có nghĩa là cho input và
output. Việc giải bài toán có nghĩa là tìm cách xuất phát từ input tìm đợc output
theo yêu cầu của bài toán đã đề ra và công việc đó ta muốn giao cho máy tính làm.
9



Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Chính vì vậy, ta chỉ quan tâm đến những phơng pháp hiệu quả để xuất phát từ input
của bài toán, ta dẫn ra đợc output cần thiết.
Một phơng pháp hiệu quả để giải một bài toán nào đó là việc xác định tờng
minh output theo input bằng một quá trình bao gồm một tập hợp hữu hạn các thao
tác đơn giản đợc sắp xếp theo một trình tự xác định sao cho theo đó, từ input ta sẽ
nhận đợc output cần tìm hoặc khẳng định không có output nh bài toán đó đòi hỏi.
Về mặt thuật ngữ, ta gọi quá trình nh vậy là một thuật toán (algorithm). Đó
chính là quan niệm trực quan về thuật toán. Nh vậy, giải một bài toán là xây dựng
một thuật toán đối với bài toán đó. Nói cụ thể hơn, việc giải một bài toán P nào đó
là việc xây dựng một tập hữu hạn các thao tác đơn giản đợc sắp xếp theo một trình
tự xác định sao cho sau khi hoàn thành dãy thao tác đó, ta thu đợc output của P. Chỉ
những dãy thao tác nh vậy mới có khả năng chuyển giao cho máy tính thực hiện đợc.
Toán học vẫn rất cần những nghiên cứu định tính và những kết quả có đợc
theo hớng nghiên cứu này đã, đang và sẽ vẫn có những vị trí xứng đáng trong toán
học nói riêng và khoa học nói chung. Tuy nhiên, trong khuôn khổ của tin học, khi
nói đến việc giải bài toán, ta sẽ chỉ quan tâm đến những phơng pháp hiệu quả để
xuất phát từ input của bài toán, dẫn ra đợc output cần thiết.
Trong quá trình nghiên cứu giải bài toán theo nghĩa nêu trên, trong toán học
đã diẽn ra một quá trình phát triển đầy kịch tính. Cho tới đầu thế kỷ XX, với lòng
tin tiên nghiệm vào việc mọi bài toán (phát biểu đúng đắn) đều có thuật toán giải,
nhiều nhà toán học đầy tài năng và tâm huyết đã tiến công vào vào các bài toán
đang tồn tại nh những lời thách đố con ngời.
Vấn đề then chốt nhất của lý thuyết tính toán phát sinh ở đây. Để chứng minh
một bài toán nào đó có thuật toán giải nó, ta chỉ cần đề ra một thuật toán theo quan

niệm trực giác của khái niệm này và kiếm định tính đúng đắn của nó đối với bài
toán đã cho. Tuy nhiên, khi cần chứng minh việc không có thuật toán giải một bài
toán nào đó, quan niệm trực quan về thuật toán không thể là cơ sở đảm bảo cho một
10


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

chứng minh toán học chặt chẽ đợc. Do đó, muốn chứng minh những điều khẳng
định không có thuật toán giải một bài toán nào đó, ta cần có một định nghĩa toán
học cho khái niệm thuật toán.
Vào những năm 1930-1936, lần lợt các nhà toán học K.Godel, S.Kleene,
A.Church, A.Turing đã đề ra một số định nghĩa khác nhau cho khái niệm thuật
toán. Trong số các định nghĩa toán học khác nhau (nhng tơng đơng) về thuật toán,
các khái niệm máy Turing (1937) và hàm đệ quy (1931-1936) đợc sử dụng rộng rãi
hơn vì có nhiều thuận tiện cho các nghiên cứu cả về lý thuyết lẫn thực hành. Ta có
thể xem máy tính Turing là một mô hình toán học của máy tính.
I.1.2.2. Mô tả thuật toán.
Việc mô tả một thuật toán giải một bài toán nào đó có nghĩa là trình bày trình
tự các thao tác cơ bản của thuật toán. Việc mô tả này có thể dùng ngôn ngữ thông
thờng. Ta có thể thấy cách mô tả qua một số ví dụ sau.
Ví dụ 1. Thuật chia Euclide.
Định lí Euclide khẳng định rằng cho trớc hai số nguyên dơng bất kì a và b,
luôn tồn tại duy nhất hai số q và r sao cho a=qb+r và 0 r < b, trong đó q đợc gọi là
thơng của phép chia a cho b và r đợc gọi là phần d. Bài toán đặt ra là cho trớc a và
b, ta cần tìm q và r. Thuật toán giải bài toán này đợc thể hiện nh sau.
Bớc 0. q=0;
Bớc 1. Nếu a < b thì r = a và kết thúc, nếu không thì chuyển đến bớc 2;

Bớc 2. Nếu a b thì thay a bởi a - b, q bởi q + 1 và quay về bớc 1;
Ta thấy rằng các bớc 0 -> 2 cho ta một thuật toán để tìm q và r vì mỗi bớc đó
đều là những Thao tác đơn giản và trình tự thực hiện các thao tác đó đợc xác định
rõ ràng. Dãy thao tác đó không thể tiếp diễn vô hạn vì mỗi lần quay trở lại bớc 1, a
giảm đi một lợng là b.
Ví dụ 2. Cho dãy số a1, a2,...,an. Hãy tìm giá trị lớn nhất max và giá trị nhỏ nhất min
của dãy đó. Thuật toán tìm max và min đợc diễn đạt nh sau.
11


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Bớc 0. max=:a1; min:=a1; i:=2;
Bớc 1. Nếu i n thì [ nếu a i < min thì thay min bằng a i ; Nếu ai > max thì thay max
bằng ai ]. Nếu không thì kết thúc.
Bớc 2. Thay i bằng i + 1 và quay về bớc 1;
I.1.2.3. Hiệu quả của thuật toán.
Cần chú ý rằng mỗi thuật toán chỉ giải một bài toán nào đó nhng có thể có
nhiều thuật toán khác nhau giải cùng một bài toán. Một vấn đề đặt ra là ta nên chọn
một thuật toán tốt để giải bài toán đã cho.
Nhng thế nào là thuật toán tốt ? Đây là nội dung nghiên cứu của lý thuyết độ
phức tạp của thuật toán. Nói một cách đơn giản, khi dùng máy tính thực hiện một
chơng trình (thể hiện một thuật toán nào đó ), hệ điều hành cần cung cấp cho chơng trình đó các tài nguyên nh giờ CPU, bộ nhớ Số l ợng các tài nguyên cần dùng
thể hiện độ phức tạp của thuật toán. Thuật toán đợc xem là tốt nếu chơng trình tơng
ứng dùng ít tài nguyên .
Trong các tài nguyên để chạy chơng trình, hiện nay ngời ta quan tâm nhiều
nhất đến thời gian vì đó là dạng tài nguyên không tái tạo đợc . Một thuật toán đợc
xem là tốt nếu chơng trình tơng ứng chạy nhanh, hay chính xác hơn, chạy trong thời

gian chấp nhận đợc. Để đánh giá độ phức tạp của một thuật toán, ta có thể ớc tính
số thao tác cơ bản cần dùng để thực hiên thuật toán. Thờng có hai cấu trúc phổ biến
trong các thuật toán: Cấu trúc vòng lặp và cấu trúc đệ quy. Số thao tác của một vòng
lặp dễ dàng tính đợc nhng nếu có một chơng trình con đệ quy, việc ớc lợng số thao
tác khó khăn hơn vì ta phải tính một đại lợng theo một công thức truy hồi.

I.2. Một số phơng pháp thiết kế thuật toán phổ dụng.
I.2.1. Chia - để - trị.

12


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Phơng pháp thiết kế thuật toán đợc áp dụng rộng rãi nhất là chiến lợc chia - để
- trị. T tởng của chiến lợc này là nh sau: Ngời ta phân bài toán cần giải thành các
bài toán con. Các bài toán con lại đợc phân thành các bài toán con nhỏ hơn, cứ tiếp
tục cho tới khi ta nhận đợc các bài toán con hoặc đã có thuật giải, hoặc là có thể dễ
dàng đa ra thuật giải. Sau đó ta tìm cách kết hợp các nghiệm của các bài toán con để
nhận đợc nghiệm của bài toán con lớn hơn, để cuối cùng nhận đợc nghiệm của bài
toán cần giải. Thông thờng các bài toán con nhận đợc trong quá trình phân chia là
cùng dạng với bài toán ban đầu, chỉ có cở của chúng là nhỏ hơn. Trong các trờng
hợp nh thế, thuật toán tìm đợc có thể biểu diễn một cách tự nhiên bởi thủ tục đệ
quy.
Sau đây là lợc đồ phơng pháp chia - để - trị.
Procedure DivideConquer (A, x);
{Tìm nghiệm của toàn bộ bài toán A}
begin

if A đủ nhỏ Then solve (A)
else begin
Phân A thành các bài toán con A1, A2, ..., Am;
For i:=1 to m do DivideConquer (Ai, xi);
Kết hợp các nghiệm xi (i = 1, 2,..., m) của các bài toán con A i để nhận
đợc nghiệm x của bài toán A;
End;
End;
Trong thủ tục trên, solve là thuật giải bài toán A trong trờng hợp A có cở đủ
nhỏ.

I.2.2. Phơng pháp tham ăn.

13


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Phơng pháp tham ăn là một chiến lợc thiết kế thuật toán thờng đợc sử dụng để
giải quyết các bài toán tối u. Nhiều vấn đề cần giải quyết có thể quy về vấn đề sau
đây. Cho trớc một tập A các đối tợng nào đó, đòi hỏi phải chọn ra một tập con S các
đối tợng thoả mãn các yêu cầu đã đặt ra đợc gọi là nghiệm chấp nhận đợc của bài
toán. Một hàm mục tiêu gắn mỗi nghiệm chấp nhận đợc với một giá trị nào đó. Một
nghiệm chấp nhận đợc mà tại đó hàm mục tiêu có giá trị lớn nhất (hoặc nhỏ nhất )
đợc gọi là nghiệm tối u.
T tởng của phơng pháp tham ăn là nh sau. Ta xây dựng tập S dần dần từng bớc
bắt đầu từ tập rỗng. Tại mỗi bớc, ta sẽ chọn một phần tử Tốt nhất trong các phần
tử còn lại của A để đa vào S. Việc lựa chọn một phần tử nh thế ở mỗi bớc đợc hớng

dẫn bởi hàm chọn. Phần tử đợc chọn sẽ bị loại khỏi tập A. Nếu thêm phần tử đợc
chọn vào tập S mà S vẫn còn thoả mãn các điều kiện của bài toán thì ta mở rộng S
bằng cách thêm vào phần tử đợc chọn.
Procedure Greedy(A, S);
{A là tập các ứng cử viên, S là nghiệm}
begin
S ;
While A < > do
Begin
X select (A);
A A - {x};
If S {x} chấp nhận đợc Then S S {x};
End;
End;
Trong lợc đồ tổng quát trên, select là hàm chọn, nó cho phép ta chọn ra từ tập
A một phần tử đợc xem là tốt nhất, nhiều hứa hẹn nhất là thành viên của nghiệm.

14


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Ta có thể dễ dàng thấy tại sao các thuật toán nh thế đợc gọi là tham ăn. Tại
mỗi bớc nó chọn miếng ngon nhất (đợc xác định bởi hàm chọn), nếu thấy có thể
nuốt đợc (có thể đa vào nghiệm) nó sẽ xơi ngay, nếu không nó sẽ bỏ đi, sau này
không bao giờ xem xét lại.
Cần nhấn mạnh rằng, thuật toán tham ăn trong một số bài toán, nếu xây dựng
đợc hàm chọn thích hợp có thể cho nghiệm tối u. Trong nhiều bài toán, thuật toán

tham ăn chỉ tìm đợc gần đúng với nghiệm tối u.
I.2.3. Phơng pháp quay lui.
Trong các kỹ thuật cơ bản thiết kế thuật toán, quay lui là một trong những kỹ
thuật quan trọng nhất. Nó có thể đợc áp dụng để thiết kế thuật toán tìm ra một
nghiệm hoặc tất cả các nghiệm của bài toán.
Trong nhiều vấn đề, việc tìm nghiệm có thể quy về việc tìm một vectơ hữu
hạn(x1, x2,..., xn) nhng độ dài véc tơ có thể không đợc xác định trớc. Vectơ này cần
phải thoả mãn một số điều kiện nào đó tuỳ thuộc vào vấn đề cần giải. Các thành
phần xi của vectơ đợc chọn ra từ một tập hữu hạn Ai(i=1,2,...,n).
Ví dụ. Bài toán tám con hậu.
Chúng ta cần đặt tám con hậu vào bàn cờ 8 x 8 sao cho chúng không tấn công
nhau, tức là không có cặp con hậu nào nằm cùng hàng, cùng cột, cùng đờng chéo.
Do các con hậu phải nằm trên các hàng khác nhau, ta sẽ đánh số các con hậu
từ 1 đến 8, con hậu i là con hậu nằm ở dòng thứ i (i = 1, 2, ..., 8). Gọi x i là cột mà
con hậu thứ i đứng. Nh vậy nghiệm của bài toán 8 con hậu là vectơ (x 1, x2, ..., x8),
trong đó 1 xi 8, tức là xi đợc chọn từ tập Ai = { 1, 2, ..., 8}. Vectơ (x1, x2, ..., x8)
là nghiệm nếu xi xj và hai ô (i, xi), (j, xj) không nằm trên cùng một đờng chéo.
T tởng của phơng pháp quay lui là nh sau. Ta xây dựng vectơ nghiệm dần từng
bớc, bắt đầu từ vectơ không ( ). Thành phần đầu tiên x 1 đợc chọn ra từ tập S1=A1.
Khi đã chọn đợc các thành phần x1, ..., xi-1 thì các điều kiện của bài toán ta sẽ xác
định đợc tập Si các ửng cứ viên có thể chọn làm thành phần x i. Tập Si là tập con của
15


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Ai và phụ thuộc vào các thành phần x 1, x2, ..., xi-1 đã chọn. Chọn một phần tử x i từ Si
ta mở rộng nghiệm một phần (x1, x2, ..., xi-1) đến nghiệm một phần (x1, x2, ..., xi).

Lặp lại quá trình trên để tiếp tục mở rộng nghiệm một phần (x 1, x2, ..., xi-1, xi). Nếu
không thể chọn đợc thành phần xi+1 (khi Si+1 = ) thì ta quay lại chọn một phần tử
khác của Si làm xi. Nếu không còn một phần tử của S i ta quay lại chọn một phần tử
khác của Si-1 làm xi-1 và cứ thể tiếp tục. Trong quá trình mở rộng nghiệm, ta phải
kiểm tra nghiệm một phần có là nghiệm của bài toán hay không. Nếu chỉ cần tìm
một nghiệm thì khi gặp nghiệm ta dừng lại. Còn nếu cần tìm tất cả các nghiệm thì
quá trình chỉ dừng lại khi tất cả các khả năng chọn các thành phần của vectơ
nghiệm đã bị vét cạn.
Lợc đồ tổng quát của thuật toán quay lui có thể biểu diễn bởi thủ tục Backtrack
sau.
Procedure Backtrack;
Begin
S1 := A1;
K := 1;
While k > 0 do
Begin
While Sk < > do
Begin
Chọn xk Sk;
Sk := Sk - {xk};
If (x1, ..., xk) là nghiệm Then viết ra nghiệm;
K := k+1;
Xác định Sk;
End;
K := k - 1; {quay lui}
16


Luận văn tốt nghiệp


Phơng pháp quy hoạch động và một số bài toán điển hình

End;
End;
Thuật toán quay lui có thể đợc biểu diễn bởi thủ tục đệ quy Rbacktrack. Đó là
thủ tục chọn thành phần thứ i của vectơ nghiệm. Trong thủ tục này ta sử dụng phép
toán thêm thành phần mới vào vectơ nghiệm (ký hiệu là +) và phép toán loại thành
phần cuối cùng khỏi vectơ (ký hiệu là -)
(a1, a2, ...,an) + (b) = (a1, a2, ..., an, b)
(a1, a2, ...,an) - (an) = (a1, a2, ..., an-1)
procedure Rbacktrack(vector, i);
begin
xác định Si;
for xi Si do
begin
vector := vector + (xi);
if vector là nghiệm then viết ra vector;
Rbacktrack (vector, i + 1);
Vector := vector - (xi);
End;
End;
Khi áp dụng lợc đồ tổng quát của thuật toán quay lui cho ta các thuật toán cụ
thể, có ba điểm quan trọng cần lu ý là.
Tìm cách biểu diễn nghiệm của bài toán dới dạng một dãy các đối tợng
đợc chọn dần từng bớc (x1, x2, ...,xi, ...).
Xác định đợc tập Si các ứng cử viên đợc chọn làm thành phần thứ i của
vectơ nghiệm. Chọn cách thích hợp để biểu diễn Si.
Tìm các điều kiện để một vectơ đã chọn là nghiệm của bài toán.

17



Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Cây không gian trạng thái. Việc tìm kiếm vectơ nghiệm (x 1, ..., xi, xi+1, ...) bằng
phơng pháp quay lui có thể quy về việc tìm kiếm trên cây không gian trạng thái.
Cây đợc xây dựng theo từng mức nh sau. Các đỉnh con thuộc gốc là các phần tử
thuộc S1. Giả sử xi là đỉnh ở mức thứ i. Khi đó các đỉnh con của x i là các phần tử
thuộc Si+1, trong đó Si+1 là tập các ửng cứ viên của thành phần i+1 của vectơ nghiệm
khi ta đã chọn các thành phần x1, ..., xi. ở đây x1, ..., xi là các đỉnh nằm trên đờng đi
từ gốc tới xi. Nh vậy, mỗi đỉnh của cây không gian trạng thái biểu diễn một nghiệm
một phần, đó là vectơ mà các thành phần của nó theo thứ tự là các đỉnh nằm trên đờng đi từ gốc tới đỉnh đó.
Việc tìm kiếm nghiệm theo chiến lợc quay lui chẳng qua là tìm kiếm theo độ
sâu trên cây không gian trạng thái (hay đi qua cây theo preorder).
I.2.4. Phơng pháp nhánh và cận.
Phơng pháp nhánh và cận là một dạng cải tiến của phơng pháp quay lui, đợc áp
dụng để tìm nghiệm của bài toán tối u.
Giả sử nghiệm của bài toán có thể biểu diễn dới dạng một vectơ (a1, a2, ..., an),
mỗi thành phần ai (i = 1, 2, ..., n) đợc chọn ra từ tập Si các đối tợng nào đó. Mỗi
nghiệm (a1, ..., ak) của bài toán đợc gắn với một giá trị cost(a 1, ..., ak) và ta cần tìm
nghiệm có giá thấp nhất (nghiệm tối u).
Giả sử giá của các nghiệm một phần cũng đợc xác định và là các số thực không
âm, đồng thời với nghiệm một phần bất kỳ (a1, ..., ak-1) và nghiệm mở rộng của nó
(a1, ..., ak-1, ak) ta luôn có.
cost(a1, ..., ak-1) cost(a1, ..., ak-1, ak).
T tởng của phơng pháp nhánh và cận là nh sau. Trong quả trình mở rộng từng
bớc nghiệm một phần, khi ta đạt đợc nghiệm một phần (a1, ..., ak), nếu biết rằng tất
cả nghiệm mở rộng của nó (a 1, ..., ak, ak+1, ...) là mở rộng của nghiệm một phần

(a1, ..., ak). Gọi giá của nghiệm tốt nhất là lowcost.

18


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

Thực chất của phơng pháp nhánh và cận là tìm kiếm theo độ sâu trên cây
không gian trạng thái nh kỹ thuật quay lui. Chỉ có điều khác là khi đạt tới đỉnh a k
mà cost*(a1, ..., ak-1, ak) lowcost thì ta cắt đi các nhánh từ a 1 đi xuống các đỉnh con
của nó. Tức là, khi đó ta không đi xuống các đỉnh con của a k nữa mà quay lên cha
của nó là ak-1.
Dùng làm giá trị ban đầu của lowcost ta có thể lấy lowcost = + hoặc lowcost
là giá trị của một nghiệm đợc tìm thấy bằng phơng pháp thực nghiệm nào đó. Thuật
toán nhánh và cận có thể đợc mô tả bởi thủ tục BanchBound sau.
Procedure BanchBound;
Begin
Lowcost := ;
Cost* := 0;
Tinh S1;
K :=1;
While k > 0 do
Begin
While (Sk < > ) and (cost* < lowcost) do
Begin
Chọn ak Sk;
Sk := Sk - {ak};
Cost* := (a1, ..., ak);

If (a1, ..., ak) là nghiệm then
If cost(a1, ..., ak) < lowcost then
Lowcost := cost(a1, ..., ak);
K := k + 1;
Tính Sk;
End;
19


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

K := k - 1;
Cost* := cost*(a1, ...,ak);
End;
End;
Nh vậy, với phơng pháp nhánh và cận, ta không phải duyệt toàn bộ cây không
gian trạng thái để tìm ra nghiệm tốt nhất mà bằng cách đánh giá cận dới cost* của
các nghiệm là mở rộng của nghiệm một phần, ta có thể cắt bỏ đi những nhánh
không cần thiết, do đó việc tìm ra nghiệm tối u sẽ nhanh hơn. Cái khó nhất trong
việc áp dụng phơng pháp nhánh và cận là xây dựng đợc hàm đánh giá cận dới
cost*. Hàm này có đợc xây dựng tốt thì mới giúp ta cắt bỏ đợc nhiều nhánh không
cần thiết và thuật toán nhận đợc mới có thể cải tiến đáng kể so với thuật toán vét
cạn.

20


Luận văn tốt nghiệp


Phơng pháp quy hoạch động và một số bài toán điển hình

Chơng II. Phơng pháp quy hoạch động.

II.1. Nội dung phơng pháp.
Phơng pháp quy hoạch động cùng nguyên lý tối u đợc nhà toán học Mỹ
R.Bellman đề xuất vào những năm 50 của thế kỷ XX. Phơng pháp này đợc áp dụng
để giải hàng loạt bài toán thực tế trong các quá trình kỹ thuật công nghệ, tổ chức
sản xuất, kế hoạch hoá kinh tế ... Tuy nhiên cần lu ý rằng có một số bài toán mà
cách giải bằng quy hoạch động tỏ ra không thích hợp.
Trong thực tế, ta thờng gặp bài toán tối u loại sau.
Có một đại lợng f hình thành trong một quá trình gồm nhiều giai đoạn và ta chỉ
quan tâm đến kết quả cuối cùng là trị của f phải lớn nhất hoặc nhỏ nhất, ta gọi
chung là giá trị của f. Giá trị của f phụ thuộc vào những đại lợng xuất hiện trong bài
toán mà mỗi bộ giá trị của chúng đợc gọi là một trạng thái của hệ thống và cũng
phụ thuộc vào cách thức đạt đợc giá trị f, trong từng giai đoạn mà mỗi cách thức đợc gọi là một điều khiển. Đại lợng f thờng đợc gọi là hàm mục tiêu và quá trình đạt
đợc giá trị tối u của f đợc gọi là quá trình điều khiển tối u.
Bellman phát biểu nguyên lý tối u (Gọi là nguyên lý Bellman) mà ý tởng cơ bản
là nh sau:Với mỗi quá trình điều khiển tối u, đối với trạng thái bắt đầu A 0, với mọi
trạng thái A trong quá trình đó, phần quá trình kể từ trạng thái A xem nh trạng thái
bắt đầu cũng là tối u. Chú ý rằng nguyên lý này chỉ đợc thừa nhận mà không
chứng minh.
Phơng pháp tìm điều khiển tối u theo nguyên lý Bellman thờng đợc gọi là Quy
hoạch động. Thuật ngữ này nói lên thực chất của quá trình điều khiển là động. Có
thể trong một số bớc đầu tiên lựa chọn điều khiển tối u dờng nh không tốt nhng tựu
chung lại là tốt nhất.
Ta có thể giải thích ý này qua bài toán sau.
Cho một dãy N số nguyên A1, A2,..., An . Hãy tìm cách xoá đi một số ít nhất số
hạng để dãy còn lại là đơn điệu hay nói cách khác hãy chọn một số nhiều nhất các

21


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

số hạng sao cho dãy B gồm các số hạng đó theo trình tự xuất hiện trong dãy A là
đơn điệu.
Quá trình chọn dãy B đợc điều khiển qua N giai đoạn để đạt đợc mục tiêu là số
lợng số hạng của dãy B là nhiều nhất, điều khiển của giai đoạn i thể hiện việc chọn
hay không chọn Ai vào dãy B hay không.
Giả sử dãy đã cho là 1, 8, 10, 2, 4, 6, 7. Nếu ta chọn lần lợt 1, 8, 10 thì chỉ chọn
đợc 3 số hạng nhng nếu bỏ qua 8 và 10 thì ta chọn đợc năm số hạng 1, 2, 4, 6, 7.
Khi giải một số bài toán bằng cách Chia - để - trị, chuyển việc giải bài toán
kích thớc lớn về việc giải bài toán cùng kiểu có kích thớc nhỏ hơn thì các thuật toán
này thờng đợc thể hiện bằng các chơng trình con đệ quy. Khi đó, trên thực tế nhiều
kết quả trung gian phải tính nhiều lần.
Vậy ý tởng cơ bản của quy hoạch động thật đơn giản: Tránh tính toán lại mọi
thứ hai lần, mà lu giữ kết quả đã tìm kiếm đợc vào một bảng làm giả thiết cho việc
tìm kiếm những kết quả của trờng hợp sau. Chúng ta sẽ làm đầy dần giá trị của bảng
này bỡi các kết quả của những trờng hợp trớc đã đợc giải. Kết quả cuối chính là bài
toán cần giải . Nói cách khác phơng pháp quy hoạch động đã thể hiện sức mạnh
của nguyên lý Chia - để - trị đến cao độ.
Quy hoạch động là kỹ thuật thiết kế bottom up (từ dới lên). Nó đợc bắt đầu từ
những trờng hợp con nhỏ nhất (thờng là đơn giản nhất và giải đợc ngay). Bằng cách
tổ hợp các kết quả đã có (không phải tính lại) của các trờng hợp con, sẽ đạt tới kết
quả của trờng hợp có kích thớc lớn dần lên và tổng quát hơn, cho đến khi cuối cùng
đạt tới lời giải của trờng hợp tổng quát nhất.
Trong một số trờng hợp, khi giải một bài toán A, trớc hết ta tìm họ bài toán A(p)

phụ thuộc tham số p (có thể p là một véc tơ) mà A(p 0) = A với p0 là trạng thái ban
đầu của bài toán A. Sau đó tìm cách giải họ bài toán A(p) với tham số p bằng cách
áp dụng nguyên lý tối u của Bellman. Cuối cùng cho p = p 0 sẽ nhận đợc kết quả của
bài toán A ban đầu.

22


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

II.2. Các bớc thực hiện quy hoạch động.
Bớc 1. Lập hệ thức.
Dựa vào nguyên lý tối u tìm cách chia quá trình giải bài toán tính toán thành
từng giai đoạn, sau đó tìm hệ thức biểu diễn tơng quan quyết định các bớc đang xử
lý trớc đó. Hoặc tìm cách phân rã bài toán thành các bài toán con tơng tự có kích
thớc nhỏ hơn, tìm hệ thức nêu quan hệ giữa kết quả bài toán kích thớc đã cho với
các kết quả của các bài toán con cùng kiểu có kích thớc nhỏ hơn của nó nhằm
xây dựng phơng trình truy toán (dạng hàm hoặc thủ tục đệ quy).
Về cách xây dựng phơng trình truy toán.
Ta chia việc giải bài toán thành n giai đoạn. Mỗi giai đoạn i có trạng thái ban
đầu là t(i) và chịu tác động điều khiển d(i) sẽ biến thành trạng thái tiếp theo t(i+1)
của giai đoạn i+1 (i = 1, 2, ..., n-1). Theo nguyên lý tối u của Bellman thì việc tối u
giai đoạn cuối cùng không làm ảnh hởng đến kết quả toàn bài toán. Với trạng thái
ban đầu là t(n) sau khi làm giai đoạn n tốt nhất ta có trạng thái ban đầu của giai
đoạn ban đầu n-1 là t(n-1) và tác động điều khiển của giai đoạn n-1 là d(n-1), có thể
tiếp tục xét đến giai đoạn n-1. Sau khi tối u giai đoạn n-1 ta lại có t(n-2) và d(n-2)
và lại có thể tiến hành tối u giai đoạn n-2..cho đến khi các giai đoạn từ n giảm đến 1
đợc tối u thì coi nh hoàn thành bài toán. Gọi giá trị tối u của bài toán tính đến giai

đoạn k là Fk, giá trị tối u của bài toán tính riêng ở giai đoạn k là Gk thì
Fk = Fk-1 + Gk.
Hay là.
Fk(t(k)) =

max { Gk(t(k), d(k)) + Fk-1(t(k-1)) } (*).

d(k)

Bớc 2. Tổ chức dữ liệu và chơng trình.
Tổ chức dữ liệu sao cho đạt đợc các yêu cầu sau.
a.

Dữ liệu đợc tính toán dần theo từng bớc.

b.

Dữ liệu đợc lu trữ để giảm lợng tính toán lặp lại.

23


Luận văn tốt nghiệp

c.

Phơng pháp quy hoạch động và một số bài toán điển hình

Kích thớc miền nhớ dùng cho lu trữ dữ liệu càng nhỏ càng tốt, kiểu dữ liệu đợc
chọn phù hợp, nên chọn đơn giản để dễ truy cập.


Cụ thể.


Các giá trị của Fk thờng đợc lu trữ trong một bảng (mảng một chiều hoặc hai,
ba... chiều).



Cần lu ý khởi trị các giá trị ban đầu của bảng cho thích hợp, đó là các kết quả
của bài toán con có kích cỡ nhỏ nhất của bài toán đang giải.
F1(t(1)) = max { G1(t(1), d(1)) + F0(t(0)) }
d(k)



Dựa vào công thức, phơng trình truy toán (*) và các giá trị đã có trong

bảng để tìm dần các giá trị còn lại của bảng.


Ngoài ra còn cần mảng lu trữ nghiệm tơng ứng với giá trị tối u trong từng giai
đoạn.

Dựa vào bảng lu trữ nghiệm và bảng giá trị tối u từng giai đoạn đã xây dựng, tìm
ra kết quả bài toán.
Làm tốt thuật toán bằng cách thu gọn hệ thức (*) và giảm kích thớc miền nhớ.
Thờng tìm cách dùng mảng một chiều thay cho mảng hai chiều nếu giá trị một dòng
(hoặc cột) của mảng hai chiều chỉ phụ thuộc một dòng (hoặc cột) kề trớc.
Trong một số trờng hợp có thể mảng hai chiều với các giá trị phần tử chỉ nhận

giá trị 0, 1 bởi mảng hai chiều mới bằng cách dùng kỹ thuật quản lý bit.
II.3. Hạn chế của quy hoạch động.
Việc tìm công thức, phơng trình truy toán hoặc tìm cách phân rã bài toán
nhiều khi đòi hỏi sự phân tích tổng hợp rất công phu, dễ sai sót, khó nhận ra
nh thể nào là thích hợp, đòi hỏi nhiều thời gian suy nghĩ. Đồng thời không
phải lúc nào kết hợp lời giải của các bài toán con cũng cho kết quả của bài
toán lớn hơn.
Khi lu trữ đòi hỏi mảng hai, ba chiều... thì khó có thể xử lý với kích cỡ mỗi
24


Luận văn tốt nghiệp

Phơng pháp quy hoạch động và một số bài toán điển hình

chiều lớn hàng trăm.
Cho đến nay, vẫn cha có ai xác định đợc một cách chính xác những bài toán là
có thể giải quyết đợc một cách hiệu quả bằng phơng pháp quy hoạch động. Có
những vấn đề quá phức tạp và khó khăn mà xem ra không thể ứng dụng quy hoạch
động để giải quyết đợc, trong khi đó cũng có những bài toán đơn giản khiến cho
việc sử dụng quy hoạch động để giải quyết lại kém hiệu quả hơn so với dùng các
thuật toán kinh điển.

25


×