Содержательно задача означает выбор предметов с наибольшей суммарной стоимостью, умещающихся в рюк-
зак заданного размера. Эта задача часто возникает при выборе оптимального управления в различных экономико-
финансовых областях (распределение бюджета отдела по проектам и т.п.).
Рассмотрим, какого результата можно добиться, используя, как в разделе 2.1.1, «жадный подход».
Первая идея, которая обычно возникает при знакомстве с этой задачей, это выбирать предметы по убыванию их
относительной стоимости, помещая в рюкзак все, что помещается, или, более формально:
1. Упорядочим по убыванию элементы массива
c
1
a
1
,
c
2
a
2
, . . . ,
c
n
a
n
.
2. В соответствии с этим упорядочиванием полагаем переменные x
i
равными 1, если установка x
i
= 1 не приводит
к нарушению ограничения
P
n
i=1
a
i
x
i
≤ B.
К сожалению, о качестве такой эвристики ничего утверждать нельзя — для любого числа k, можно представить
входной набор данных, для которых алгоритм выберет набор хуже в k раз оптимального набора. Понятно, что пробле-
ма состоит в том, что «польстившись» на первый небольшой, но «относительно дорогой» предмет, алгоритм рискует
пропустить большой и ценный предмет из оптимального набора.
Оказывается, гарантированное качество работы этой эвристики можно улучшить, если, после окончания ее работы,
сравнить стоимость полученного допустимого решения с максимальным коэффициентом c
max
, и в соответствии с мак-
симумом, выбрать либо «жадное решение», или один предмет с максимальной стоимостью (мы считаем, что размеры
всех предметов не превосходят размер рюкзака — в противном случае их просто можно исключить из рассмотрения).
Получится так называемый модифицированный жадный алгоритм, (см. алгоритм 19 «Рюкзак-Жадный»), дающий
приближенное допустимое решение, которое мы обозначим через x
G
, а значение целевой функции для него — через
f
G
. Нетрудно доказать, что выполнены следующие неравенства:
Упражнение 43 Для значения решения f
G
полученного модифицированным жадным алгоритмом 19 «Рюк-
зак-Жадный» для задачи о рюкзаке, и оптимального значения f
∗
выполняется
f
∗
/2 ≤ f
G
≤ f
∗
. (2.5)
2.1.4 Алгоритм Кристофидеса для метрической задачи коммивояжера
Напомним некоторые определения.
Определение 46 Эйлеровым путем в графе называется произвольный путь, проходящий через каждое реб-
ро графа в точности один раз.
Определение 47 Замкнутый эйлеров путь называется эйлеровым обходом или эйлеровым циклом.
Определение 48 Эйлеров граф — граф, в котором существует эйлеров обход.
Приведем критерий эйлеровости графа.
Теорема 20 Эйлеров обход в графе существует тогда и только тогда, когда граф связный и все его вершины
четной степени.
Доказательство Доказательство достаточности условия теоремы будет следствием анализа алгоритма нахождения
эйлерова пути (алгоритм 20 «Цикл Эйлера»).
Необходимость условия очевидна, так как если некоторая вершина v появляется в эйлеровом обходе k раз, то это
означает, что степень этой вершины в графе составляет 2k. 2
Нахождение эйлерова цикла можно выполнить эффективно, с помощью алгоритма 20 «Цикл Эйлера», основная
идея которого содержится в построении произвольных замкнутых циклов (если вы окажетесь в эйлеровом графе, и
будете идти произвольно по его ребрам, сжигая их после своего прохода, то рано или поздно вы вернетесь в точку
старта), и обьединении таких циклов в единый эйлеров цикл.
Лемма 20 Сложность алгоритма 20 «Цикл Эйлера» есть O(|E|).
Доказательство Сумма времени выполнения всех вызовов процедуры «euler» будет O(|E|), т.к. каждое обработан-
ное ребро удаляется из графа. Объединение циклов в данной реализации квадратично, но можно также реализовать
за O(|E|), если дополнительно поддерживать хэш-таблицу, указывающую на вершины, к которым можно присоединять
дополнительные циклы. 2
73