You are on page 1of 8

Machine Translated by Google

Vấn đề ba lô

Giả sử chúng ta đang lên kế hoạch cho một chuyến đi bộ đường dài; và do đó, chúng tôi quan tâm đến

việc lấp đầy một chiếc ba lô với những vật dụng được coi là cần thiết cho chuyến đi. Có N loại mục

khác nhau được coi là mong muốn; những thứ này có thể bao gồm chai nước, táo, cam, bánh mì, v.v. Mỗi

loại mặt hàng có một tập hợp nhất định gồm hai thuộc tính là trọng lượng (hoặc khối lượng) và giá trị

lượng hóa mức độ quan trọng gắn với từng đơn vị của loại mặt hàng đó.

Vì chiếc ba lô có trọng lượng (hoặc thể tích) hạn chế nên vấn đề được quan tâm là tìm ra cách xếp ba

lô với sự kết hợp các đơn vị của các loại vật phẩm được chỉ định để mang lại tổng giá trị lớn nhất.

Những gì chúng tôi vừa mô tả được gọi là vấn đề ba lô.

Rất nhiều bài toán phân bổ tài nguyên có thể được đưa vào khuôn khổ của bài toán cái ba lô. Ý tưởng

chung là coi sức chứa của chiếc ba lô là lượng tài nguyên có sẵn và các loại vật phẩm là các hoạt động

mà tài nguyên này có thể được phân bổ. Hai ví dụ nhanh là phân bổ ngân sách quảng cáo cho các chương

trình khuyến mãi của các sản phẩm riêng lẻ và phân bổ nỗ lực của bạn để chuẩn bị cho các kỳ thi cuối

kỳ ở các môn học khác nhau.

Chính thức, giả sử chúng ta được cung cấp các tham số sau:

wk = trọng lượng của từng mặt hàng loại k, với k = 1, 2, . . ., N,

rk = giá trị được liên kết với từng mục loại k, với k = 1, 2, . . ., N,

c = trọng lượng của ba lô.

Sau đó, vấn đề của chúng tôi có thể được xây dựng như sau:

N
Tối đa hóa rkxk
k=1
chủ đề:
N
wkxk ≤ c ,
k=1

trong đó x1, x2, . . ., xN là các biến quyết định có giá trị nguyên không âm, được xác định bởi

xk = số lượng vật phẩm loại k được nạp vào ba lô.

Lưu ý rằng vì xk có giá trị nguyên, nên cái chúng ta có không phải là một chương trình tuyến tính thông

thường, mà là một chương trình số nguyên. Do đó, thuật toán Simplex không thể được áp dụng để giải

quyết vấn đề này.

1
Machine Translated by Google

Như một ví dụ số đơn giản, giả sử chúng ta có: N = 3; w1 = 3, w2 = 8 và w3 = 5; r1 = 4, r2 =


6 và r3 = 5; và cuối cùng, c = 8. Quan sát thấy rằng trong ba loại vật phẩm, loại thứ nhất có
giá trị lớn nhất trên một đơn vị trọng lượng. Đó là, trong ba tỷ lệ,

r1 = 4 r2 = 6 r3 = 5
, , và ,
w1 3 w2 số 8
w3 5

tỷ lệ đầu tiên là lớn nhất. Do đó, có vẻ như cố gắng chất càng nhiều đồ loại 1 vào ba lô càng
tốt. Vì sức chứa của ba lô là 8, nên lần thử như vậy sẽ dẫn đến tổ hợp tải trọng x1 = 2, x2 =
0 và x3 = 0, với tổng giá trị là

r1x1 + r2x2 + r3x3 = 4×2 + 6×0 + 5×0 = 8.

Sự kết hợp tải này có tối ưu không? Thực tế là sự kết hợp này để lại một sự lãng phí 2 trong
ba lô là khó chịu. Thật vậy, hóa ra sự kết hợp này không phải là tối ưu; và rằng sự kết hợp tối
ưu là để x1 = 1, x2 = 0 và x3 = 1, đạt được tổng giá trị là 9.

Bây giờ chúng ta mô tả cách rút ra lời giải tối ưu cho vấn đề này bằng cách sử dụng tính năng kết hợp

chương trình động. Như trong giải pháp của chúng tôi về vấn đề thay thế thiết bị, quy trình giải

quyết sẽ gồm bốn bước.

Các giai đoạn và tiểu bang

Quan sát rằng có một quyết định để thực hiện cho từng loại mặt hàng. Nghĩa là, chúng ta có thể

tưởng tượng một quy trình gán trong đó một chuỗi các giá trị được chỉ định cho xk , mỗi lần một giá trị.

Theo đó, chúng ta có thể xác định một giai đoạn cho từng loại mục. Hơn nữa, rõ ràng là định
nghĩa về các giai đoạn này không phụ thuộc vào thứ tự liệt kê các loại vật phẩm.

Để thúc đẩy định nghĩa về các trạng thái, hãy tưởng tượng bạn là một nhà tư vấn được thuê ở
đầu giai đoạn k, trong đó 1 ≤ k ≤ N. Điều này có nghĩa là các quyết định cho các loại mục
từ 1 đến k - 1 đã được đưa ra và những quyết định trong quá khứ không thể được rút lại; và
bạn hiện chịu trách nhiệm đưa ra các quyết định còn lại cho các loại mục từ k đến N.
Vì vậy, câu hỏi là: Tôi cần biết những gì để đưa ra những quyết định còn lại?
Một chút suy ngẫm sẽ thuyết phục bạn rằng câu trả lời cho câu hỏi của nhà tư vấn này là: sức
chứa còn lại của chiếc ba lô khi bắt đầu giai đoạn k. Do đó, chúng ta nên xác định dung
lượng còn lại là trạng thái.

Hàm giá trị tối ưu

Như đã lưu ý trước đây, đây sẽ là một sự điều chỉnh đơn giản của định nghĩa tiêu chuẩn. Trong ngôn

ngữ của vấn đề hiện tại, hãy để

2
Machine Translated by Google

Vk(i) = tổng giá trị cao nhất có thể đạt được từ các loại vật phẩm từ k đến N, giả sử
rằng chiếc ba lô có sức chứa còn lại là i.

Mục tiêu của chúng ta là xác định V1(c); trong ví dụ số đơn giản ở trên, điều này có nghĩa là

chúng ta quan tâm đến V1(8).

quan hệ lặp lại

Giả sử tất cả các giá trị của x1 đến xk 1 đều đã được gán, và chúng ta sẵn sàng gán cho xk;

tức là chúng ta đang ở giai đoạn k. Giả sử thêm rằng chiếc ba lô tại thời điểm này có sức chứa
còn lại là i, trong đó 0 ≤ i ≤ c; tức là chúng ta đang ở trạng thái i. Vì mỗi mục loại k có

trọng số là wk, chúng ta không thể gán giá trị lớn hơn i/wk cho xk.

Hơn nữa, hãy lưu ý rằng i/wk không nhất thiết phải là số nguyên. Theo đó, phạm vi khả thi cho

xk là 0 ≤ xk ≤ i/wk, trong đó ký hiệu x là, với bất kỳ x đã cho nào, được định nghĩa là số
nguyên lớn nhất nhỏ hơn hoặc bằng x.

Đối với bất kỳ số nguyên xk nào trong phạm vi được chỉ định ở trên, đóng góp một giai đoạn
ngay lập tức vào tổng giá trị trong chiếc ba lô được đưa ra bởi rkxk. Quan sát rằng do một
nhiệm vụ hoặc hành động như vậy, sức chứa của ba lô sẽ bị giảm thêm wkxk. Theo đó, trạng thái
“mới” ở giai đoạn tiếp theo, cụ thể là giai đoạn k + 1, sẽ là i wkxk. Do đó, phần đóng góp

“trong tương lai” tốt nhất có thể vào tổng giá trị trong chiếc ba lô được cho bởi Vk+1(i wkxk).

Kết hợp các cuộc thảo luận trong hai đoạn trên hiện mang lại mối quan hệ lặp lại sau:

Vk(i) = tối đa [rkxk + Vk+1(i wkxk)] .


0≤xk≤i/tuần

Với mối quan hệ truy hồi tại chỗ, bước cuối cùng của thủ tục giải pháp bao gồm tính toán đệ quy

của Vk(i)'s.

tính toán

Chúng tôi sẽ minh họa tính toán với ví dụ số được chỉ định ở trên. Nhớ lại rằng với ba loại
vật phẩm, tổng số giai đoạn là 3.

Có hai cách để xác định điều kiện biên. Cách tiếp cận đầu tiên là tưởng tượng một giai đoạn

thứ tư hư cấu và đơn giản đặt V4(i) = 0 với i bất kỳ. Điều này tương ứng với thực tế là sau
khi đã gán giá trị cho mọi xk, dung lượng còn lại trong ba lô, nếu có, sẽ không còn bất kỳ giá
trị tiềm năng nào. Tất nhiên, cách tiếp cận thứ hai là bắt đầu lặp lại từ giai đoạn 3. Vì có
rất ít sự khác biệt giữa hai cách tiếp cận này nên chúng tôi sẽ áp dụng cách tiếp cận thứ hai.

3
Machine Translated by Google

Vì sức chứa được chỉ định của chiếc ba lô là 8, nên trạng thái cao nhất có thể có trong bất kỳ

giai đoạn nào là 8. Giả sử chúng ta hiện đang ở giai đoạn 3, có nghĩa là chúng ta đang xem xét

phân bổ các mặt hàng loại 3. Thực tế là mọi vật phẩm loại 3 đều có trọng số là 5 ngụ ý rằng trạng

thái, hoặc sức chứa còn lại của chiếc ba lô, ít nhất phải là 5 để có thể thực hiện được phép gán

dương cho x3 . Suy ra V3(0) = V3(1) = V3(2) = V3(3) = V3(4) = 0. Tiếp theo, lập luận tương tự cho

thấy rằng đối với bất kỳ trạng thái nào từ 5 đến 9, chỉ có đủ dung lượng để chứa một mặt hàng

loại 3. Vì r3 = 5, điều này có nghĩa là V3(5) = V3(6) = V3(7) = V3(8) = 5. Tóm lại, điều kiện

biên cho bài toán của chúng ta được cho trong bảng dưới đây.

Giai đoạn 3: tôi V3(i) x 3


0 0 0
1 0 0
2 0 0
3 0 0
4 0 0
5 5 1
6 5 1
7 5 1
số 8 5 1

Lưu ý rằng cột cuối cùng liệt kê phân bổ tối ưu, được biểu thị bằng x giai 3 , cho mọi trạng thái trong

đoạn 3.

Bây giờ chúng ta xem xét giai đoạn 2. Vì mọi vật phẩm loại 2 có trọng số là 8, nên trạng thái
hoặc sức chứa còn lại của chiếc ba lô ít nhất phải là 8 thì việc gán dương cho x2 mới khả thi .
Do đó, đối với bất kỳ i nào từ 0 đến 7, hệ thức truy hồi ước tính thành

V2(i) = tối đa [r2x2 + V3(i w2x2)]


0≤x2≤0

= 6 × 0 + V3(i 8 × 0)

= 0 + V3(i),

trong đó V3(i) được đưa ra trong bảng trước; và đối với trạng thái 8, trong đó x2 có thể là 0
hoặc 1, hệ thức truy hồi đánh giá bằng

V2(8) = tối đa [r2x2 + V3(8 w2x2)]


0≤x2≤1

= max [6 × 0 + V3(8 8 × 0), 6 × 1 + V3(8 8 × 1)] =

max [0 + V3(8), 6 + V3(0)] =

max [0 + 5, 6 + 0]

= 6.

4
Machine Translated by Google

Những tính toán này được tóm tắt trong bảng giai đoạn 2 dưới đây.

Giai đoạn 2: hành động

Tôi
x2 = 0 x2 = 1 0 V2(i) x 2
0 + 0 -
0 0
1 0 + -
0 0
2 0 0 -
0 0
3 + 0 -
0 0
4 0 + -
0 0
5 0 0 -
5 0
6 + 0 -
5 0
7 0 + -
5 0
số 8 5 0 + 5 0 + 5 0 + 5 6 + 60 1

(Các dấu gạch ngang trong cột x2 = 1 biểu thị tính không khả thi của hành động đó.)

Cuối cùng, trong giai đoạn 1, trạng thái duy nhất là 8. Vì 8/w1 = 8/3 = 2 nên có thể phân
bổ 0, 1 hoặc 2 mục loại 1. Do đó, mối quan hệ truy hồi ước tính thành

V1(8) = tối đa [r1x1 + V2(8 w1x1)]


0≤x2≤2

= max [4 × 0 + V2(8 3 × 0), 4 × 1 + V2(8 3 × 1), 4 × 2 + V2(8 3 × 2)]

= tối đa [0 + V2(8), 4 + V2(5), 8 + V2(2)]

= tối đa [0 + 6, 4 + 5, 8 + 0]

= 9.

Những tính toán này được tóm tắt trong bảng dưới đây.

Giai đoa n 1: Thao


tác x1 = 0 x1 = 1 x1 = 2 V1(i) x 1
tôi 8 0 + 6 4 + 5 8 + 0 9 1

Vì V1(8) = 9, chúng ta kết luận rằng tổng giá trị cao nhất mà chiếc ba lô có thể chứa là 9.

Như trong các ví dụ trước, trình tự các hành động tối ưu có thể được đọc tuần tự từ các bảng
= 1. còn
trên. Từ bảng giai đoạn 1, chúng ta có x = 1, khả1 năng Với lại,
x 1 hoặc trạng thái, ở giai đoạn

2 sẽ là 8 3 × 1 = 5; do đó, từ hàng có i = 5 trong bảng giai đoạn 2, ta lấy trạng thái x,


ở giai đoạn 3 sẽ là 5 8 2 = 0. Điều này hàm ý rằng dung lượng còn lại, hoặc

× 0 = 5; và việc đọc hàng có i = 5 trong bảng giai đoạn 3 cho thấy x = 1. Do đó, chính sách
tối ưu quy định một chiếc ba lô được chất 3 với một mặt hàng loại 1, không có mặt hàng loại 2

và một mặt hàng loại -3 mục. Điều này hoàn thành giải pháp của ví dụ số.

5
Machine Translated by Google

Cuộc thảo luận

Nếu yêu cầu về tính toàn vẹn trên xk được nới lỏng, thì giải pháp tối ưu là nạp c/w1 = 8/3 đơn

vị vật phẩm loại 1 vào ba lô. Đây là hệ quả của việc các mặt hàng loại 1 có giá trị lớn nhất
trên một đơn vị trọng lượng.

Nếu giá trị của xk bị giới hạn ở 0 hoặc 1, thì vấn đề kết quả được gọi là vấn đề về chiếc ba
lô 0-1. Ví dụ, một vấn đề như vậy có thể nảy sinh trong việc lựa chọn thành viên cho một ủy

ban (trong đó giá trị của mỗi xk tương ứng với việc loại trừ hoặc đưa vào một cá nhân cụ thể).

Tính toán đệ quy ở trên cũng có thể được thực hiện thông qua biểu diễn mạng, theo cách tương
tự như những gì đã được thực hiện cho bài toán thay thế thiết bị. Một lần nữa, ý tưởng là
biểu diễn sự kết hợp từng giai đoạn và trạng thái dưới dạng một nút được nhúng trong hệ tọa
độ hai chiều và biểu thị từng hành động dưới dạng một cung. Do đó, trạng thái 8 trong giai

đoạn 1 chẳng hạn sẽ được biểu diễn bằng một nút tại (1, 8); và các giá trị khả thi cho x1 ở

trạng thái 8 trong giai đoạn 1 sẽ được biểu diễn bằng ba cung nối (1, 8) với (2, 8), (2, 5)

và (2, 2), tương ứng. Ngoài ra, “sự quay lại” một giai đoạn liên quan đến ba hành động này,

cụ thể là 0, 4 và 8, có thể được coi là khoảng cách di chuyển từ (1, 8) đến (2, 8), (2, 5),

và (2, 2), tương ứng. Theo đó, bài toán của chúng ta tương đương với bài toán tìm đường đi

dài nhất giữa nút (1, 8) và bất kỳ nút nào (3, 8), (3, 5), (3, 2) và (3, 0) (có “khoảng cách

đầu cuối” lần lượt là 5, 5, 0 và 0) trong mạng kết quả. Các tính toán được thực hiện trong
Hình DP-6. Bạn nên xác minh rằng các giá trị tối ưu trong Hình DP-6 giống hệt với các giá trị
được trình bày trong một loạt các bảng ở trên.

Biểu diễn mạng trong Hình DP-6 cũng cho thấy rằng không phải tất cả các trạng thái trong giai

đoạn 2 và 3 đều cần thiết trong tính toán đệ quy. Cụ thể, chỉ V2(2), V2(5) và V2(8) là cần

thiết cho giai đoạn 2; và chỉ V3(0), V3(2), V3(5) và V3(8) là cần thiết cho giai đoạn 3.

Công thức lập trình động của chúng ta có thể dễ dàng thích ứng để giải các bài toán tổng quát

hơn (hoặc phân bổ tài nguyên) có dạng:

N
Tối đa hóa rk(xk)
k=1
chủ đề:
N
wk(xk) ≤ c ,
k=1

trong đó rk(·)'s và wk(·)'s là các hàm tùy ý và xk's là các số nguyên không âm. Nghĩa là,
tổng giá trị và tổng trọng số được liên kết với các mục xk loại-k không nhất thiết phải tuyến
tính trong xk.

6
Machine Translated by Google

Một cách khái quát hóa khác là cho phép mỗi loại vật phẩm có cả trọng lượng và thể tích. Cụ thể
hơn, gọi vk là thể tích của từng mặt hàng loại k; và giả sử rằng chiếc ba lô có trọng lượng là
cw và thể tích là cv. Sau đó, vấn đề của chúng tôi khái quát thành:

N
Tối đa hóa rkxk
k=1
chủ đề:
N
wkxk ≤ cw
k=1
N
vkxk ≤ cv ,
k=1

trong đó xk là các số nguyên không âm. Một lần nữa, công thức lập trình động của chúng ta có thể được

điều chỉnh để giải quyết vấn đề này. Ý tưởng là sửa đổi định nghĩa trạng thái thành một cặp khả năng

còn lại, một về trọng lượng và một về khối lượng. Chúng tôi bỏ qua các chi tiết. (Ví dụ 5 trong Chương

10 của bản văn của chúng ta cũng có tinh thần tương tự.)

Cuối cùng, chúng ta lưu ý rằng tồn tại các công thức quy hoạch động khác cho bài toán cái ba lô.
Một cách tiếp cận thú vị là tưởng tượng tải một mục tại một thời điểm, với việc lựa chọn loại
mục là biến quyết định. Nói cách khác, việc chất một vật phẩm vào ba lô được coi là một giai
đoạn và việc lựa chọn một loại vật phẩm cụ thể để chất vào được coi là một hành động. (Tuy

nhiên, tổng số các giai đoạn cần thiết không được biết trước.)

Định nghĩa trạng thái sẽ tiếp tục là dung lượng còn lại của ba lô; và việc xây dựng quan hệ truy
hồi sẽ dựa trên ý tưởng liên hệ giá trị tối ưu của bài toán chiếc ba lô với trạng thái đã cho

(hoặc dung lượng còn lại cho trước) với giá trị tối ưu của bài toán chiếc ba lô với trạng thái

nhỏ hơn (hoặc dung lượng nhỏ hơn). Điều này được thực hiện như sau. Cho phép

V(i) = tổng giá trị cao nhất có thể đạt được từ một chiếc ba lô có sức chứa i.

(Lưu ý rằng chúng tôi không lập chỉ mục các giai đoạn ở đây, vì thông tin này không đóng vai

trò gì trong công thức này.) Quan sát rằng nếu một mục loại k được chọn để tải, thì công suất

nhất định i sẽ giảm xuống còn i - wk, miễn là rằng i wk không âm. Hơn nữa, vì đóng góp tức
thời từ một mục loại k vào giá trị tổng thể là rk và vì chúng ta nên tiến hành một cách tối ưu
từ trạng thái mới i - wk trở đi, nên tổng giá trị liên quan đến một hành động như vậy bằng rk

+ V (i - tuần). Theo đó, quan hệ truy hồi là

V(i) = max [rk + V (i wk)] ,


k

trong đó các giá trị của k được giới hạn ở những giá trị sao cho i wk ≥ 0 (nếu i wk < 0

với mọi k, thì V(i) bằng 0, vì không thể tải mục nào). Điều kiện biên cho đệ quy này là

7
Machine Translated by Google

đơn giản là V(0) = 0. Đối với ví dụ số của chúng ta ở trên, các ứng dụng lặp đi lặp lại của quan hệ truy

hồi này mang lại:

V(1) = V(2) = 0,

V(3) = r1 + V(0) = 4,

V(4) = r1 + V(1) = 4,

V(5) = max[r1 + V(2), r3 + V(0)] = max[4 + 0, 5 + 0] = 5,

V(6) = max[r1 + V(3), r3 + V(1)] = max[4 + 4, 5 + 0] = 8,

V (7) = max[r1 + V (4), r3 + V (2)] = max[4 + 4, 5 + 0] = 8,

và cuối cùng

V(8) = max[r1 + V(5), r2 + V(0), r3 + V(3)] = max[4 + 5, 6 + 0, 5 + 4] = 9.

Do đó, giá trị tối ưu là 9, phù hợp với giải pháp trước đó. Có hai trình tự tải tối ưu: vật
phẩm loại 1 rồi đến vật phẩm loại 3 hoặc vật phẩm loại 3 rồi đến vật phẩm loại 1.

số 8

You might also like