You are on page 1of 8

Dynamic programming

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

1. Shortest path construction

Từ đề bài, xác định được 5 stage như trên hình.

● Bước 1: Xét transition stage 4 – 5


Có hai đường đi: HJ = 3, IJ = 4

● Bước 2: Xét transition stage 3 – 4

Từ E đến J có thể đi 2 đường:


EJ = EH + HJ = 1 + 3 = 4*
EJ = EI + IJ = 4 + 4 = 8
Đánh dấu * như trên hình để chọn ra đường đi optimal trong các lựa chọn để sử dụng cho các bước sau.

Làm tương tự với FJ và GJ

● Bước 3: Xét transition stage 2 – 3


Tương tự như bước 2, tìm các đường đi từ B đến J thông qua E, F, G. Các số liệu EJ, FJ, GJ được lấy từ
các số đánh sao ở bước 2. Với bước này cũng đánh sao những số optimal cho mỗi điểm xuất phát.

● Bước 4: Transition stage 1-2

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.

2.1 – Knapsack 0/1

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:

● Ý nghĩa : Xét hai trường hợp


+ Weight của item đang xét lớn hơn weight của knapsack => Item đang xét không thể nằm trong solution
nên giá trị V[i,w] = V [i-1, w] (giá trị ngay trên đầu giá trị hiện tại)

+ 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]

● Bước 3: Xét hàng 2 (item 2 weight 3, benefit 4)

+ V[2,1], weight 3 > 1, V[2,1] = V[1,1] = 0


+ V[2,2], weight 3 > 2, V[2,2] = V[1,2] =3
+ V[2,3], weight 3 = 3, V[2,3] = max giữa V[1,3] = 3 và V[1,0] + 4 = 4 => V[2,3] = 4
+ V[2,4], weight 4 > 3, V[2,4] = max giữa V[1,4] = 3 và V[1,1] + 4 = 4 => V[2,4] = 4
+ V[2,5], weight 5 > 3, V[2,5] = max giữa V[1,5] = 3 và V[1,2] + 4 = 7 => V[2,5] = 7

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.

2.2 – Primary Knapsack


Khác với 0/1 Knapsack ở chỗ ngoài việc chọn được item nào còn phải chọn nó với số lượng bao nhiêu.

Ví dụ:

Weight (kg) Profit per unit Number available


Item 1 2 $4 3
Item 2 4 $7 2
Item 3 2 $3 4

Max weight = 6
Chọn stage theo thứ tự: stage 1 cho item 3, stage 2 cho item 2, stage 3 cho item 1

Construct bảng cho stage 1 với các yếu tố:


S1: Weight của Knapsack
d1: Số lượng item
V1: Benefit tương ứng
S0: Weight available tương ứng trừ weight item (w – wi)
F0: Optimal solution của stage trước đó (sẽ ứng dụng cho các stage sau)
F1 = F0 + V1

Stage 1: Item 3 (weight 2, profit 3, available 4)

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

Stage 2: Item 2 (weight 4, profit 7, available 2)

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.

Stage 3: Item 1 (weight 2, profit 4, availabe 3)

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.

You might also like