Задача о рюкзаке (Knapsack problem) — это одна из классических задач комбинаторной оптимизации. Суть задачи заключается в выборе предметов для помещения в рюкзак с ограниченной вместимостью таким образом, чтобы максимизировать общую ценность выбранных предметов.
Найти такой набор предметов, который:
Максимизировать:
где xi — бинарная переменная:
Наиболее эффективный способ решения задачи о рюкзаке — использование динамического программирования.
Алгоритм работает за время O(nC), где:
Псевдокод решения:
function knapsack(values, weights, n, C):
create array M[n+1][C+1]
for i from 0 to n:
M[i][0] = 0
for j from 0 to C:
M[0][j] = 0
for i from 1 to n:
for j from 1 to C:
if weights[i] <= j:
M[i][j] = max(M[i-1][j], values[i] + M[i-1][j-weights[i]])
else:
M[i][j] = M[i-1][j]
return M[n][C]
Проверяем все возможные комбинации предметов и выбираем наилучшую.
Даны предметы:
Комбинации с одним предметом:
Комбинации с двумя предметами:
Комбинация с тремя предметами:
Максимальная ценность = 80 (комбинация {1,3})
Алгоритм основан на последовательном выборе предметов по убыванию ценности на единицу веса.
Используем те же предметы:
Общая ценность = 70
Вес = 5 кг
руководство по написанию программы для задачи о рюкзаке в Scilab
| Комбинация | Вес | Ценность | Допустимость |
|---|---|---|---|
| 000 | 0 | 0 | Допустима |
| 001 | 5 | 50 | Допустима |
| 010 | 3 | 40 | Допустима |
| 011 | 8 | 90 | Недопустима |
| 100 | 2 | 30 | Допустима |
| 101 | 7 | 80 | Недопустима |
| 110 | 5 | 70 | Допустима |
| 111 | 10 | 120 | Недопустима |
Лучшая комбинация: 110
Максимальная ценность: 70
Общий вес: 5 кг
Комбинация 110 означает, что мы берем:
Код сохраняет только лучшую найденную комбинацию, сравнивая каждую новую допустимую комбинацию с текущей максимальной ценностью.
Метод полного перебора позволяет найти оптимальное решение задачи о рюкзаке путем проверки всех возможных комбинаций. Оптимизированный код делает этот процесс более эффективным, автоматически находя наилучшее решение.
| Вариант | Тип транспорта | Вместимость | Груз 1 | Груз 2 | Груз 3 | Груз 4 | Груз 5 | Груз 6 |
|---|---|---|---|---|---|---|---|---|
| 1 | Автовоз | 4500 кг | 1250 кг (23000 руб) | 1400 кг (30500 руб) | 875 кг (19000 руб) | 990 кг (22500 руб) | 750 кг (17500 руб) | 400 кг (7500 руб) |
| 2 | Платформа для негабаритных грузов | 75 т | 22 т (600000 руб) | 21 т (840000 руб) | 15.5 т (540000 руб) | 15.0 т (450000 руб) | 8.9 т (240000 руб) | 11.3 т (330000 руб) |
| 3 | Рефрижератор | 21 т | 8.5 т (225000 руб) | 8.9 т (255000 руб) | 6.6 т (186000 руб) | 5.5 т (159000 руб) | 2.7 т (75000 руб) | 3.9 т (105000 руб) |
| 4 | Микроавтобус | 800 кг | 258 кг (5000 руб) | 310 кг (6000 руб) | 240 кг (4000 руб) | 160 кг (3000 руб) | 100 кг (2000 руб) | 59 кг (1000 руб) |
| 5 | Грузовой вертолет | 55 т | 23 т (750000 руб) | 21 т (660000 руб) | 18.8 т (540000 руб) | 11 т (300000 руб) | 6.3 т (180000 руб) | 3.9 т (120000 руб) |
| 6 | Сухогруз | 2100 т | 650 т (1800000 руб) | 590 т (1650000 руб) | 435 т (1350000 руб) | 450 т (1150000 руб) | 305 т (900000 руб) | 285 т (750000 руб) |
| 7 | Изотермический вагон | 53 т | 12.8 т (360000 руб) | 15.4 т (450000 руб) | 10.2 т (300000 руб) | 7.6 т (240000 руб) | 7.9 т (210000 руб) | 3.5 т (95000 руб) |
| 8 | Контейнеровоз | 38 т | 12 т (300000 руб) | 19 т (270000 руб) | 10.8 т (240000 руб) | 8.7 т (210000 руб) | 3.4 т (120000 руб) | 2.2 т (60000 руб) |
| 9 | Трамвай грузовой | 1290 кг | 380 кг (7000 руб) | 435 кг (8000 руб) | 365 кг (6000 руб) | 175 кг (5000 руб) | 190 кг (3000 руб) | 65 кг (1000 руб) |
| 10 | Мультимодальный модуль | 26.5 т | 8.4 т (240000 руб) | 7.9 т (235000 руб) | 6.2 т (180000 руб) | 4.5 т (150000 руб) | 1.6 т (32000 руб) | 0.7 т (15000 руб) |