1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Giải toán bằng phương pháp quy hoạch động

24 2,4K 25
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 24
Dung lượng 190,5 KB

Nội dung

Giải toán bằng phương pháp quy hoạch động

Trang 2

NHẬN XÉT CỦA GIÁO VIÊN



-Trong quá trình học tập, chúng ta gặp rất nhiều các bài tập về

Trang 3

Toán-toán hoàn chỉnh có thể áp dụng cho mọi bài Toán-toán Tuy nhiên người ta đã tìm

ra một số thuật toán chung như chia để trị, tham ăn, quay lui, Các thuật toán này có thể áp dụng để giải một lớp khá rộng các bài toán hay gặp trong thực tế Trong bài viết này, tôi muốn đề cập với các bạn một thuật toán khác, đó là thuật toán quy hoạch động Tư tưởng cơ bản của thuật toán là:

Để giải một bài toán ta chia bài toán đó thành các bài toán nhỏ hơn có thể giải một cách dễ dàng Sau đó kết hợp lời giải các bài toán con, ta có được lời giải bài toán ban đầu Trong quá trình giải các bài toán con đôi khi

ta gặp rất nhiều kết quả trùng lặp của các bài toán con Để tăng tính hiệu quả, thay vì phải tính lại các kết quả đó, ta lưu chúng vào một bảng Khi cần lời giải của một bài toán con nào đó ta chỉ cần tim trong bảng, không cần tính lại.

Tư tưởng của thuật toán quy hoạch động khá đơn giản Tuy nhiên khi

áp dụng thuật toán vào trường hợp cụ thể lại không dễ dàng (điều này cũng tương tự như nguyên tắc Dirichlet trong toán vậy) Khi giải bài toán bằng phương pháp này, chúng ta phải thực hiện hai yêu cầu quan trọng sau:

- Tìm công thức truy hồi xác định nghiệm bài toán qua nghiệm các bài toán con nhỏ hơn.

- Với mỗi bài toán cụ thể, ta đề ra phương án lưu trữ nghiệm một cách hợp lý để từ đó có thể truy cập một cách thuận tiện nhất.

Giải toán bằng phương pháp qui hoạch động

1 Phương pháp quy hoạch động

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ỷ 20 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

Trang 4

nghệ, tổ chức sản xuất, kế hoạch hoá kinh tế… Tuy nhiên cần lưu ý 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 một số 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à giá trị của f phải lớn nhất hoặc nhỏ nhất, ta gọi chung là giá trị tối ưu 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à 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 tổ chứ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 (cũng 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 A0, vớ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 đượ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 nhưng tựu chung cả quá trình 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,

A 2,…,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 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 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 ở giai đoạn i thể hiện việc chọn hay không chọn Ai vào dãy B.

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 nhưng nếu bỏ qua 8 và 10 thì ta chọn được 5 số hạng 1, 2,

4, 6, 7

Khi giải một bài toán bằng cách “chia để trị” chuyển việc giải bài toánkích thước lớn về việc giải nhiều bài toán cùng kiểu có kích thước nhỏ hơn thì

Trang 5

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ạimọi thứ hai lần, mà lưu giữ kết quả đã tìm kiếm được vào một bảng làm giả thiếtcho 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ầngiá 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 cùng chính là kết quả của bài toán cần giải Nói cách khác phươngphá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 với những trường hợp con nhỏ nhất (thường là đơn giải 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 tới kết quả của trường hợp có kích thước lớn dần lên và tổngquá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(p0)=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=p0 sẽ nhận

được kết quả của bài toán A ban đầu.

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

Về một 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áiban đầ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 theot(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

Trang 6

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 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ể 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à:

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 yêu cầu sau:

 Dữ liệu được tính toán dần theo các bước

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

 Kích thước miền nhớ dành cho lưu 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 lưu trữ trong một bảng (mảng một chiều

hoặc hai, ba, v.v… chiều)

 Cần lưu ý khởi trị các giá trị ban đầu của bảng cho thích hợp, đó là các kếtquả của các bài toán con có kích cỡ nhỏ nhất của bài toán đang giải:

 Dựa vào công thức, phương trình truy toán (*) và các giá trị đã có trongbả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 lưu trữ nghiệm tương ứng với các giá trị tối ưutrong từng gian đoạn

 Dựa vào bảng lưu trữ nghiệm và bảng giá trị tối ưu trong từng giai đoạn

đã xây dựng, tìm ra kết quả bài toán

Bước 3: Làm tốt

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ềnnhớ 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

Trang 7

Trong một số trường hợp có thể thay 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

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ánnhiề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ờikhô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 bảng lưu trữ đòi hỏi mảng hai, ba chiều … thì khó có thể xử lý dữ liệuvới kích cỡ mỗi chiều lớn hàng trăm

 Có những bài toán không thể giải được bằng quy hoạch động

Trang 8

Các bài toán về quy hoach động

Một số bài toán đơn giản:

Bài toán 1: Cho hai dãy số nguyên (a1,a2, ,am), (b1,b2, ,bn) Tìm dãy con chung

có độ dài lớn nhất của hai dãy trên (coi dãy không có số nguyên nào là dãy concủa mọi dãy và có độ dài bằng 0)

Lời giải

Chúng ta có thể thấy ngay rằng độ phức tạp của bài toán trên phụ thuộcvào hai số m, n Xét hai trường hợp:

+Trường hợp1:; m=0 hoặc n=0.

Đây là trường hợp đặc biệt, có duy nhất một dãy con chung của hai dãy có

độ dài bằng 0 Vì vậy dãy con chung có độ dài lớn nhất của chúng có độ dàibằng 0

+Trường hợp 2: m# 0 và n # 0.

Trong trường hợp này, ta xét các bài toán nhỏ hơn là tìm dãy con chung có

độ dài lớn nhất của hai dãy (a1,a2, ,ai), (b1,b2, ,bj) với 0 <= i <= m, 0 <= j <= n.Gọi [i,j] là độ dài của dãy con chung lớn nhất của hai dãy (a1, ,ai), (b1, ,bj) ;Như vậy ta phải tính tất cả các l[i,j] trong đó 0<=i<=m, 0<=j<=n

Chúng ta có thể thấy ngay rằng l[0,0]=0 Giả sử ta tính được l[s,t] với 1

- Nếu ii # bj thì l[i,j]=max{l[i-1,j], l[i,j-1]}

- Nếu ii=bj thì l[i,j]= 1+l[i-1,j-1]

Với những nhận xét trên, ta hoàn toàn tính được l[m,n] chính là độ dài dãycon chung dài nhất của (a1, am), (b1, bn)

Để tìm phần tử của dãy con, ta xuất phát từ ô l[m,n] tới ô l[0,0] Giả sử tađang ở ô l[i,j] Nếu ai=bj thì ta thêm ai vào dãy con rồi nhảy tới ô l[i-1,j-1] Nếuaibj thì l[i,j]=l[i-1,j] hoặc l[i,j]=l[i,j-1] Nếu l[i,j]=l[i-1,j] thì nhảy tới ô l[i-1,j],ngược lại thì nhảy tới ô l[i,j-1]

Trang 9

Sau đây là lời giải của bài toán Chương trình được viết bằng ngôn ngữ Pascal:

Trang 11

Bài toán 2: Cho cái túi chứa được trọng lượng tối đa là w Có n đồ vật, đồ vật

thứ i có khối lượng a[i] và giá trị c[i], 1<= i <=n Tìm cách xếp đồ vật vào túisao cho đạt giá trị lớn nhất

Để xác định số lượng x[i] đồ vật i thoả mãn điều kiện tối ưu, ta xuất phát

từ a[n,w] xác định được x[n] Nhảy tới a[n-1,w-x[n]*a[n]] xác định được x[n-1]

Cứ như vậy tới x[1]

a:array[1 10] of integer; {khoi luong}

c:array[1 10] of integer; {Gia tri}

i,j,tg,k,max,save:integer;

f:text;

b:array[1 n,1 w] of kq;

procedure init;

Trang 13

Bài toán 3: Trò chơi Tán thủ

Giả sử có hai tán thủ A, B cần đấu trực diện với nhau, qui định chung làngười thắng trước n ván sẽ là người thắng cuộc Trên thực tế thường giá trị n = 4.Giả sử hai tán thủ A, B là mạnh ngang nhau và do đó sác xuất thắng, thua trongmỗi ván là 50/50 Giả sử P(i,j) là sác xuất sao cho A cần thắng thêm i ván nữa , Bcần thắng thêm j ván nữa thì A sẽ chắc chắn thắng chung cuộc Chúng ta cần tínhnhững giá trị P(i,j) này với i, j bất kỳ

Lời giải

Nếu i=0, j>0, tức là A đã thắng rồi và do đó P(0,j)=1 Nếu i>0, j=0, tức là

B đã thắng và A đã thua rồi, do đó P(i,0)=0 Với i, j > 0 ta có nhận xét sau: sácxuất để A thắng chung cuộc dựa vào ván tiếp theo A thắng hay thua Nếu vántiếp theo A thắng, khi đó sác xuất để A thắng sẽ là P(i-1,j), còn nếu A thua ở vántiếp theo thì sác xuất để A vẫn thắng chung cuộc sẽ là P(i,j-1) Vì ván tiếp theokhả năng A thắng thua là 50/50 nên ta có công thức P(i,j) = (P(i-1,j)+P(i,j-1))/2

Trang 14

Tóm lại ta có công thức truy hồi sau để tính P(i,j).

Từ công thức (4) với i+j=n ta dễ dàng tính được công thức truy hồi của độphức tạp tính toán T(n) như sau:

T(1) = C(C-const)

T(n) = 2T(n-1) + D (D-const)

(5) Ta tính được T(n) = O(2n) Như vậy việc tính toán các hệ số P(i,j) sẽ có độ phức tạp tăng theo số mũ của n nếu tính toán bằng kỹ thuật đệ qui và đây là một kết quả rất lớn Tuy nhiên công thức trên chỉ cho ta giới hạn trên của tính toán, đểhiểu rõ hơn sự″tồi tệ″ thực sự của việc sử dụng đệ qui tính toán theo công thức(4)chúng ta sẽ thử tính toán giới hạn dưới của công việc tính toán này (Giới hạn dưới của độ phức tạp được ký hiệu là big-omega: W)

Để tính được giá trị này chúng ta sẽ tính số lần gọi hàm P khi thực hiện đệqui cách tính P(i,j) theo công thức (4) Công thức (4) với i+j=n nếu xem xét kỹ sẽgợi ý cho chúng ta về một đẳng thức tương tự của hệ số tổ hợp là

(tổ hợp chập i từ n phần tử, số cách chọn ra i phần tử từ tập hợp ban đầu n phần tử) Từ nhận xét trên dễ dàng suy ra rằng số lần gọi hàm P trong lời gọi P(i,j) sẽ ítnhất là

Với i=j=n/2 dễ thấy giá trị này sẽ bằng . Vậy ta vừa chứng minh được

rằng cận dưới độ phức tạp tính toán P(i,j) là là một giá trị rất lớn (tuy có nhỏ hơn 2n) và hầu như không thể áp dụng tính toán trên thực tế

Trang 15

dưới đây

Bảng hệ số P(i,j) được điền tuần tự như sau: Trước tiên để ý rằng hàng dưới cùngcủa bảng là toàn 0 và hàng đầu tiên bên phải sẽ là toàn 1 Xuất phát từ góc phải dưới chúng ta lần lượt điền số vào bảng theo hướng Tây-Bắc dọc theo đường chéo ngược với i+j không thay đổi Thuật toán điền số P(i,j) vào bảng được mô tảnhư sau:

Function Ođs(i,j: integer):real; (7)

Trang 16

ngoài sẽ là với n=i+j Chắc các bạn đã thấy sự kỳ diệu của phương pháp điền bảng số so sánh với việc gọi đệ qui, và đó là tư tưởng củathuật toán qui hoạch động.

Trang 17

Một số bài toán nâng cao:

1 Bài toán cái túi.

Trong siêu thị có n gói hàng (n ≤ 100) gói hàng thứ i co trọng lượng là W[i]≤100

và trị giá V[i] ≤ 100 Một tên trộm đột nhập vào siêu thị, tên trộm mang theo một cái túi có thể mang được tối đa trọng lượng M ( M ≤100 ) Hỏi tên trộm sẽ lấy đi những gói hàng nào để được tổng giá trị lớn nhất

Input:five văn bản BAG.INP

 Dòng 1:Chứa hai số n, M cách nhau ít nhất một dấu cách

 n dòng tiếp theo, dòng thứ I chứa hai số nguyên dương W[i], V[i] cách nhau ít nhất một dấu cách

Output: five văn bản BAG.OUT

 Dòng 1: Ghi giá trị lớn nhất tên trộm có thể lấy

 Dòng 2: Ghi chỉ số những gói bị lấy

Cách giải:

Nếu gọi F[i,j] là giá trị lớn nhất có thể có bằng cách chọn các gói {1,2,…., i} với giới hạn trọng lượng j Thì giá trị lớn nhất khi được chọn trong số n gói với giới hạn trọng lượng M chính là F[n,M]

Công thức truy hồi tính F[i,j].

Với giới hạn trọng lượng j, việc chọn tối ưu trong số các gói {1,2,…,i-1,i} để có giá trị lớn nhất sẽ có hai khả năng:

 Nếu không chọn gói thứ i thì F[i,j] là giá trị lớn nhất có thể bằng cách chọn trong số các gói {1,2,…,i-1} với giới hạn trọng lượng là j Tức là

F[i,j] = F[i-1,j]

 Nếu có chọn gói thứ i (tất nhiên chỉ xét tới trường hợp này khi mà W[i] ≤ j) thì F[i,j] bằng giá trị gói thứ i là V[i] cộng với giá trị lớn nhất có thể có

Trang 18

được bằng cách chọn trong số các gói {1,2,…,i-1} với giới hạn trọng lượng j-W[i] Tức là về mặt giá trị thu được:

F[i,j]=V[i] + F[i-1,j-W[i]]

Vì theo cách xây dựng F[i,j] là giá trị lớn nhất có thể, nên F[i,j] sẽ là max trong 2 giá trị thu được ở trên

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

Dễ thấy F[0,j]= giá trị lớn nhất có thể bằng cách chọn trong số 0 gói= 0

Trang 19

P 3 03 5.PAS * Bài toán cái túi

Trang 20

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

assign (fo, outputfile) ; rewrite(fo);

writeln (fo, F[n, M] ; {In ra giá trị lớn nhất có thể kiếm được} while n <> 0 do {Truy vết trên mảng phương án từ hàng n lên

Trang 21

2 Dãy con có tổng chia hết co K

Cho một dẫy A gồm n ( 1≤ n ≤1000) số nguyên dương a[1 n] và số nguyên dương k (k ≤ 1000) Hãy tìm dãy con gồm nhiều phần tử nhất của dãy đả cho saocho tổng các phần tử của dãy con này chia hết cho k

Input: file văn bản SUBSEQ.INP

 Dòng 1: Chứa số n

 Dòng 2: Chứa n số a[1],a[2],…,a[n] cách nhau ít nhất một dấu cách

Output: file văn bản SUBSEQ.OUT

 Dòng 1: Ghi độ dài của dãy con tìm được

 Các dòng tiếp : Ghi các phần tử được chọn vào dãy con

 Dòng cuối : Ghi tổng các phần tử của dãy con đó

SUBSEQ.INP

10 5

1 6 11 5 10 15 20 2 4 9

SUBSEQ.OUT

8a[10] = 9a[9] = 4a[7] = 20a[6] = 15a[5] = 10a[4] = 5a[3] = 11a[2] = 6Sum = 80

Cách giải :

Không ảnh hưởng đến kết quả cuối cùng, ta có thể đặt: a[i] := a[i] mod k với

i:1≤ i ≤ n Gọi S là tổng các phần tử của dãy A, thay đổi cách tiếp cận bài toán: thay vì tìm xem phải chọn ra một tối đa những phần tử để có tông chia hết cho k,

ta chọn ra một số tối thiểu các phần tử có tổng dư với S theo mudul k Khi đó chỉ cần loại bỏ những phần tử này thì những phần tử còn lại sẽ là kết quả Cách tiếp

Ngày đăng: 27/04/2013, 11:51

HÌNH ẢNH LIÊN QUAN

Bảng hệ số P(i,j) được điền tuần tự như sau: Trước tiên để ý rằng hàng dưới cùng  của bảng là toàn 0 và hàng đầu tiên bên phải sẽ là toàn 1 - Giải toán bằng phương pháp quy hoạch động
Bảng h ệ số P(i,j) được điền tuần tự như sau: Trước tiên để ý rằng hàng dưới cùng của bảng là toàn 0 và hàng đầu tiên bên phải sẽ là toàn 1 (Trang 15)
Bảng phương án F gồm n + 1 dòng, M + 1 cột, trứơc tiên được điền cơ sở quy  hoạch động: - Giải toán bằng phương pháp quy hoạch động
Bảng ph ương án F gồm n + 1 dòng, M + 1 cột, trứơc tiên được điền cơ sở quy hoạch động: (Trang 18)

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w