Определитель матрицы ▦ Производная функции dydx График 3D Упростить выражение Графический метод решения задач нелинейного программирования ⇲ …
Примеры решений Задача Джонсона Симплекс метод Метод прогонки Задача замены оборудования Задача распределения инвестиций Параметры сетевой модели Задача коммивояжера Многоканальные СМО

Задача о рюкзаке


Назначение. Онлайн-калькулятор предназначен для решения задачи о ранце методами динамического программирования (прямой и обратной прогонки). см. пример решения.
Количество предметов
Тип задач
Здесь будет отображаться решение.
Инструкция. Выберите количество предметов для загрузки, нажмите Далее.

Задача о ранце

Имеются 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} рассмотрим вспомогательную задачу о рюкзаке
оптимальное значение целевой функции которой обозначим fk(y). Заметим, что fn(b) равно искомому оптимальному значению целевой функции исходной задачи (81). Ниже мы получим рекуррентные соотношения, вы­ражающие значение функции fk(y) через ее значения при меньших k и y. На основе этих соотношений можно организовать процесс, позволяющий для всех k и y найти fk(y), в том числе fn(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].
Подводя итог вышесказанному, можно сделать вывод, что
Упростим рекуррентное соотношение (107). Для этого вначале вместо y в него подставим 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(L) = max[3x2 + f1(L - 2x2)]; 0 < x2 < 3; x2 = 0,1,2,3.
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(L) = max[2x3 + f2(L - 3x3)]; 0 < x3 < 3; x3 = 0,1,2,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(L) = max[4x4 + f3(L - 1x4)]; 0 < x4 < 1; x4 = 0,1.
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(L) = max[1x5 + f4(L - 1x5)]; 0 < x5 < 2; x5 = 0,1,2.
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
II этап. Безусловная оптимизация.
Таким образом, максимальный вес рюкзака 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:

Оптимальное значение целевой функции ЗЦЛП равно f3(13) = 34. По формулам (109) вычислим:
Для восстановления компонент решения в таблице I найдем
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.
Математически формализовать данную экстремальную задачу можно следующим образом:
max ϕ ( x ) = max ∑ i = 1 n x i P i – стоимость груза (1)
при ограничениях:
∑ i = 1 n x i W i ≤ L
xi =0,1,... (т.е. предметы груза неделимы).
Решение задачи разбивается на 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
f2(L) = max [ x2.20 + f1(L-x2. 3)]; 0<x2< [10/3]; x2 =0, 1, 2,3.
Таблица 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
f3(L) = max [ x3.13 + f2(L-x3. 2)]; 0<x3< [10/2]; x3 =0, 1, 2,3,4,5.
Таблица 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
Таким образом, максимальная стоимость груза f4(10) равна 69 денежным единицам, при этом предметы четвертого типа загружать не следует, так как f4(10) = 69 достигается при х4=0 (см. таблицу 10).
Предметы остальных типов распределяются следующим образом:
х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-го типа, загружаемых в самолет. Тогда математическая модель имеет вид:
(1)
(2)
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
Значение условного оптимума F3(S3) берется из предыдущей таблицы.
Этап 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). Ка-кими типами заготовок необходимо загрузить станок, чтобы суммарная стоимость обработанных деталей была максимальна?