2.2. Аппроксимация с заданной точностью 111
Алгоритм 27. PTAS для рюкзака
def KnapsackFPTAS (D, B, epsilon, LowerBound):
Вычисляем нижнюю оценку стоимости
F_lb ← LowerBound (copy (D), B)
параметр округления scale
scale ← epsilon ∗ F_lb/len (D)/(1 + epsilon)
Набор c округленными стоимостями
Ds ← [(int (floor (c/scale)), a) for c, a ∈ D]
knapset ← KnapsackDynpLightest (Ds, B)
ApproxCost ← 0
for i ∈ knapset :
ApproxCost ← ApproxCost + D[i][0]
D = [(134, 16), (789, 250), (56, 43), (345, 333), (4567, 857), (555, 47)]
B = 1000
Optimal Knapsack: [0, 2, 4, 5] costs 5312
LowerBound= <function MaxItemCost at 0x00AA8470> => F_lb= 4567
eps = 0.1 => scale = 69.196969697
Ds = [(1, 16), (11, 250), (0, 43), (4, 333), (66, 857), (8, 47)]
Approx. knapsack: [0, 4, 5] costs 5256
LowerBound= <function KnapsackGreedy at 0x00AA83F0> => F_lb= 5312
eps = 0.1 => scale = 80.4848484848
Ds = [(1, 16), (9, 250), (0, 43), (4, 333), (56, 857), (6, 47)]
Approx. knapsack: [0, 4, 5] costs 5256
LowerBound= <function KnapsackGreedy at 0x00AA83F0> => F_lb= 5312
eps = 0.06 => scale = 50.1132075472
Ds = [(2, 16), (15, 250), (1, 43), (6, 333), (91, 857), (11, 47)]
Approx. knapsack: [0, 2, 4, 5] costs 5312