Определение 54 Полностью полиномиальной аппроксимационной схемой называется приближенный алго-
ритм, в котором уровень точности ε выступает в качестве нового параметра, и алгоритм находит ε-оптимальное
решение за время, ограниченное полиномом от длины входа и величины ε
−1
.
Только одно обстоятельство является препятствием для построения полностью полиномиальной аппроксимацион-
ной схемы для задачи 0-1 РЮКЗАК методом динамического программирования. Это наличие «больших» коэффици-
ентов в целевой функции.
Действительно, как мы видели выше, динамическое программирование дает точный псевдополиномиальный алго-
ритм для задачи о рюкзаке со сложностью O(nf
∗
) или O(nB). Если величины f
∗
и B не ограничена сверху никаким
полиномом (то есть имеются большие коэффициенты), то этот псевдополиномиальный алгоритм не является полино-
миальным.
Однако, к счастью, существует общий метод (который условно можно назвать масштабированием), позволяю-
щий перейти к задаче с небольшими коэффициентами в целевой функции, оптимум которой не сильно отличается от
оптимума исходной задачи.
Зададимся вопросом: что произойдет, если мы отмасштабируем коэффициенты c
1
, . . . , c
n
, поделив их нацело (с
остатком) на некоторый параметр scale, решив «отмасштабированную» задачу, и затем снова умножив коэффициенты
на параметр scale? Каково будет изменение значения целевой функции после этой операции?
Более формально, положим c
0
i
= bc
i
/scalec, ˜c
i
= c
0
i
· scale и обозначим оптимум «отмасштабированной» задачи (с
c
0
i
) через f
0
, а оптимум задачи с коэффициентами ˜c
i
через
˜
f.
Ясно, что любое допустимое решение «отмасштабированной» задачи является также допустимым решением ис-
ходной задачи. Кроме того, абсолютная погрешность не превосходит величины n · scale. Если потребовать, чтобы эта
величина не превосходила
ε
1+ε
f
∗
, то по определению получим, что каждое допустимое решение исходной задачи отли-
чается от решения «отмасштабированной» задачи не более, чем на эту же величину.
Обозначая оптимум «отмасштабированной» задачи через
˜
f, получаем, что
˜
f ≥ f
∗
−
ε
1 + ε
f
∗
=
f
∗
(1 + ε)
,
т.е. оптимум «отмасштабированной» задачи отличается от оптимума исходной задачи не более, чем в 1 + ε раз.
При этом величина значение оптимального решения для «отмасштабированной» задачи уменьшается не менее, чем
в scale раз по сравнению с исходной. И таким образом, для отмасштабированной задачи, версия алгоритма 24 «Рюк-
зак-ДинПрог», ориентированная на отбор «самых легких решений» будет работать существенно меньшее время.
Однако проблема состоит в том, что в момент масштабирования мы не знаем величины оптимума f
∗
, и не можем
выбрать коэффициент scale, который, чтобы решение было ε-оптимальным, не должен превышать
εf
∗
n(1+ε)
, с одной
стороны, с другой — желательно максимально приблизить его к этой оценке, чтобы уменьшить коэффициенты в задаче.
Поэтому, важное наблюдение состоит в том, что вместо f
∗
можно рассматривать нижнюю оценку f
∗
, и, обозначив
ее f
lb
, выбирать параметр масштабирования
scale = max{1, b
εf
lb
n(1 + ε)
c}.
Тогда все вышеизложенные соображения о точности «отмасштабированного» решения сохранят силу. Таким образом,
стоит задача выбора нижней оценки f
lb
, которую можно найти быстро с одной стороны, и желательно чтобы она была
как можно ближе к f
∗
, т.к. это даст возможность увеличить коэффициент scale, и тем самым, сильнее уменьшить
коэффициенты c
1
, . . . , c
n
и время выполнения алгоритма. Таким образом, общая схема алгоритма, представлена как
процедура «knapsack_ptas_generic», в алгоритме 26 «Рюкзак-PTAS-общая схема», которой на вход, кроме обычных
параметров рюкзака, передают функцию «f_lower_bound», используемую для получения нижней оценки стоимости
решения.
Осталось найти такую функцию. Например, можно рассмотреть тривиальную аппроксимацию
nc
max
≥ f
∗
≥ f
lb
≡ c
max
,
где c
max
= max
i
c
i
.
Получим функцию «knapsack_ptas_trivial» в алгоритме 27 «Рюкзак-PTAS».
Сложность этого алгоритма — O(nf
0
) (см. анализ алгоритма 24 «Рюкзак-ДинПрог»).
Учитывая, что f
∗
≤ nc
max
, а
˜
f ≤ nb
c
max
scale
c, получаем оценку сложности алгоритма «knapsack_ptas_trivial»:
O(n
˜
f) = O
n
2
c
max
scale
= O
n
3
(1 + ε)
ε
= O
n
3
ε
.
Можно ли улучшить эту оценку? Ответ на этот вопрос положителен. Для этого рассмотрим менее наивную ап-
проксимацию величины f
∗
. Вспомним алгоритм 19 «Рюкзак-Жадный» из раздела 2.1.3. Для значения решения f
G
84