O Rjukzake
O Rjukzake
Введение
Глава 1 Задача о загрузке, рюкзаке, ранце. Постановка и NP-полнота задачи
1.1 Постановка задачи о рюкзаке
1.2 NP – полнота задачи
Глава 2 Методы решения задачи о рюкзаке
2.1 Классификация методов
2.2 Динамическое программирование
2.3 Полный перебор
2.4 Метод ветвей и границ
2.5 Жадный алгоритм
2.6 Сравнительный анализ методов
2.7 Модификации задачи
Заключение
Литература
Приложение 1
Приложение 2
Приложение 3
Приложение 4
Введение
Рис 1.1
-
Рис 1.2
Рис 1.3
Динамическое программирование для задачи о рюкзаке дает точное
решение, причем одновременно вычисляются решения для всех размеров
рюкзака от 1 до MaxW, но какой ценой? Для хранения таблицы стоимости и
запоминания того, брался каждый предмет или нет, требуется порядка
O(N*MaxW) памяти, временная сложность равна O(N*MaxW) ;
Опишем основную логику решения: {Загружаем рюкзак если его
вместимость = Weight} for Weight:=1 to MaxW do begin
for i:=1 to N do {берем предметы с 1 по N}
{если вес предмета больше Weight}
{или предыдущий набор лучше выбираемого}
if (W[i]>Weight) or (Value[Weight, i-1] >=
Value[Weight-W[i], i-1]+P[i]) then begin
{Тогда берем предыдущий набор}
Value[Weight, i]:=Value[Weight, i-1];
{говорим что вещь i не взята}
Take [Weight, i]:= false;
End
{иначе добавляем к предыдущему набору текущий
предмет}
Else begin
Value [Weight, i]:=Value [Weight - W[i], i-1]
+P[i];
{говорим что вещь i взята}
Take [Weight, i]:= true;
End;
End;
Как было сказано ранее, алгоритм динамического программирования
для ‗рюкзака‘ дает точное решение путем использования дополнительной
памяти O(N*MaxW), временная сложность алгоритма так же будет порядка
O(N*MaxW).
2.3 Полный перебор
Рис 1.6
2.5 Жадный алгоритм
Номер предмета (i) Вес предмета (кг) Цена (У.е) Относительная цена (У.е/кг)
1 10 60 6
2 20 100 5
3 30 120 4
Диаграмма 1