Professional Documents
Culture Documents
Với bất kỳ bài toán DP nào cũng phải xác định được stage, states trong mỗi stage, decision variables, giải
ngược từ stage cuối cùng lên stage đầu tiên (backward solution).
Làm tương tự như các bước trên để tìm ra optimal shortest path. Track lại đường đi đã chọn qua các bước.
Với các bài toán max benefit route construction, làm tương tự như trên nhưng thay vì lấy min thì lấy max.
2. Knapsack problem
Bài toán cho một vài item, benefit của nó, một knapsack, max weight của nó, chọn những item nào
(knapsack 0/1) và số lượng thế nào (knapsack primary) để maximize benefit.
Chỉ phải đưa ra quyết định là có chọn hay không cho các item.
Cách làm: Xây dựng một bảng với item (i) là hàng, weight (w) là cột. Công thức tính giá trị của một vị trí
có tọa độ [i, w] trong bảng:
+ Weight của item đang xét lớn hơn hoặc bằng weight của knapsack
So sánh giá trị V[i-1, w] (giá trị ngay trên đầu) với V [i-1, w – wi] + bi (benefit của item đang xét), lấy giá
trị lớn hơn.
Ví dụ:
● Bước 1: Điền số 0 vào hàng 0 và cột 0
● Bước 2: Xét hàng 1 (item 1 weight 2, benefit 3)
+ V [1,1], weight của item 1 = 2 > weight đang xét = 1, V[1,1] = V[0,1] = 0
+ V [1,2], weight của item 1 = 2 = weight dang xét = 2, V[2,2] so sánh giữa V [0,2] = 0 với V[0, 2-2] + 3
= 3 nên V [1,2] = 3
+ V[1,3], như trên, V[0,3] = 0 với V [0, 1] + 3 = 3 nên V[1,3] = 3. Tương tự cho V[1,4] và V[1,5]
Tiếp tục làm tương tự cho item 3 & 4 để có bảng hoàn chỉnh này.
● Cách tìm item nào có trong knapsack optimal sau khi đã hoàn tất bảng:
V [n, W] là value tối đa có thể đạt được, như trong bài trên là 7.
Xét: Đặt n = i, W = k
Nếu V[i,k] khác V[i-1,k] thì item thứ i đó nằm trong knapsack
Sau đó thực hiện i = i – 1, k = k – wi
Nếu V[i,k] = V [i-1,k] thì chỉ thực hiện i = i – 1
Thực hiện cho bài trên:
B1: V[4,5] = V [3,5] = 7.
B2: V[3,5] = V [2,5] = 7.
B3: V[2,5] khác V[1,5]. Đánh dấu item 2. Chuyển V[2,5] thành V[1, 5 – 3]
B4: V[1,2] khác V[1,1]. Đánh dấu item 1.
Vậy trong optimal solution thì knapsack có 2 item 1 và 2, tổng weight = 2 + 3 = 5 = max weight
knapsack, benefit = 3 + 4 = 7.
Ví dụ:
Max weight = 6
Chọn stage theo thứ tự: stage 1 cho item 3, stage 2 cho item 2, stage 3 cho item 1
S1 d1 V1 S0 f0 f1
0 0 0 0 0 0
1 0 0 1 0 0
2 0 0 2 0 0
1 3 0 0 3
3 0 0 3 0 0
1 3 1 0 3
4 0 0 4 0 0
1 3 2 0 3
2 6 0 0 6
5 0 0 5 0 0
1 3 3 0 3
2 6 1 0 6
6 0 0 6 0 0
1 3 4 0 3
2 6 2 0 6
3 9 0 0 9
S2 d2 V2 S1 f1 f2
0 0 0 0 0 0
1 0 0 1 0 0
2 0 0 2 3 3
3 0 0 3 3 3
4 0 0 4 6 6
1 7 0 0 7
5 0 0 5 6 6
1 7 1 0 7
6 0 0 6 9 9
1 7 2 3 10
Đến bảng này, cột S1 được sử dụng. Ví dụ với S2 = 1, S1 = 1 thì f1 optimal (lớn nhất) tương ứng ở stage
1 là 0. Đối chiếu với stage trước để điền f1 vào cho phù hợp và update f2 = V2 + f1.
S3 d3 V3 S2 f2 f3
6 0 0 6 10 10
1 4 4 7 11
2 8 2 3 11
3 12 0 0 12
Đến stage cuối cùng chỉ cần update S3 với giá trị weight lớn nhất.
D3 = 0 => V3 = 0, S2 còn lại 6, S2 có max f2 tương ứng là 10 => F3 tương ứng là 10. Tương tự cho các
trường hợp còn lại.
Vậy max benefit thu được là 12, tương ứng với trường hợp sử dụng 3 item 1, 0 item 2, 0 item 3, weight =
6 = max weight knapsack.