Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
82
Добавлен:
12.02.2015
Размер:
550.4 Кб
Скачать

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

Рассмотрим некоторое множество предметов 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.

Соседние файлы в папке Лекции