Вы находитесь на странице: 1из 4

3.1.1 Задача о ранце ( 2 часа).

В рекурсивном решении задачи о ранце при каждом выборе предмета мы предполагаем,


что можем (рекурсивно) определить оптимальный способ заполнения остающегося
пространства в ранце. Для ранца размера cap, для каждого доступного типа элемента i
определяется общая стоимость элементов, которые можно было бы унести, укладывая i-ый
элемент в ранец при оптимальной упаковке остальных элементов. Этот оптимальный способ
упаковки — просто способ упаковки, определенный (или который будет определен) для
меньшего ранца размера cap-items[i].size. В этом решении используется следующий принцип:
оптимальные принятые решения в дальнейшем не требуют пересмотра. Как только
установлено, как оптимально упаковать ранцы меньших размеров, эти задачи не требуют
повторного исследования независимо от следующих элементов.
Динамическое программирование принципиально исключает все повторные вычисления
в любой рекурсивной программе, при условии, что мы можем себе позволить сохранять
значения функции для аргументов, которые меньше чем интересующий вызов.

Задачу о рюкзаке можно решить несколькими способами:


 Перебирать все подмножества набора из N предметов. Сложность такого решения О(2N).
 Метод динамического программирования. Сложность – O(NW).

Чтобы решить поставленную задачу, требуется на самом деле отдельно просчитать каждый
из возможных вариантов набора предметов, после чего выбрать из всех решенных подзадач
одно оптимальное решение. Часто многие из этих подзадач одинаковы. Подход динамического
программирования состоит в том, чтобы решить каждую подзадачу только один раз, сократив
тем самым количество вычислений. Этого возможно достигнуть запомнив результа-ты решения
тех подзадач, которые могут повторно встретиться в дальнейшем., очевидно, более
предпочтителен.

Для реализации метода динамического программирования построим матрицу A(k, s),


каждый элемент которой есть максимальная стоимость предметов, которые можно уложить в
рюкзак вместимости s, если можно использовать только первые k предметов. Дополним
матрицу нулевыми строкой и столбцом, необходимыми для расчетов:
A(k, 0) = 0 для всех k; A(0, s) = 0 для всех s.
При подсчете элемента матрицы A(k, s) возможны 2 варианта:
 Если предмет k не должен попасть в рюкзак, то A(k, s) равно максимальной стоимости
рюкзака с такой же вместимостью и набором допустимых предметов {n1, n2, …, nk-1} , то
есть A(k, s) = A(k-1, s)
 Если предмет k должен попасть в рюкзак, то A(k, s) равно максимальной стоимости рюкзака,
где вес s уменьшаем на вес k-ого предмета и набор допустимых предметов { n1, n2, …, nk-1}
плюс стоимость k, то есть A(k-1, s-wk) + pk. То есть: A(k, s) = max( A(k-1, s), A(k-1, s-wk) + pk)
Матрица формируется по строкам, начиная с первой. Перебираем для каждого k-го предмета
все возможные вместимости рюкзака от 0 до W. Если текущий предмет вмещается в рюкзак ( то
есть s >= wk ), то выбираем класть его или нет, вычисляя max(A(k-1, s), A(k-1, s-wk)+pk); а иначе,
предмет с номером k не кладем, ограничиваясь предыдущим набором, то есть A[k][s] = A[k-1][s].
Стоимость искомого набора равна A(N, W), то есть последний элемент последней строки,
так как нужно найти максимальную стоимость рюкзака, где все предметы допустимы и
вместимость рюкзака W.
Проиллюстрируем решение задачи о рюкзаке для следующих данных:
W = 13, N = 5. Предметы, которые могут быть погружены в рюкзак, харак-теризуются
весами и стоимостями: w1 = 3, p1 = 1; w2 = 4, p2 = 6; w3 = 5, p3 = 4; w4 = 8,
p4 = 7; w5 = 9, p5 = 6.
Можно спроектировать электронную таблицу, позволяющую определить максимально
возможную стоимость, а затем, и компоненты вектора B, указывающие какие именно предметы
следует включить в набор.
Первый этап. Проектирование таблицы начинаем с формирования массивов весов и
стоимостей предметов. Занесем эти данные в диапазон ячеек С1:G3. Подготовим номера
столбцов матрицы А, соответствующие набираемому весу в диапазоне ячеек В6:О6.
Максимальный столбец имеет номер, равный W, минимальный номер равен нулю, что
соответствует рюкзаку с нулевым максимальным весом. Подготовим номера строк матрицы,
соответствующие номерам включаемых в набор предметов в диапазоне ячеек А7:А12. Сначала
заполним нулевые строку (диапазон ячеек B7:О7) и столбец (диапазон ячеек В7:В12) матрицы
А нулями. В ячейку С8 запишем общую формулу для вычисления каждого из элементов
матрицы:

=ЕСЛИ(C$6>=ГПР($A8;$C$1:$G$3;2);

ЕСЛИ(C7>ИНДЕКС($B7:$O7;;C$6-ГПР($A8;$C$1:$G$3;2)+1)+ГПР($A8;$C$1:$G$3;3);

C7;ИНДЕКС($B7:$O7;;C$6-ГПР($A8;$C$1:$G$3;2)+1)+ГПР($A8;$C$1:$G$3;3));C7)

Формула представляет собой суперпозицию двух функций ЕСЛИ (то есть одна функция
является одним из аргументов другой). Внешняя функция ЕСЛИ анализирует вопрос
вместимости текущего k-го предмета в рюкзак, а внутренняя определяет целесообразность
помещения этого предмета в рюкзак.
Проанализируем аргументы, входящие в эту формулу:
C$6 – это значение вместимости s для текущего вычисляемого A(k, s). Номер строки адреса
ячейки зафиксирован абсолютным, так как при копировании этой формулы в другие ячейки
данные для значений s необходимо выбирать именно из этой строки!
ГПР($A8 ; $C$1:$G$3 ; 2) – это вес wk, значение которого необходимо выбрать из таблицы
данных (второй аргумент стандартной функции горизонтального просмотра ГПР). Имя столбца
первого аргументы функции (количества k рассматриваемых для набора предметов)
зафиксировано абсолютным, так как при копировании этой формулы в другие ячейки данные
для значений k необходимо выбирать именно из этого столбца! Адреса диапазона ячеек
справочной таблицы имеют абсолютный тип также для ссылки на таблицу, размещенную
именно в этом диапазоне из любой ячейки, куда будет скопирована формула. Третий аргумент
функции ГПР, указывающий на номер строки справочной таблицы, где размещено искомое
значение wk , равен 2.
Сравнивая эти два значения в логическом выражении первого аргумента внешней функции
ЕСЛИ, мы фактически решаем вопрос о возможности помещения текущего k-го предмета в
рюкзак вместимости s.
В случае если значение логического выражения равно «ИСТИНА» необходимо выбрать
максимум из значений A(k-1, s) и A(k-1, s-wk)+pk. Их сравнение представлено в логическом
аргументе вложенной функции ЕСЛИ:
C7>ИНДЕКС($B7:$O7;;C$6-ГПР($A8;$C$1:$G$3;2)+1)+ГПР($A8;$C$1:$G$3;3)
Здесь С7 – адрес ячейки, где размещено уже вычисленное значение A(k-1, s). Значение A(k-1,
s-wk) выбираем с помощью стандартной функции ИНДЕКС из предыдущей строки матрицы.
Первый аргумент указывает диапазон ячеек, откуда осуществляется выбор  $B7:$O7. Здесь
имена столбцов также зафиксированы абсолютными для возможности копирования формулы в
другие ячейки. Второй аргумент пропущен ( об этом свидетельствует повторяющийся знак
точки с запятой), так как выбор осуществляется не из матрицы, а из строки данных. Третий
аргумент позволяет вычислить s-wk номер позиции искомого элемента в указанной строке. С$6
– адрес ячейки, где размещено текущее значение s, функция ГПР позволяет отыскать значение
wk в справочной таблице. Учитывая, что номер размещения может начинаться с единицы, а
вычисленная разность может равняться нулю, прибавляем единицу в третьем аргументе
функции ИНДЕКС. Значение pk выбирается из справочной таблицы с помощью стандартной
функции ГПР и прибавляется к найденному значению A(k-1, s-wk).
В случае, если значение логического выражения равно «ЛОЖЬ», то есть рассматриваемый
предмет в рюкзак не вмещается, оставляем A(k, s) (максимальную стоимость предметов,
находящихся в рюкзаке) прежним, то есть A(k-1, s). Поэтому последний, третий аргумент
внешней функции ЕСЛИ позволяет скопировать уже подсчитанное значение из предыдущей
строки таблицы - C7.
Второй и третий аргументы вложенной функции ЕСЛИ равны соответственно A(k-1, s) и
A(k-1, s-wk)+pk. Внешний вид расчетной таблицы приведен на рис. 16. Одним из достоинств
приведенного метода является то, что исходные данные не требуют предварительного
упорядочивания. В этом можно убедиться на рис. 17, где решается та же задача, но исходные
данные упорядочены по другому принципу. Обратите внимание, что алгоритм указывает на те
же самые предметы, но их номера при новой нумерации изменены.
Второй этап. Восстановление набора предметов, из которых состоит максима-льно дорогой
рюкзак выполняется анализом построенной матрицы А. Начиная с последнего элемента
последней строки матрицы A(5, 13), имеющим максималь-ное значение, восстанавливаем ответ.
Будем определять, входит ли очередной предмет в искомый набор, сравнивая последовательно
это значение со значе-ниями этого же столбца, но находящимися выше то есть с A(i-1, w).
Таким образом мы сравниваем с максимальной стоимостью рюкзака с такой же вместимостью и
набором допустимых предметов { n1, n2, …, ni-1}. Заметим, что в случае, если A(i, w) равно A(i-1,
w), предмет с номером i не входит в искомый набор. Найдя первое значение меньшее исходного
и находящееся на строке l, делаем вывод о присутствии l+1-го предмета в оптимальном
рюкзаке. Для определения номера следующего предмета сравниваем A(l+1, w) с максимальной
стоимостью рюкзака с вместимостью на wi меньше и набором допустимых предметов { n1, n2,
…, nl}. Таким образом переходим к столбцу матрицы с номером w  wl+1 и поднимаемся по
этому столбцу вверх от строки l до первого изменения значения в строке с некоторым номером
r. Изменение значения свидетельствует о необходимости включить предмет с номером r+1 в
оптимальный набор. И так далее.

A B C D E F G H I J K L M N O P
1 i 1 2 3 4 5
2 w 8 4 3 5 9
е

3 p 7 6 1 4 6
4 b
5 W 13
6 1 1 1 1
A 0 1 2 3 4 5 6 7 8 9 0 1 2 3
7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8 входит 1 предмет с Стоимос
1 0 0 0 0 0 0 0 0 7 7 7 7 7 7 массой 8 тью 7
9 1 1 входит 2 предмет с Стоимос
2 0 0 0 0 6 6 6 6 7 7 7 7 3 3 массой 4 тью 6
10 1 1
3 0 0 0 1 6 6 6 7 7 7 7 8 3 3
11 1 1 1 1 1
4 0 0 0 1 6 6 6 7 7 0 0 0 3 3
12 1 1 1 1 1
5 0 0 0 1 6 6 6 7 7 0 0 0 3 3
это те же
предметы!

Вам также может понравиться