Subset-Sum Problem
Polynomial-time approximation algorithm

PROBLEM
In the subset-sum problem we wish to find a subset of A.1,...,A.N whose sum is as large as possible but not larger than T (capacity of the knapsack).

ALGORITHM
This algorithms is evolved from Exponential-time exact algorithm. We use a trimming parametr Delta such that 0<Delta<1. To "trim" a list L. by Delta means to remove as many elements from L. as possible, in such a way that for every element Y that was removed from L. there is an element Z<=Y in L. such that (Y-Z)/Y<=Delta. The element Z is representing Y in the new list. Cormen, Leiserson and Rivest credit O. H. Ibarra and Ch. E. Kim with inventing the APPROX_SUBSET_SUM function.

IMPLEMENTATION
Unit: internal function

Global variables: array A.1,...,A.N of integers, array A. is not changed

Parameters: a positive integer N, a positive integer T, a real Epsilon (0<Epsilon<1)

Returns: good approximation of largest sum of subset <=T, for any instance of the Subset-sum problem (O-GA)/O<=Epsilon, where O is the optimal solution value and GA the value returned of APPROX_SUBSET_SUM

 APPROX_SUBSET_SUM: procedure expose A. parse arg N, T, Epsilon L.1 = 0; P = 1; Sentinel = 1E+100 do I = 1 to N while A.I <= T   do J = 1 to P     LP.J = L.J + A.I     if LP.J > T then leave J   end   R = J - 1; K = 1; L = 1   Pp1 = P + 1   L.Pp1 = Sentinel   LP.J = Sentinel   do M = 1 to P + R     if L.K < LP.L       then do; M.M = L.K; K = K + 1; end       else do; M.M = LP.L; L = L + 1; end   end   do J = 1 to P + R; L.J = M.J; end   P = TRIM(P + R, Epsilon / N) end return L.P   TRIM: procedure expose M. L. parse arg M, Delta L.1 = M.1; Last = M.1; P = 1 do I = 2 to M   if Last < (1 - Delta) * M.I     then do       P = P + 1; L.P = M.I; Last = M.I     end   end return P

COMPARISON
For N=100;T=25557 and the array A. created by statements:

 Seed = RANDOM(1, 1, 481989) do J = 1 to N  A.J = RANDOM(1, 1000)end

I compared the algorithms for solution of the Subset-sum problem and my algorithm DIOPHANT for solution of the diophantine equations.

Notes:
I halted the EXACT_SUBSET_SUM after 30 minutes of computations. For APPROX_SUBSET_SUM I used the value Epsilon=0.5

Subset-sum problem - Comparison of Algorithms
Algorithm Subset sum Seconds
GS 25554      0.05
DPS 25557   240.24
APPROX_SUBSET_SUM 25436    12.31
DIOPHANT 25557      0.82

CONNECTIONS

Literature
Cormen T. H., Leiserson Ch. E., Rivest R. L. Introduction to Algorithms
The MIT Press, Cambridge, 1990