Tải bản đầy đủ (.pptx) (49 trang)

bài giảng qui hoạch động rất dễ hiểu nguyễn vũ cát tường

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 (458.62 KB, 49 trang )

( D y n a m i c P r o g r a m m i n g )
CHUYÊN ĐỀ
QUI HOẠCH ĐỘNG
TRƯỜNG THPT VINH LỘC
N
ă
m

h

c
:

2
0
1
4

-
2
0
1
5
NỘI DUNG
1. Giới thiệu
2. Phương pháp thực hiện
3. Một số bài toán tối ưu giải bằng phương
pháp quy hoạch động
Giới thiệu

Bài toán dãy số Fibonaci


1
1
2
3
5
Rabbits
i 1 2 3 4 5 6 … … n
F(i) 1 1 2 3 5 8 … …
?
Ví dụ 1: Tính phần tử thứ n của dãy số Fibonaci
F(1)=1
F(2)=2
F(i)= F(i-1)+F(i-2)
→ Tính F(n), giá trị của phần tử thứ n trong dãy.
Ví dụ 1: Tính phần tử thứ n của dãy số Fibonaci

Giải bài toán trên bằng giải thuật đệ qui?
Function F(n: integer): integer;
Begin
If n≤ 2 then
F:=1
Else
F:= F(n-1)+F(n-2);
End;
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à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)
Ví 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;
Var i: integer;
a: array[1 100] of integer;
Begin
a[1]:=1;
a[2]:=1;
For i:=3 to n do
a[i]:=a[i-1]+a[i-2];
F:= a[i];
End;

Đặ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

Sử dụng nguyên lý: “chia để trị”

Cách tiếp cận: “dưới-lên”

Phạm vi áp dụng

Các bài toán có được bằng việc tổ hợp các nghiệm của các bài
toán con

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.
2. 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)

Xé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];
3. 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
Bà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.
Cụ thể: Loại đồ vật i (i=1 n) có:
- kích cỡ m[i] ∈ N*
- giá trị c[i] ∈ R
- số lượng: không hạn chế

Một tên trộm mang theo chiếc túi có kích cỡ là p∈N*. Vậy hắn
phải chọn lựa một danh sách các đồ vật sẽ mang đi như thế nào để

cho tổng giá trị lấy cắp được là lớn nhất.
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
Bài toán chiếc túi xách
1
3
2
Ví dụ: Trong kho có các loại đồ vật và giá trị sau:
m[1]:2
c[1]:4
m[3]:4
c[3]:6
m[2]:3
c[2]:5
Giả sử tên trộm mang theo chiếc túi có kích cỡ p=9
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.
Bà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)
Bài toán chiếc túi xách

Giải pháp đệ quy:

Khi s = 1:
u[r, 1] = r div m[1]
l[r, 1] = u[r, 1]∗c[1]

Khi s > 1:
l[r, s] = max { k∗c[s] + l[r – k∗m[s], s-1] }
0 ≤ k ≤ r div m[s]
= k’∗c[s] + l[r – k’∗m[s], s-1]
u[r, s] = k’
Lập bảng (Bài toán chiếc túi xách)
Procedure LapBang;
Begin
For r:=0 to p do
For s:=1 to n do
If s=1 then Tính u[r, 1] và l[r, 1]
else Tính u[r, s] và l[r, s];
End;
Xét ví dụ trên với n=3, p=9.
m[1]=2, c[1]=4; m[2]=3, c[2]=5; m[3]=4, c[3]=6
Ta có bảng:
s
r
1 2 3
0 0/0 0/0 0/0
1 0/0 0/0 0/0

2 1/4 0/4 0/4
3 1/4 1/5 0/5
4 2/8 0/8 0/8
5 2/8 1/9 0/9
6 3/12 0/12 0/12
7 3/12 1/13 0/13
8 4/16 0/16 0/16
9 4/16 1/17 0/17
u[r,s] (số lượng đồ vật s)
l[r,s] (giá trị cực đại)
Tổng hợp kết quả (Bài toán chiếc túi xách)
Procedure TongHop;
Begin
r:=p;
For s:=n downto 1 do
begin
x[s]:= u[r,s];
r:= r – x[s].m[s];
end;
End;
Xét ví dụ trên với n=3, p=9.
m[1]=2, c[1]=4; m[2]=3, c[2]=5; m[3]=4, c[3]=6
Từ bảng đã lập ở trên ta tổng hợp kết quả như sau:
s
r
1 2 3
0 0/0 0/0 0/0
1 0/0 0/0 0/0
2 1/4 0/4 0/4
3 1/4 1/5 0/5

4 2/8 0/8 0/8
5 2/8 1/9 0/9
6 3/12 0/12 0/12
7 3/12 1/13 0/13
8 4/16 0/16 0/16
9 4/16 1/17 0/17
0/171/17
3/12
9
6
Giá trị cực đại là: 17
Số lượng các đồ vật được
lấy như sau:
Đồ vật 3 số lượng 0
Đồ vật 2 số lượng 1
Đồ vật 1 số lượng 3
Bà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.

Ví dụ: Tính M = M1 × M2 × M3
[10×20][20×50][50×5]
(M1×M2)×M3 có số phép toán là:
10×20×50 + 10×50×5 = 12500
M1×(M2×M3 ) có số phép toán là:
10×20×5 + 20×50×5 = 6000

Bài toán
Phép nhân tổ hợp nhiều ma trận

Ví dụ: Tính M = M1 × M2 × M3
[10×20][20×50][50×5]
(M1×M2)×M3 số phép toán được tính như sau:

M1 × M2 = 10 × 20 × 50 → M12
[10×50]

M12 × M3 = 10 × 50 × 5
→ Vậy (M1×M2)×M3 có số phép toán là:
10×20×50 + 10×50×5 = 12500
Bài toán
Phép nhân tổ hợp nhiều ma trận

Ví dụ: Tính M = M1 × M2 × M3
[10×20][20×50][50×5]
M1×(M2×M3) số phép toán được tính như sau:

M2 × M3 = 20 × 50 × 5 → M23
[20×5]

M1 × M23 = 10 × 20 × 5
→ Vậy (M1×M2)×M3 có số phép toán là:
10×20×5 + 20×50×5 = 6000
Bà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
i 0 1 … n
m[i] m[0] m[1] … m[n]
i 0 1 2 3
m[i] 10 20 50 5
Bà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
Bài toán
Phép nhân tổ hợp nhiều ma trận

Giải pháp đệ quy:

Trường hợp 1: Khi s = r : l[r, r] = 0

Trường hợp 2: Khi s = r+1:

l[r, r+1] = m[r-1] ∗ m[r] ∗ m[r+1]
k[r, r+1] = r+1

Trường hợp 3: Khi s > r+1:
l[r, s] = min { l[r, v-1] + m[r-1]∗m[v-1]∗m[s] + l[v, s] }
r+1 ≤ v ≤ s
(v là các vị trí phép toán thực hiện cuối cùng khác nhau)
= l[r, v’-1] + m[r-1] ∗ m[v’-1] ∗ m[s] + l[v’, s]
(v’ là vị trí tối ưu trong số các vị trí của v)
k[r, s] = v’

Nhận xét: Có thể ghép trường hợp 2 vào trường hợp 3.

×