Курсовая работа: Методы решения задачи о рюкзаке
В случае применения жадного алгоритма поступаем так: сортируем предметы по убыванию стоимости единицы каждого. , где Pi - относительная стоимость единицы предмета i, Wi - вес предмета i, Vi - стоимость предмета i. Всего N предметов. Пытаемся поместить в рюкзак все что помещается, и одновременно наиболее дорогое по параметру P. Оценим сложность метода. Для сортировки нам потребуется плюс проход по N предметам в цикле. Итого что в общем случае равно . Скорость работы относительно других алгоритмов высока, но если посмотреть более внимательно, видно, что точное решение мы получим не всегда. Обратим внимание на следующую таблицу Таб1.1.
Номер предмета (i) | Вес предмета (кг) | Цена (У.е) | Относительная цена (У.е/кг) |
1 | 10 | 60 | 6 |
2 | 20 | 100 | 5 |
3 | 30 | 120 | 4 |
Как видно предметы уже отсортированы. Пусть в рюкзак помещается 50кг, следуя алгоритму, берем первый предмет, затем второй, третий предмет уже не помещается. Таким образом, в рюкзаке у нас 30кг стоимостью 160у.е, оставшееся место 20кг. Но если бы мы взяли второй и третий предметы, общий вес поместился в рюкзак, и стоимость его была бы 220у.е. Жадный алгоритм не дает оптимального решения, поэтому он является приближенным алгоритмом.[7] Оказывается качество решения можно улучшить, если сравнить полученный результат с максимальным коэффициентом Vmax ; . Предполагается, что все предметы не превосходят размера рюкзака, в противном случае их можно просто исключить из рассмотрения.[3]
Рассмотрим непрерывную задачу о ранце, условия для нее те же самые, отличие лишь в том, что мы можем взять часть предмета. То есть предметы можно делить. Пусть у нас есть тот же набор что и в таб. 1.1, тогда следуя жадному алгоритму, берем первый и второй предметы, полностью третий предмет не помещается т.к места осталось всего на 20кг, но мы можем брать части предметов, тогда возьмем веса третьего предмета, соответственно и его стоимости, таким образом мы нагрузили рюкзак полностью, стоимость груза стала равна 240у.е. Для непрерывной задачи о рюкзаке жадный алгоритм будет давать оптимальное решение.[7]
{обнуляем список взятых предметов} fillchar (Take, sizeof(Take), False);
i:= 0; {пока текущий вес набора + следующий предмет, который будет взят меньше предела вместимости}
While NowWeight+W[i+1] < MaxWeight do begin
inc (i);
{увеличиваем сумму цен на цену текущего предмета}
BestPrice:= BestPrice + P[i];
{увеличиваем сумму весов на вес тек. предмета}
NowWeight:= NowWeight + W[i];
{записываем что взяли этот предмет}
Take[i]:= true;
end ;
2.6 Сравнительный анализ методов
Минусы Полного перебора
· Входные данные не велики, для N=7 программа укладывается в 1с. Уже для N=10 требуется примерно 40с.
· Временная сложность O(N!)
Плюсы Полного перебора
· Полный перебор дает точное решение.
· Простота реализации
Минусы Метода ветвей и границ
· В худшем случае работает как полный перебор.
Плюсы Метода ветвей и границ
· Возможно значительное сокращение времени работы.
· Простота реализации.
Минусы Жадного алгоритма
· Всегда можно предоставить такой набор, при котором решение будет не точным.
Плюсы Жадного алгоритма
· Высокое время работы, ограниченное только скоростью сортировки, в среднем O(NlogN).