Tải bản đầy đủ (.ppt) (401 trang)

Bài giảng giải thuật và lập trình full

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 (2.85 MB, 401 trang )

Dynamic Programming

13.9.2004

Ch. 1: Dynamic Programming

1


Giới thiệu
°

∆ψναµιχ προγ ραµµινγ




°

giải bài toán bằng cách kết hợp các lời giải của
các bài toán con.
(ở đây “programming” không có nghóa là lập trình).

Σο σανη δψναµιχ προγ ραµµινγ ϖα “ χηια−ϖα−
τρ∫ ” ( διϖιδε−ανδ−χονθυερ)


Giải thuật chia-và-trò
°
°
°





chia bài toán thành các bài toán con độc lập ,
giải chúng bằng đệ quy,
kết hợp chúng để có lời giải cho bài toán ban
đầu.

Giải thuật dynamic programming
°

°

13.9.2004

các bài toán con không độc lập với nhau: chúng
có chung các bài toán con nhỏ hơn.
giải mỗi bài toán con chỉ một lần, và ghi nhớ lời
giải đó trong một bảng để truy cập khi cần đến.
Ch. 1: Dynamic Programming

2


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

Βαι τοαν το〈ι υ




°

có thể có nhiều lời giải
mỗi lời giải có một trò

Τµ λι γ ιαι χο τρ∫ το〈ι υ ( χχ τιε∑υ
ηαψ χχ 〉 αι) .

13.9.2004

Ch. 1: Dynamic Programming

3


Nguyeân taéc cuûa dynamic programming
°

Μο τ γ ιαι τηυα τ δψναµιχ προγ ραµµινγ
〉 χ ξαψ δνγ θυα βο〈ν βχ:
1 . Ξαχ 〉 ∫ νη χα〈υ τρυχ χυα µο τ λι
γ ιαι το〈ι υ.
2 . ∇ ∫ νη νγ η⌠α 〉 ε θυψ χηο γ ια τρ∫
χυα µο τ λι γ ιαι το〈ι υ.
3 . Τνη γ ια τρ∫ χυα µο τ λι γ ιαι
το〈ι υ τ δι λεν ( “ βοττοµ−υπ ” ) .
4 . Ξαψ δνγ λι γ ιαι το〈ι υ τ χαχ
τηονγ τιν 〉 α⌡ τνη.


13.9.2004

Ch. 1: Dynamic Programming

4


Nhân một chuỗi ma trận
°
°
°

°

Χηο µο τ χηυοι µα τρα ν 〈Α 1, Α 2,..., Α ν 〉 .
Ξαχ 〉 ∫ νη τχη Α 1Α 2 ⋅ ⋅ ⋅ Α ν δα τρεν γ ιαι τηυα τ
ξαχ 〉 ∫ νη τχη χυα ηαι µα τρα ν.
Βιε∑υ διεν χαχη τνη τχη χυα µο τ χηυοι µα
τρα ν βανγ χαχη “〉 ατ γ ι⌡α νγ οαχ ”
( πα ’ ρεντηεσιζε ) χαχ χαπ µα τρα ν σε⌡ 〉 χ νηαν
ϖι νηαυ.
Μο τ τχη χυα µο τ χηυοι µα τρα ν λα φ υλλψ
παρεντηεσιζεδ νε〈υ νο λα



một ma trận hoặc là
tích của hai tích của chuỗi ma trận fully parenthesized khác,
và được đặt giữa ngoặc.


ς δυ: µο τ ϖαι τχη χυα χηυοι µα τρα ν 〉 χ
φ υλλψ παρεντηεσιζεδ




A
(AB)
((AB)C).

13.9.2004

Ch. 1: Dynamic Programming

5


Chuoãi ma traän fully parenthesized
°

ς δυ: Χηο µο τ χηυοι µα τρα ν 〈Α 1 ,
Α 2 , Α 3 , Α 4 〉 . Τχη Α 1Α 2Α 3Α 4 χο τηε∑ 〉 χ
(A1(A2(A3A4)))
φ υλλψ παρεντηεσιζεδ
τηεο 〉 υνγ 5 χαχη
κηαχ νηαυ: (A1((A2A3)A4))
((A1A2)(A3A4))
((A1(A2A3))A4)
(((A1A2)A3)A4)


13.9.2004

Ch. 1: Dynamic Programming

6


Nhân hai ma trận
°

Τχη χυα ηαι µα τρα ν Α ϖα Β ϖι



A có chiều là p × q
B có chiều là q × r

λα µο τ µα τρα ν Χ χο χηιε◊υ λα π × ρ.
MATRIX-MULTIPLY(A, B)
1 if columns[A] ≠ rows[B]
2
then error “các chiều không tương thích”
3
else for i ← 1 to rows[A]
4
do for j ← 1 to columns[B]
5
do C[i, j] ← 0
6
for k ← 1 to columns[A]

7
do C[i, j] ← C[i, j] + A[i, k]⋅ B[k, j]
8
return C

°

Τηι γ ιαν 〉 ε∑ τνη Χ τψ λε ϖι σο〈 πηεπ
νηαν ϖο ηνγ τηχ τηι τρονγ δονγ 7, τχ
λα π × θ × ρ .

13.9.2004

Ch. 1: Dynamic Programming

7


Phí tổn để nhân một chuỗi ma trận
°

°

Νηα ν ξετ: Π η το∑ν νηαν µο τ χηυοι µα
τρα ν τυψ τηυο χ ϖαο χαχη 〉 ατ γ ι⌡α νγ οαχ
( παρεντηεσιζατιον) .
ς δυ: Χηο χηυοι µα τρα ν 〈Α 1 , Α 2 , Α 3 〉 τρονγ
〉 ο χαχ χηιε◊υ ( διµενσιον) χυα χαχ µα τρα ν λα
10 × 100, 100 × 5 , ϖα 5 × 50
Χο 〉 υνγ 2 χαχη 〉 ε∑ 〉 ονγ νγ οαχ ηοαν τοαν

τχη Α 1Α 2Α 3 :


Cách 1: ((A1A2)A3)
°

Tính A1A2 cần 10 ⋅ 100 ⋅ 5 = 5000 phép nhân vô hướng

Kế đó nhân A1A2 với A3 cần 10 ⋅ 5 ⋅ 50 = 2500 phép nhân vô
hướng
°
Tổng cộng: 7500 phép nhân vô hướng
Cách 2: (A1(A2A3))
°



°
°

°

13.9.2004

Tính A2A3 cần 100 ⋅ 5 ⋅ 50 = 25000 phép nhân vô hướng
Kế đó nhân A1 với A2A3 cần 10 ⋅ 100 ⋅ 50 = 50000 phép nhân
vô hướng
Tổng cộng: 75000 phép nhân vô hướng.
Ch. 1: Dynamic Programming


8


Baứi toaựn nhaõn chuoói ma traọn






à 1 , 2 ,...,
à à ,
1 ì , = 1 , 2 ,, .
: à
1 2

.

?

13.9.2004

Ch. 1: Dynamic Programming

9


Đếm số cách đóng ngoặc
°
°


°

Χηο µο τ χηυοι γ ο◊µ ν µα τρα ν 〈Α 1 , Α 2 , Α 3 ,..., Α ν 〉 .
Νηα ν ξετ: ταο ρα µο τ χαχη 〉 ονγ νγ οαχ βανγ
χαχη ταχη ( σπλιτ) γ ι⌡α Α κ ϖα Α κ+ 1 , ϖι κ = 1, 2,...,
ν − 1, ταο ρα ηαι χηυοι χον Α 1Α 2 ⋅ ⋅ ⋅ Α κ ϖα Α κ+ 1 ⋅ ⋅ ⋅
Α ν , σαυ 〉 ο 〉 ονγ νγ οαχ µοι χηυοι χον.
Γ οι Π( ν) λα σο〈 χαχ χαχη 〉 ονγ νγ οαχ χηο µο τ
χηυοι ν µα τρα ν




nếu n = 1 thì chỉ có một cách đóng ngoặc (không cần dấu
ngoặc tường minh). Vậy P(1) = 1.
nếu n ≥ 2 thì từ nhận xét trên ta có
n −1

P ( n) = ∑ P ( k ) P ( n − k )

k =1
Τ 〉 ο χηνγ
µινη 〉 χ:

°

) = Ω(4πη
/ n νγ) πηαπ ϖετ χαν δυψε τ θυα τα〈τ
ςα P

ψ (nδυνγ
χα χαχ χαχη 〉 ονγ νγ οαχ 〉 ε∑ τµ µο τ 〉 ονγ νγ οαχ
το〈ι υ χα◊ν τηι γ ιαν χηαψ λυ⌡ψ τηα.

13.9.2004

n

3/ 2

Ch. 1: Dynamic Programming

10


Bước 1: Cấu trúc của một đóng ngoặc
tối ưu
°

Βχ 1 χυα πηνγ πηαπ δψναµιχ προγ ραµµινγ λα



xác đònh tính chất cấu trúc con tối ưu
dựa vào đó xây dựng lời giải tối ưu cho bài toán từ các
lời giải tối ưu cho các bài toán con.

 ⇔ 〉 αψ:
° Γ οι Α ι.. ϕ λα µα τρα ν χο 〉 χ τ τχη Α ι Α ι+ 1 ⋅ ⋅ ⋅
Αϕ .

° Νηα ν ξετ : Μ ο τ 〉 ονγ νγ οαχ το〈ι υ βα〈τ κψ
χυα τχη Α ι Α ι+ 1⋅ ⋅ ⋅ Α ϕ ταχη νο γ ι⌡α Α κ ϖα Α κ+ 1,
ϖι κ ναο 〉 ο τηο⌡α ι ≤ κ < ϕ :
(Ai Ai+1 ⋅ ⋅ ⋅ Ak)(Ak+1 ⋅ ⋅ ⋅ Aj)

Νγ η⌠α λα 〉 α◊υ τιεν τα τνη χαχ µα τρα ν Α ι..κ
ϖα Α κ+ 1 ..ϕ , σαυ 〉 ο τα νηαν χηυνγ ϖι νηαυ 〉 ε∑
χο τχη χυο〈ι χυνγ Α ι..ϕ . ∆ο 〉 ο πη το∑ν 〉 ε∑ τνη
τχη τ 〉 ονγ νγ οαχ το〈ι υ λα πη το∑ν 〉 ε∑ τνη
Α ι..κ , χο νγ πη το∑ν 〉 ε∑ τνη Α κ+ 1..ϕ , χο νγ πη
το∑ν 〉 ε∑ νηαν χηυνγ ϖι νηαυ.
13.9.2004

Ch. 1: Dynamic Programming

11


Bước 1: Cấu trúc của một đóng ngoặc
tối ưu (tiếp)
°

Χα〈υ τρυχ χον το〈ι υ




°

°


Đóng ngoặc của chuỗi con “tiền tố” Ai Ai+1 ⋅ ⋅ ⋅ Ak có
được từ đóng ngoặc tối ưu của Ai Ai+1 ⋅ ⋅ ⋅ Aj phải là
một đóng ngoặc tối ưu của Ai Ai+1 ⋅ ⋅ ⋅ Ak . (Chứng minh
bằng phản chứng).
Tương tự, đóng ngoặc của chuỗi con còn lại Ak+1 Ak+2 ⋅ ⋅ ⋅
Aj có được từ đóng ngoặc tối ưu của Ai Ai+1 ⋅ ⋅ ⋅ Aj phải
là một đóng ngoặc tối ưu của Ak+1 Ak+2 ⋅ ⋅ ⋅ Aj .

∇ ε∑ χηο γ ον, σε⌡ νοι “ πη το∑ν χυα µο τ
〉 ονγ νγ οαχ ” τηαψ ϖ νοι “ πη το∑ν 〉 ε∑ τνη
τχη τ µο τ 〉 ονγ νγ οαχ ” .
Ξαψ δνγ λι γ ιαι το〈ι υ




Chia bài toán thành hai bài toán con
Tìm lời giải tối ưu cho mỗi bài toán con
Kết hợp các lời giải tìm được ở trên.

Χα◊ν τµ ϖ∫ τρ τηχη ηπ ( τρ∫ χυα κ) 〉 ε∑
ταχη χηυοι µα τρα ν Α ι Α ι+ 1 ⋅ ⋅ ⋅ Α ϕ !
13.9.2004

Ch. 1: Dynamic Programming

12



Bước 2: Giải đệ quy
°

Βχ 2 χυα πηνγ πηαπ δψναµιχ προγ ραµµινγ
λα


°

°

đònh nghóa đệ quy phí tổn (trò) của một lời giải tối ưu
tùy theo các lời giải tối ưu của các bài toán con.

Βαι τοαν χον  〉 αψ : Ξαχ 〉 ∫ νη πη το∑ν το〈ι
τηιε∑υ χηο µο τ 〉 ονγ νγ οαχ χυα χηυοι µα
τρα ν Α ι Α ι+ 1⋅ ⋅ ⋅ Α ϕ ϖι 1 ≤ ι ≤ ϕ ≤ ν.
∇ ∫ νη νγ η⌠α µ[ι, ϕ] λα σο〈 πηεπ νηαν ϖο
ηνγ το〈ι τηιε∑υ 〉 ε∑ τνη µα τρα ν Α ι..ϕ .
Π ηαν βιε τ ηαι τρνγ ηπ:


nếu i = j thì Ai Ai+1⋅ ⋅ ⋅ Aj = Ai . Vậy, với i = 1,..., n,

m[i, i] = 0.


nếu i < j thì từ bước 1 ta có

m[i, j] = m[i, k] + m[k + 1, j] + pi−1 pk pj .

Nhưng trò của k?

13.9.2004

Ch. 1: Dynamic Programming

13


Bước 2: Giải đệ quy (tiếp)
Trả lời:
Bằng cách duyệt qua tất cả các trò của k, i
≤ k ≤ j − 1, ta tìm được

m[i, j] = mini ≤
pj}.
°

k ≤ j −1

{m[i, k] + m[k + 1, j] + pi−1 pk

∇ ε∑ γ ηι λαι χαχη ξαψ δνγ λι γ ιαι
το〈ι υ τα 〉 ∫ νη νγ η⌠α σ[ι, ϕ] λα τρ∫
χυα κ ξαχ 〉 ∫ νη νι ταχη χηυοι Α ι Α ι+ 1
⋅ ⋅ ⋅ Α ϕ 〉 ε∑ χο µο τ 〉 ονγ νγ οαχ το〈ι
υ. Νγ η⌠α λα σ[ι, ϕ] λα µο τ τρ∫ κ
σαο χηο
m[i, j] = m[i, k] + m[k + 1, j] + pi−1 pk pj .


13.9.2004

Ch. 1: Dynamic Programming

14


Bước 3: Tính các chi phí tối ưu
°

°

Βχ 3 χυα πηνγ πηαπ δψναµιχ
προγ ραµµινγ λα τνη χηι πη το〈ι υ
βανγ µο τ πηνγ πηαπ τ δι λεν
( βοττοµ−υπ) ϖα δυνγ βανγ .
Νηα ν ξετ:


13.9.2004

Có thể viết được ngay một giải thuật đệ quy
(dựa trên hàm đệ quy đã tìm được) để tính
phí tổn tối ưu m[1, n] cho tính tích A1A2 ⋅ ⋅ ⋅ An .
Nhưng sau này chúng ta sẽ thấy là giải
thuật này chạy trong thời gian lũy thừa.

Ch. 1: Dynamic Programming

15



Böôùc 3: Tính caùc chi phí toái öu (tieáp)
°
°
°

Μα τρα ν Α ι χο χηιε◊υ λα π ι−1 × π ι ,
ϖι ι = 1 , 2 ,..., ν .
Ινπυτ λα µο τ χηυοι π = < π 0 , π 1,...,
π ν M>ATRIX-CHAIN-ORDER(p)
1
n ← length[p] − 1
Γ ιαι
τηυα
ϖε◊ ηαι βανγ µ[1..ν,
2
for i ← 1τ toτρα
n
do m[i, 1..ν].
i] ← 0
1..ν]3 ϖα σ[1..ν,
4
5
6
7
8
9
10
11

12
13

13.9.2004

for l ← 2 to n
do for i ← 1 to n − l + 1
do j ← i + l − 1
m[i, j] ← ∞
for k ← i to j − 1
do q ← m[i, k] + m[k + 1, j] + pi−1 pk pj
if q < m[i, j]
then m[i, j] ← q
s[i, j] ← k
return m and s
Ch. 1: Dynamic Programming

16


Phaân tích MATRIX-CHAIN-ORDER
°
°

Τηι γ ιαν χηαψ χυα Μ Α ΤΡΙΞ −Χ ΗΑ ΙΝ −Ο Ρ∆ΕΡ
λα Ο( ν 3 ) .
Γ ιαι τηυα τ χα◊ν βο νη Θ( ν 2 ) χηο
χαχ βανγ µ ϖα σ.

13.9.2004


Ch. 1: Dynamic Programming

17


Chạy MATRIX-CHAIN-ORDER lên một ví dụ
ma trận
chiều
A1
30 × 35
A2
35 × 15
A3
15 × 5
A4
5 × 10
A5
10 × 20
A6
20 × 25
°

m µ ϖα σ τνη 〉 χ:
Χαχ βανγ
1
6
15,125

6


11,87510,500

j

9,375 7,125 5,375

15,750 2,625
0

A1
A6
13.9.2004

0

750
0

A2

1,000 5,000
0

A3

0

A4


3
3

1

2
6

1

1
3

j

i

7,875 4,375 2,500 3,500
1

s

3
3

2

i

3

3
3
3

5
4

5
5

0

A5

Ch. 1: Dynamic Programming

18


Bước 4: Xây dựng một lời giải tối ưu
°
°

Βανγ σ[1 ..ν, 1..ν] τρ⌡ µο τ χαχη 〉 ονγ νγ οαχ
το〈ι υ δο Μ Α ΤΡΙΞ −Χ ΗΑ ΙΝ −Ο Ρ∆Ε Ρ τµ ρα.
Τηυ τυχ σαυ, Μ Α ΤΡΙΞ −Χ ΗΑ ΙΝ −Μ ΥΛΤΙΠΛΨ , τρα ϖε◊ τχη
χυα χηυοι µα τρα ν Α ι..ϕ κηι χηο Α = 〈Α 1 , Α 2 ,
Α 3 ,..., Α ν 〉 , βανγ σ, ϖα χαχ χη σο〈 ι ϖα ϕ.
MATRIX-CHAIN-MULTIPLY(A, s, i, j)
1

if j > i
2
then X ← MATRIX-CHAIN-MULTIPLY(A, s, i, s[i, j])
3
Y ← MATRIX-CHAIN-MULTIPLY(A, s, s[i, j] + 1, j)
4
return MATRIX-MULTIPLY(X, Y)
5
else return Ai

°

Γ οι Μ Α ΤΡΙΞ −Χ ΗΑ ΙΝ −Μ ΥΛΤΙΠΛΨ ( Α , σ, 1, ν) 〉 ε∑ τνη τχη
χυα χηυοι µα τρα ν Α .

13.9.2004

Ch. 1: Dynamic Programming

19


°

Các yếu tố để áp dụng dynamic
programming
Η αι ψε〈υ το〈 〉 ε∑ απ δυνγ 〉 χ πηνγ
πηαπ δψναµιχ προγ ραµµινγ ϖαο µο τ
βαι τοαν το〈ι υ




13.9.2004

“Cấu trúc con tối ưu”
“Các bài toán con trùng nhau”.

Ch. 1: Dynamic Programming

20


Moọt lụứi giaỷi khoõng toỏi ửu



.

RECURSIVE-MATRIX-CHAIN(p, i, j)
1
if i = j
2
then return 0
3
m[i, j]
4
for k i to j 1
5
do q RECURSIVE-MATRIX-CHAIN(p, i, k)
+ RECURSIVE-MATRIX-CHAIN(p, k + 1, j) + pi1 pk pj

6
if q < m[i, j]
7
then m[i, j] q
8
return m[i, j]

13.9.2004

Ch. 1: Dynamic Programming

21


Phân tích RECURSIVE-MATRIX-CHAIN
°

Γ οι Τ( ν) λα τηι γ ιαν χηαψ χυα Ρ Ε ΧΥΡΣΙςΕ −
Μ Α ΤΡΙΞ −Χ Η Α ΙΝ ( π, 1 , ν) , τη Τ( ν) πηαι τηοα ( ξεµ
χοδε)
T (1) ≥ 1
n −1

T (n) ≥ 1 + ∑ (T (k ) + T (n − k ) + 1)

for n > 1.

k =1

°


Τ 〉 ο χηνγ µινη 〉 χ: Τ( ν) = Ω( 2 ν ) .
Ται σαο Ρ Ε ΧΥΡΣΙςΕ −Μ Α ΤΡΙΞ −Χ Η Α ΙΝ χηαψ τρονγ
τηι γ ιαν Ω( 2ν ) χον Μ Α ΤΡΙΞ −Χ Η Α ΙΝ −Ο Ρ∆Ε Ρ χη χα◊ν
τηι γ ιαν 〉 α τηχ? ∇ ο λα ϖ




RECURSIVE-MATRIX-CHAIN là giải thuật đệ quy từ trên
xuống (top-down) và không tận dụng được tính chất
“các bài toán con trùng nhau” (overlapping
subproblems).
MATRIX-CHAIN-ORDER là giải thuật dynamic-programming
từ dưới lên (bottom-up), tận dụng được tính chất
“các bài toán con trùng nhau”.

13.9.2004

Ch. 1: Dynamic Programming

22


Caây ñeä quy
°

Χαψ 〉 ε θυψ χηο Ρ ΕΧΥΡΣΙςΕ −Μ Α ΤΡΙΞ −
Χ ΗΑ ΙΝ ( π, 1, 4)
1..4


1..1

2..4

1..2

2..2

3..4

2..3

4..4

3..3

4..4

2..2

3..3

13.9.2004

1..1

2..2

3..4


3..3

4..4

Ch. 1: Dynamic Programming

1..3

4..4

1..1

2..3

1..2

3..3

2..2

3..3

1..1

2..2
23


°


Một biến dạng của dynamic programming:
memoization
Μεµοιζατιον λα πηνγ πηαπ τα ν
δυνγ τνη χηα〈τ “ χαχ βαι τοαν χον
τρυνγ νηαυ ” 〉 ε∑ χαι τιε〈ν γ ιαι τηυα τ
〉 ε θυψ τ τρεν ξυο〈νγ βανγ χαχη


sử dụng một bảng chung mà mỗi triệu gọi
của giải thuật đệ quy có thể truy cập để
°

°

13.9.2004

ghi kết quả sau khi giải một bài toán con
mới
đọc kết quả của một bài toán con đã
được giải rồi.

Ch. 1: Dynamic Programming

24


Memoize giaûi thuaät RECURSIVE-MATRIX-CHAIN
°


°

Μεµοιζε γ ιαι τηυα τ Ρ ΕΧΥΡΣΙςΕ −Μ Α ΤΡΙΞ −
Χ ΗΑ ΙΝ βανγ χαχη σ δυνγ βανγ µ[1..ν,
1..ν].
Μ ΕΜΟΙΖ Ε∆ −Μ Α ΤΡΙΞ −Χ ΗΑ ΙΝ χο ινπυτ λα µο τ
χηυοι π
= < -M
π 0ATRIX
, π-C
πν >
1 ,...,
MEMOIZED
HAIN(p)
1
2
3
4
5

13.9.2004

n ← length[p] − 1
for i ← 1 to n
do for j ← i to n
do m[i, j] ← ∞
return LOOKUP-CHAIN(p, 1, n)

Ch. 1: Dynamic Programming


25


×