
Задача о рюкзаке
Рассмотрим некоторое множество предметов m видов, причем предметов каждого вида имеется неограниченное количество.
Вес одного предмета i –го вида равен qi, а стоимость - сi.
Эти величины сведены в таблицу
q1 |
q2 |
… |
qm |
с1 |
c2 |
… |
cm |
Имеется также рюкзак, который может вместить предметы общим весом не более Q.
Задача состоит в том, чтобы забить рюкзак предметами так, чтобы их общая стоимость была максимальна.
К этой задаче сводится большое число практических задач, например задача об оптимальном раскрое материала.
Чтобы
формализовать нашу задачу, введем вектор
,i
–я координата
которого равна числу предметов i
–го вида,
положенных в рюкзак.
Тогда мы получаем следующую формулировку оптимизационной задачи.
.
Необходимо найти
такой вектор
с целочисленными координатами, чтобы
выполнялось ограничение
,
(1)
а целевая функция
достигала максимума:
.
(2)
Проблемы при решении задачи:
как свести задачу к временной, то есть как ввести такты и представить ситуацию к тактируемому процессу;
что считать состояниями системы.
При применении принципа оптимальности конкретной задачи почти всегда основная проблема состоит в определении, что является тактом или шагом, как формализовать состояние системы, что из себя представляет управление. Поэтому применение динамического программирования всегда предусматривает творческую составляющую .
В задаче о рюкзаке в качестве состояния системы и одновременно «такта» выбран объем части рюкзака, оставшейся после предыдущей части процесса его заполнения. Эти «такты» отсчитывается от конца процесса. Номер такта обозначим через z, он будет меняться от 0 (когда рюкзак уже заполнен) до Q (когда рюкзак еще пуст).
Допустим, что мы уже заполнили часть рюкзака и оставшийся еще свободный объем равен z. Нетрудно видеть, что перед нами вновь стоит первоначальная задача оптимального в смысле (1), (2), в данном случае вместо Q должна фигурировать величина z.
Обозначим в связи
с этим наибольшее значение стоимости
содержимого рюкзака объемом z
через f(z).
Ясно, что в
конечном итоге нас интересует величина
f(Q).
Кроме того
очевидно, что f(0)=0.
Более того
для любогоz
, которое меньше минимального из qi.
Допустим, что мы уже знаем величину f(х) для любого х<. z.
Тогда для f(z)можно записать следующее равенство
.(3)
Очевидно, что эта
формула является частным случаем формулы
(**), выражающей принцип оптимальности.
Здесь, как и говорилось ранее величина
z
является
аналогом как номера такта, так и текущего
состояния S,
а величина есть
аналог состояния, которое наступает
после вложения в рюкзак в состоянии z
предмета i
–го вида.
Использую эту
формулу, мы строим следующий алгоритм
решения задачи. Начиная с z=0
для каждого целого z
мы должны перебирать всевозможные
предметы из заданного набора и выбирать
тот из них, для которого сумма, стоящая
в скобках максимальна. При этом,
естественно, для данного z
мы должны уже иметь значения функций
для
всехi.
Пример
Имеем конкретную таблицу данных для четырех предметов
i |
1 |
2 |
3 |
4 |
qi |
7 |
10 |
12 |
16 |
ci |
11 |
15 |
21 |
26 |
Пусть Q=22.
Перебираем z от 1 до 22.
По предыдущему
Поэтому работать по формуле (3) имеет смысл только начиная с z=7.
Для z=7 производим перебор по i=1,2,3,4:
Очевидно, максимум , равный 11, достигается при i=1 .
Это значит , что
.
Занесем этот результат в таблицу (см.
ниже).
Аналогичный результат получаем при z=8 и z= 9.
При z=10 получаем
Здесь максимум,
равный 15, достигается при i=2
Это значит , что
.
Тот же результат имеем и при z=11 (см. таблицу ).
Далее отображаем
процесс работы по формуле (3) только в
том случае, если изменяется значение
.
Имеем
при z=12
Получаем максимум при i=2 равный 21.
при z=14
Получаем максимум при i=1, равный 22.
Наконец, при z=16
Получаем максимум при i=4, равный 26
Продолжая подобные расчеты до z=22, мы окончательно сформируем таблицу.
Z |
0 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
F(z) |
0 |
0 |
11 |
11 |
11 |
15 |
15 |
21 |
21 |
22 |
22 |
26 |
26 |
26 |
26 |
32 |
32 |
35 |
i0 |
- |
- |
1 |
1 |
1 |
2 |
2 |
3 |
3 |
1 |
1 |
4 |
4 |
4 |
3 |
3 |
1 |
3 |
Таким образом, максимальная стоимость содержимого рюкзака объемом 22 равна 35 ед. стоимости. Но как по таблице определить, какие и в каком количестве предметы надо положить в рюкзак, чтобы получить этот максимум?
Результат считываем с конца. Ясно, что если мы имеем рюкзак объемом 22, то последним следует класть предмет №3. Выделим в таблице жирным шрифтом элементы соответствующего столбца. При этом мы, положив в рюкзак третий предмет, займем объем, равный q3 = 12. В результате у нас останется свободным объем величины 10.
Перейдем в столбец, соответствующий z=10. Вновь выделим в таблице жирным шрифтом элементы соответствующего столбца. При этом мы должны положить в рюкзак второй предмет и займем объем, равный q2 = 10, исчерпав весь оставшийся объем.
Итак, подсчитав в
третьей строке таблицы, сколько раз в
ней встречается выделенные жирным
шрифтом каждый из номеров 1,2,3,4, получим
искомый оптимальный вектор управления
Очевидно, это
.
При этом оптимальное значение целевой функции равно 35.