Задача о рюкзаке (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 |
|---|---|---|---|---|---|---|
| 1 | Грузовой автомобиль | 4500 кг | 800 кг (17000 руб) | 1200 кг (23000 руб) | 650 кг (14000 руб) | 950 кг (16000 руб) |
| 2 | Железнодорожный вагон | 65 т | 11 т (350000 руб) | 23 т (420000 руб) | 18 т (535000 руб) | 12 т (460000 руб) |
| 3 | Морской контейнер | 28 т | 7.4 т (245000 руб) | 9.2 т (267000 руб) | 6.2 т (28000 руб) | 4.5 т (114000 руб) |
| 4 | Небольшой грузовик | 1200 кг | 300 кг (9000 руб) | 480 кг (13500 руб) | 280 кг (8400 руб) | 320 кг (9600 руб) |
| 5 | Самолет | 95 т | 25 т (780000 руб) | 32 т (950000 руб) | 18 т (555000 руб) | 20 т (585000 руб) |
| 6 | Речная баржа | 150 т | 49 т (1530000 руб) | 55 т (1560000 руб) | 30 т (905000 руб) | 20 т (645000 руб) |
| 7 | Городской фургон | 875 кг | 200 кг (6300 руб) | 250 кг (7100 руб) | 180 кг (5600 руб) | 220 кг (6550 руб) |
| 8 | Автоконтейнер | 24 т | 6.5 т (185000 руб) | 7.2 т (312000 руб) | 5.8 т (164000 руб) | 2.5 т (78000 руб) |
| 9 | Железнодорожный контейнер | 43 т | 12 т (320000 руб) | 15 т (430000 руб) | 10 т (280000 руб) | 8 т (250000 руб) |
| 10 | Морской сухогруз | 4800 т | 1500 т (4600000 руб) | 1800 т (5750000 руб) | 1200 т (3250000 руб) | 500 т (1450000 руб) |