Ví dụ 1: Tính phần tử thứ n của dãy số Fibonaci • Việc thực hiện một giải thuật đệ quy có thể không tối ưu về mặt thời gian/không gian nhớ.. • Đặc điểm của lời giải đệ quy: thực hiện bà
Trang 14 -2
015
Trang 5Ví dụ 1: Tính phần tử thứ n của dãy số Fibonaci
Function F(n: integer): integer;
Begin
If n ≤ 2 then
F:=1 Else
F:= F(n-1)+F(n-2);
End;
Trang 6Ví dụ 1: Tính phần tử thứ n của dãy số Fibonaci
• Việc thực hiện một giải thuật đệ quy có thể không tối
ưu về mặt thời gian/không gian nhớ
• Đặc điểm của lời giải đệ quy: thực hiện bài toán từ việc phân tích ở mức cao xuống mức thấp
f(1) f(2) f(3) f(2)
f(4)
f(1) f(2) f(3) f(5)
f(1) f(2) f(3) f(2)
f(4) f(6)
Trang 7Ví dụ 1: Tính phần tử thứ n của dãy số Fibonaci
• Nếu giải quyết bài toán này từ mức thấp lên mức cao ta có giải thuật sau:
Function F(n: integer): integer;
Trang 8 Đặc điểm của lời giải bài toán theo phương pháp quy hoạch động:
giải quyết bài toán đệ quy từ mức thấp trước, lời giải của chúng được lưu lại và được sử dụng để tìm lời giải của các bài toán ở mức cao hơn.
• Tư tưởng của phương pháp
• Các bài toán tối ưu hoá rời rạc
• Nguyên lý của phương pháp:
• Nguyên lý tối ưu của Bellman: Trong một dãy tối ưu của các lựa chọn thì một dãy con của nó cũng là tối ưu.
Trang 92 Phương pháp thực hiện
• Phân tích bài toán (biểu diễn bài toán dưới dạng
một bài toán nhiều mức)
• Xây dựng giải pháp đệ quy (lập công thức truy
hồi)
• Lập bảng (sử dụng các mảng để tính toán các giá
trị theo kiểu dưới-lên)
• Tổng hợp kết quả (kiến tạo một lời giải cho bài
toán từ các thông tin đã tính toán)
Trang 10Xét ví dụ trên
• Phân tích bài toán: Xây dựng hàm:
Function F(n: integer): integer;
• Giải pháp đệ quy: F(n) = F(n-1)+F(n-2)
• Lập bảng:
Sử dụng mảng 1 chiều a (array[1 max] of integer) để tính:
a[i] = F(i) với i = 1 n
Cụ thể: a[1] = a[2] = 1, và:
a[i] = a[i-1] + a[i-2]; với i = 3 n,
• Tổng hợp kết quả: F(n) = a[n];
Trang 113 Một số bài toán tối ưu giải bằng phương
pháp quy hoạch động
• Chiếc túi xách
• Phép nhân tổ hợp nhiều ma trận
Trang 12Bài toán chiếc túi xách
• Một cái kho chứa n loại đồ vật có kích thước và giá trị khác nhau
Tức: Tìm x[1], x[2], , x[n] (với x[i] ∈ N : số lượng loại đồ vật thứ i cần lấy) sao cho: ∑ x[i].m[i] ≤ p và ∑ x[i].c[i] đạt giá trị cực đại
Trang 13Bài toán chiếc túi xách
Lúc đó tên trộm có thể lấy các đồ vật với giá trị như sau:Tên trộm lấy 3 đồ vật 1 và 1 đồ vật 2 với giá trị lớn nhất
là 17
Trang 14Bài toán chiếc túi xách
Phân tích bài toán:
• Gọi P(r, s) là bài toán chiếc túi xách, với:
r ∈ N*: kích cỡ chiếc túi
s ∈ N*: số các loại đồ vật khác nhau
(bài toán ban đầu là P(p, n))
• Các giá trị cần tìm:
l[r,s]: giá trị cực đại ∑x[i].c[i] của bài toán P(r, s)
u[r,s]: số lượng loại đồ vật s tối ưu cần lấy (tức: x[s]) của bài toán P(r, s)
Trang 15Bài toán chiếc túi xách
Trang 16Lập bảng (Bài toán chiếc túi xách)
Trang 18Tổng hợp kết quả (Bài toán chiếc túi xách)
Trang 19Đồ vật 3 số lượng 0
Đồ vật 2 số lượng 1
Đồ vật 1 số lượng 3
Trang 20Bài toán Phép nhân tổ hợp nhiều ma trận
• Cần tính M = M1× M2 × × Mn
Trong đó: Mi là ma trận cấp m[i-1] × m[i] (i=1 n)
Hãy xác định thứ tự thực hiện các phép nhân sao cho số phép tính là tối thiểu.
Trang 21Bài toán Phép nhân tổ hợp nhiều ma trận
Trang 22Bài toán Phép nhân tổ hợp nhiều ma trận
Trang 23Bài toán Phép nhân tổ hợp nhiều ma trận
• Input: Cấp của n ma trận:
Ví dụ: Theo ví dụ trên, n=3
• Output: x[i] là vị trí cần thực hiện phép nhân trong lần thứ
i, (với i= 1 n-1) sao cho số phép tính → min
Trang 24Bài toán Phép nhân tổ hợp nhiều ma trận
Phân tích bài toán:
• Gọi P(r, s) là bài toán nhân ma trận: Mr× Mr+1 × × Ms , với r ≤ s
(bài toán ban đầu là P(1, n) )
• Giá trị cần tìm:
k[r,s] : vị trí phép toán thực hiện cuối cùng của bài toán P(r, s)
(Mr × Mr+1 × × Mk-1) × (Mk × Mk+1 × × Ms)
k = k[r,s] ∈ [r+1, s]
l[r, s] : số phép tính nhân tối ưu của bài toán P(r, s)
Vị trí phép toán thực hiện cuối cùng
Trang 25Bài toán Phép nhân tổ hợp nhiều ma trận
Trang 26Lập bảng (Bài toán phép nhân tổ hợp nhiều ma trận)
End;
Trang 27Lập bảng (Bài toán phép nhân tổ hợp nhiều ma trận)
Trang 28Tổng hợp kết quả (Bài toán phép nhân tổ hợp nhiều ma trận)
writeln(‘Thứ tự thực hiện các phép nhân :’);
For i:=1 to n-1 do writeln(x[i]);
End;
Trang 29Tổng hợp kết quả (Bài toán phép nhân tổ hợp nhiều ma trận)
Trong đó thủ tục TimVT được xây dựng đệ quy như sau:
Trang 30Số phép toán tối thiểu là: 6000
l[1,3]=6000
Thứ tự thực hiện các phép nhân là:
3 2
x[2]=k[1,3]=2
x[1]= k[2,3]=3
Trang 31Một số bài tập (QUI HOẠCH ĐỘNG)
1 Bài toán xâu trong cực đại
2 Bài toán du lịch
Trang 32Bài toán XÂU TRONG CỰC ĐẠI
Xâu con: S là xâu con của T nếu S nhận được bằng cách xoá
đi một số ký tự nào đó trong T
Ví dụ: ‘EAC’ là xâu con của ‘CEA EE C ’
Xâu con chung: Nếu xóa một số ký tự của hai xâu thì hai xâu con còn lại của chúng bằng nhau
Ví dụ: S1=‘A B CD AE’ và S2=‘XY AC A D K’ có xâu ‘ACD’ là xâu con chung có độ dài cực đại.
Trang 33Bài toán XÂU TRONG CỰC ĐẠI
Bài toán đặt ra:
Cho 2 xâu A, B Tìm một xâu S là xâu con chung của A
và B có độ dài cực đại.
Input: Xâu A và xâu B
Output: Xâu S là xâu trong chung của xâu A và B có độ
dài cực đại
Trang 34Bài toán XÂU TRONG CỰC ĐẠI
Phân tích bài toán
Giả sử ta có:
• M= length(A)
• N= length(B)
Cần xây dựng mảng L[0 M,0 N] với ý nghĩa:
• L[i,j] là độ dài của xâu chung dài nhất của hai xâu A[0 i] và B[0 j] (0 ≤ i ≤ M; 0 ≤ j ≤ N)
Bài toán ban đầu L(M,N)
Các giá trị cần tìm:
• L[i,j]: độ dài cực đại của xâu con chung của bài toán L(M,N)
• S: xâu con chung của bài toán L(M,N)
Trang 35Bài toán XÂU TRONG CỰC ĐẠI
• Đương nhiên nếu một xâu là rỗng thì xâu con chung cũng là rỗng, vì vậy:
L[0,j] = 0, ∀ j, j=1 N;
L[i,0]=0, ∀ i, i=1 M;
• Nếu cả hai xâu khác rỗng:
Nếu A[i] = B[j] thì L[i,j] = L[i-1,j-1]+1
Trang 36Bài toán XÂU TRONG CỰC ĐẠI
Giải pháp đệ quy
• Nếu (i=0) hoặc (j=0) thì
L[i,j]=0
• Nếu (i>0) và (j>0) và (ai ≠ bj) thì
L[i,j] = Max(L(i-1,j), L(i,j-1))
• Nếu (i>0) và (j>0) và (ai=bj) thì
L[i,j]= L[i-1,j-1] +1
Trang 37Bài toán XÂU TRONG CỰC ĐẠI
Trang 38L[i,j]:=MAX(L[i,j-1],L[i-1,j]);
END;
END;
Trang 39j
Trang 412 1
i
j
A B
Trang 42Bài toán du lịch
• Một người đi từ thành phố 0 đến thành phố n và
có thể đi qua n-1 thành phố khác 1, 2, , n-1, theo lộ trình: 0 -> i1 -> i2 -> ik -> n, trong đó:
0 < i1 < i2 < ik < n Giá vé xe đi từ thành phố i đến thành phố j là c[i,j].
• Tìm một lộ trình từ thành phố 0 đến thành phố n
sao cho tổng chi phí về giá vé đạt cực tiểu.
Trang 44Bài toán du lịch
Phân tích bài toán
• Gọi ρ(s) là bài toán du lịch, với:
s ∈ N: là thành phố cần đến (thành phố xuất phát là 0).(Bài toán ban đầu là ρ(n))
• Các giá trị cần tìm:
l[s]: chi phí nhỏ nhất để đi từ 0 đến s của bài toán ρ(s)
u[s]: đỉnh kế cuối trên đường đi từ 0 đến s của bài toán
ρ(s)
Trang 45= l[k’] + c[k’,s]
u[s] = k’
Trang 46Lập bảng (Bài toán du lịch)
Trang 47Lập bảng (Bài toán du lịch)
l[3]=Min{l[0]+ c[0,3], l[1]+c[1,3],
l[2]+c[2,3]}=7;
u[3]=2
Trang 49Đường đi chi phí nhỏ nhất là: 0 → 2 → 3
s
x[1]=3 x[2]=u[3]=2 x[3]=u[2]=0