Задача о рюкзаке
Назначение. Онлайн-калькулятор предназначен для решения задачи о ранце методами динамического программирования (прямой и обратной прогонки). см. пример решения.
Задача о ранце
Имеются n предметов, которые необходимо поместить в рюкзак (ранец). Пусть известны вес aj и «ценность» cj каждого предмета (j= 1,2,... ,n). Требуется заполнить рюкзак, не превышая его грузоподъемности (объема) b и максимизируя суммарную ценность груза. Получаем следующую булеву ЗЦЛП (задача о рюкзаке):
cj>0, aj>0, b>0, cj∈Z, aj∈Z, b∈Z, (j=1,2,..,n)
Легко видеть, что тогда множество допустимых векторов задачи ограничено и не пусто (x1 = x2 = ... = xn = 0).
Для каждого k∈{1,2,...,n} и y∈{1,2,...,b} рассмотрим вспомогательную задачу о рюкзаке

Рассмотрим задачу (105) при k = 1. В ней требуется разместить в рюкзак грузоподъемности y максимальное число предметов первого типа. Очевидно, что
f1(y)=c1·[y/a1] (y=1,2,...,b)
Рассмотрим теперь задачу (105) при k > 1. Требуется разместить в рюкзак предметы первых k типов, так, чтобы суммарная ценность груза была бы максимальна. Предположим, что рюкзак заполнен оптимально.Если в рюкзаке нет ни одного предмета k-го типа, то он заполнен только предметами типов 1,2,... ,k - 1. Так как заполнение оптимально, то значение целевой функции (суммарная ценность) в этом случае равна fk(y) = fk-1(y).
Если в рюкзаке предмет k-го типа находится только в одном экземпляре, то оставшееся место y — ak должно быть заполнено оптимальным образом предметами типов 1,2,... ,k — 1. В этом случае fk(y) = fk-1(y - ak) + ck.
Если в рюкзаке два предмета k-го типа, то под остальные предметы остается место равное y - 2ak. Так как заполнение оптимально, то
fk(y) = fk-1(y-2ak) + 2ck.
Эти рассуждения можно провести далее, рассмотрев случаи с тремя, четырьмя и т. д. предметами k-го типа, находящимися в рюкзаке, вплоть до случая, когда в рюкзаке находится максимально возможное число [y/ak] предметов k-го типа. Оставшееся место y - ak · [y/ak] должно быть заполнено оптимальным образом предметами первых (k - 1) типов. Получаем
fk(y) = fk-1(y - ak · [y/ak]) + ck · [y/ak].
Подводя итог вышесказанному, можно сделать вывод, что

fk(y-ak) = max{fk-1(y-ak),...,fk-1(y-ak·[y/ak])+ck·[y/ak]-ck}
Теперь ясно, что в соотношении (107) все элементы, среди которых ищется максимальный, кроме первого, можно заменить на fk(y - ak) + ck, т. е.fk(y) = max{fk-1(y), fk(y-ak)+ck} (k=2,...,n; y=ak+1,...,b) (108)
Вычисления проводятся по формулам (106) и (108) (при y < 0 положим fk(y) = -∞). Удобно использовать таблицу F размера n x b. В k-ой строке и y-ом столбце этой таблицы записывается значение fk(y). Таблица заполняется по строкам сверху вниз, в каждой строке слева направо. Заметим, что для вычисления fk(y) достаточно знать fk-1(y) и fk(y - ak). Это позволяет хранить только одну строку таблицы F.Для того, чтобы кроме оптимального значения целевой функции найти компоненты решения, используют другую таблицу I. Таблица I также имеет размеры n x b и заполняется следующим образом. В k-ой строке и y-ом столбце этой таблицы записывается максимальной номер i(k,y) ненулевой компоненты оптимального вектора задачи (105), т. е.

Примеры
Пример №1 решения задачи о рюкзаке.Задание. В рюкзак объема V = 7 кладут N = 5 предметов.Объемы, веса и количество предметов в каждой группе приведены в таблице.
| Объем | 1 | 2 | 3 | 1 | 1 |
| Вес | 2 | 3 | 2 | 4 | 1 |
| Кол-во | 1 | 3 | 3 | 1 | 2 |
Решение. I этап. Условная оптимизация.
f1(L) = max(2x1); 0 < x1 < 1; x1 = 0,1.
f1(0) = max[0*2] = 0
f1(1) = max[0*2, 1*2] = 2
f1(2) = max[0*2, 1*2] = 2
f1(3) = max[0*2, 1*2] = 2
f1(4) = max[0*2, 1*2] = 2
f1(5) = max[0*2, 1*2] = 2
f1(6) = max[0*2, 1*2] = 2
f1(7) = max[0*2, 1*2] = 2
Таблица 1 – Расчет значения функции f1(L)
| L | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| f1(L) | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
| x1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
f2(0) = max[0*3+0] = 0
f2(1) = max[0*3+2] = 2
f2(2) = max[0*3+2, 1*3+0] = 3
f2(3) = max[0*3+2, 1*3+2] = 5
f2(4) = max[0*3+2, 1*3+2, 2*3+0] = 6
f2(5) = max[0*3+2, 1*3+2, 2*3+2] = 8
f2(6) = max[0*3+2, 1*3+2, 2*3+2, 3*3+0] = 9
f2(7) = max[0*3+2, 1*3+2, 2*3+2, 3*3+2] = 11
Таблица 2 – Расчет значения функции f2(L)
| L | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| f2(L) | 0 | 2 | 3 | 5 | 6 | 8 | 9 | 11 |
| x2 | 0 | 0 | 1 | 1 | 2 | 2 | 3 | 3 |
f3(0) = max[0*2+0] = 0
f3(1) = max[0*2+2] = 2
f3(2) = max[0*2+3] = 3
f3(3) = max[0*2+5, 1*2+0] = 5
f3(4) = max[0*2+6, 1*2+2] = 6
f3(5) = max[0*2+8, 1*2+3] = 8
f3(6) = max[0*2+9, 1*2+5, 2*2+0] = 9
f3(7) = max[0*2+11, 1*2+6, 2*2+2] = 11
Таблица 3 – Расчет значения функции f3(L)
| L | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| f3(L) | 0 | 2 | 3 | 5 | 6 | 8 | 9 | 11 |
| x3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
f4(0) = max[0*4+0] = 0
f4(1) = max[0*4+2, 1*4+0] = 4
f4(2) = max[0*4+3, 1*4+2] = 6
f4(3) = max[0*4+5, 1*4+3] = 7
f4(4) = max[0*4+6, 1*4+5] = 9
f4(5) = max[0*4+8, 1*4+6] = 10
f4(6) = max[0*4+9, 1*4+8] = 12
f4(7) = max[0*4+11, 1*4+9] = 13
Таблица 4 – Расчет значения функции f4(L)
| L | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| f4(L) | 0 | 4 | 6 | 7 | 9 | 10 | 12 | 13 |
| x4 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
f5(0) = max[0*1+0] = 0
f5(1) = max[0*1+4, 1*1+0] = 4
f5(2) = max[0*1+6, 1*1+4, 2*1+0] = 6
f5(3) = max[0*1+7, 1*1+6, 2*1+4] = 7
f5(4) = max[0*1+9, 1*1+7, 2*1+6] = 9
f5(5) = max[0*1+10, 1*1+9, 2*1+7] = 10
f5(6) = max[0*1+12, 1*1+10, 2*1+9] = 12
f5(7) = max[0*1+13, 1*1+12, 2*1+10] = 13
Таблица 5 – Расчет значения функции f5(L)
| L | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| f5(L) | 0 | 4 | 6 | 7 | 9 | 10 | 12 | 13 |
| x5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Таким образом, максимальный вес рюкзака f5(7) равна 13 кг.
При этом x5 = 0, так как f5(7) = 13 достигается при х5=0 (см. таблицу 5).
Предметы остальных типов распределяются следующим образом:
L = 7 - 1 * 0 = 7
f4(7) = 13 достигается при х4 = 1 (см. таблицу 4).
L = 7 - 1 * 1 = 6
f3(6) = 9 достигается при х3 = 0 (см. таблицу 3).
L = 6 - 3 * 0 = 6
f2(6) = 9 достигается при х2 = 3 (см. таблицу 2).
L = 6 - 2 * 3 = 0
f1(0) = 0 достигается при х1 = 0 (см. таблицу 1).
L = 0 - 1 * 0 = 0
В итоге наилучший вариант загрузки рюкзака достигается при значениях: x1 = 0, x2 = 3, x3 = 0, x4 = 1, x5 = 0
Пример №2. Решим задачу
max(8x1+5x2+x3)
3x1+2x2+x3≤13
x∈Z, x≥0 (j=1,2,3)
методом динамического программирования.
По формулам (106) и (108) вычислим элементы таблицы F:


i(3,13)=2
i(3,13-a2)=i(3,11)=2
i(3,11-a2)=i(3,9)=1
i(3,9-a1)=i(3,6)=1
i(3,6-a1)=i(3,6)=1
Таким образом, оптимальный вектор имеет компоненты x1 = 3, x2 = 2, x3 =0.
Задача о целочисленном рюкзаке
Имеется транспортное средство грузоподъемностью L. Требуется заполнить его грузом, состоящим из предметов различных типов, чтобы стоимость всего груза оказалась максимальной.Для этого введем соответствующие обозначения:
Wi – вес одного предмета i-го типа;
Pi – стоимость одного предмета i-го типа;
xi – число предметов i-го типа, загружаемых на имеющееся транспортное средство.
Необходимо подобрать груз максимальной ценности с учетом грузоподъемности транспортного средства L.
Математически формализовать данную экстремальную задачу можно следующим образом:
Решение задачи разбивается на n этапов, на каждом их которых определяется максимальная стоимость груза, состоящего из предметов первого типа (первый этап), первого и второго типов (второй этап)
и т.д. Для этого воспользуемся рекуррентным соотношением или критерием оптимальности Беллмана:
fn (L) = max [ xnPn + fn-1(L-xnWn)], (2)
0<xn< [L/Wn],
где fn(L) – максимальная стоимость груза, состоящего из предметов n-го типа;
xnPn – стоимость взятых предметов n-го типа;
fn-1(L-xnWn) – максимальная стоимость груза, состоящего из предметов (n-1) типа с общим весом не более L-xnWn;
[L/Wn] – наибольшее целое число, не превосходящее L/Wn.
Будем считать f0(L) = 0 для любого L. Последовательно найдя значение функции f1(L), f2(L), ..., fn(L), можно получить полное решение сформулированной задачи.
Вывод:
- каждый предмет имеется в неограниченном числе экземпляров;
- требуется максимизировать суммарную ценность груза, не превышая грузоподъемности.

Пример №1.
Пусть:
W1 = 4, W2 = 3, W3 = 2, W4 = 1 (единиц груза);
P1 = 28, P2= 20,P3 = 13, P4 = 6 (денежных единиц);
L = 10 (единиц груза).
Найдем последовательно значения функций: f1(L), f2(L), f3(L), f4(L) при различных значениях L (0<L<10).
Решение данной задачи представлено в таблицах 1–4.
f1(L) = max ( 28x1); 0<x1< [10/4]; x1 =0, 1, 2.
Таблица 1 – Расчет значения функции f1(L )
| L | 0-3 | 4-7 | 8-10 |
| f1(L) | 0 | 28 | 56 |
| x1 | 0 | 1 | 2 |
Таблица 2 – Расчет значения функции f2(L)
| L | 0-2 | 3 | 4-5 | 6 | 7 | 8 | 9 | 10 |
| f 2(L) | 0 | 20 | 28 | 40 | 48 | 56 | 60 | 68 |
| x2 | 0 | 1 | 0 | 2 | 1 | 0 | 3 | 2 |
Таблица 3 – Расчет значения функции f3(L)
| L | 0-1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| f 3(L) | 0 | 13 | 20 | 28 | 33 | 41 | 48 | 56 | 61 | 69 |
| x3 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
f4(L) = max [ x4 .6 + f3(L-x4. 1)]; 0<x4< [10/1]; x4 =0, 1, 2, …,10.
Таблица 4 – Расчет значения функции f4(L)
| L | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| f4(L) | 0 | 6 | 13 | 20 | 28 | 34 | 41 | 48 | 56 | 62 | 69 |
| x4 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
Предметы остальных типов распределяются следующим образом:
х3= 1, так как f3(10) = 69 достигается при х3= 1 (см. таблицу 9), следовательно, вес этого предмета равен двум единицам груза, поэтому остальные предметы можно загрузить лишь в пределах веса, равного
10-2=8 единицам груза;
f2(8) = 56 достигается при х2 = 0 (см. таблицу 8), следовательно, предметы второго типа брать не следует;
f1(8) = 56 достигается при х1= 2 (см. таблицу 7), следовательно, предметов первого типа следует взять два.
В итоге наилучший вариант загрузки транспортного средства достигается при значениях х1= 2; х2= 0; х3= 1; х4= 0 (берутся два предмета первого типа и один – третьего типа).
Пример №2. Самолет загружается предметами N различных типов (табл. 1) с весом wj и стоимостью cj, j = 1,n. Максимальная грузоподъемность равна W=5. Определить максимальную стоимость груза, вес которого не более W.
Таблица 1 - Исходные данные
| Тип j | Вес wj | Стоимость cj |
| 1 | 2 | 65 |
| 2 | 3 | 80 |
| 3 | 1 | 30 |
Решение. Сделаем математическую постановку. Пусть xj – количество предметов j-го типа, загружаемых в самолет. Тогда математическая модель имеет вид:
xj ≥ 0 (3)
xj – целые. (4)
Отличительными особенностями задачи динамического программирования будут:
1. Этап j связан с загрузкой предметов j-го типа в количестве xj единиц (xj – управляемая переменная);
2. Состояние загружаемого самолета Sj на этапе j определяется через ограничение (2) математической модели (1) –(4). В алгоритме прямой прогонки состояния
; 0 ≤ Sj ≤ W; Sn = W
В алгоритме обратной прогонки
3. Цель управления на этапе zj = cjxj.
4. Варианты решения xj этапа j описываются количеством предметов типа j: xj = 0,1,…, [W/wj]– целые.
Решим задачу методом обратной прогонки, загружая предметы с последнего типа (используя калькулятор).
Пусть Fj(Sj) – значение целевой функции (максимальная стоимость предметов, включенных на этапах j, j=1,..,n при заданном состоянии системы Sj
Рекуррентное соотношение для процедур обратной прогонки:
Этап 1.
F3(S3) = max{ c3x3};
x3 = 0,1,..,5;
S3 = 0,1,…,5;
S3 ≥ 1x3.
| S3 | c3x3 | opt | ||||||
| x3=0 | x3=1 | x3=2 | x3=3 | x3=4 | x3=5 | F3*(S3) | x3* | |
| 0 | 0 | – | – | – | – | – | 0 | 0 |
| 1 | 0 | 30 | – | – | – | – | 30 | 1 |
| 2 | 0 | 30 | 60 | – | – | – | 60 | 2 |
| 3 | 0 | 30 | 60 | 90 | – | – | 90 | 3 |
| 4 | 0 | 30 | 60 | 90 | 120 | – | 120 | 4 |
| 5 | 0 | 30 | 60 | 90 | 120 | 150 | 150 | 5 |
Этап 2. F2(S2) = max{c2x2 + F3(S2 – w2x2)}
x2 = 0,1
S2 = 0,1,..,5
S2 ≥ 2x2
S2 | c2x2 + F3(S2 – w2x2) | opt | ||||||||
| x2=0 | x2=1 | F2*(S2) | x2* | |||||||
| 0 | 0 + 0 = 0 | – | 0 | 0 | ||||||
| 1 | 0 +30 = 30 | – | 30 | 0 | ||||||
| 2 | 0 + 60 = 60 | – | 60 | 0 | ||||||
| 3 | 0 + 90 = 90 | 80 + 0 = 80 | 90 | 0 | ||||||
| 4 | 0 + 120 = 120 | 80 + 30 = 110 | 120 | 0 | ||||||
| 5 | 0 + 150 = 150 | 80 + 60 = 140 | 150 | 0 | ||||||
Этап 3. F1(S1) = max{c1x1 + F2(S1 – w1x1)};
x1 = 0,1,2;
S1=5.
| S1 | c1x1 + F2(S1 – w1x1) | opt | |||
| x1=0 | x1=1 | x1=2 | F1*(S1) | x1* | |
| 5 | 0 + 150 = 150 | 65 + 90 = 155 | 130 + 30 +160 | 160 | 2 |
Определение управляемых переменных начинается с последней таблицы (обратный ход):
x1* = 2 → S1 = 2*2 = 4
S2 = 5-4 =1 → x2 = 0 → S3 = 1 – 0 = 1 → x3 = 1
Оптимальное решение X* = (2,0,1)
Пример №2. Имеется склад, на котором присутствует некоторый ассортимент товаров. Запас каждого товара неограничен. У каждого товара своя стоимость Ci и масса mi. Методом динамического программирования сформировать такой набор товаров, чтобы его суммарная масса не превышала заданную грузоподъемность М, и стоимость была бы максимальной.
Пример №3. На станок для обработки в течение цикла V = 4 мин. могут загружаться заготовки трех типов. В таблице1 содержатся исходные данные о суммарной продолжительности обработки заготовок i-го типа и их стоимости pi (i = 1, 2, 3). Ка-кими типами заготовок необходимо загрузить станок, чтобы суммарная стоимость обработанных деталей была максимальна?