alpar@9: /* TODD, a class of hard instances of zero-one knapsack problems */ alpar@9: alpar@9: /* Written in GNU MathProg by Andrew Makhorin */ alpar@9: alpar@9: /* Chvatal describes a class of instances of zero-one knapsack problems alpar@9: due to Todd. He shows that a wide class of algorithms - including all alpar@9: based on branch and bound or dynamic programming - find it difficult alpar@9: to solve problems in the Todd class. More exactly, the time required alpar@9: by these algorithms to solve instances of problems that belong to the alpar@9: Todd class grows as an exponential function of the problem size. alpar@9: alpar@9: Reference: alpar@9: Chvatal V. (1980), Hard knapsack problems, Op. Res. 28, 1402-1411. */ alpar@9: alpar@9: param n > 0 integer; alpar@9: alpar@9: param log2_n := log(n) / log(2); alpar@9: alpar@9: param k := floor(log2_n); alpar@9: alpar@9: param a{j in 1..n} := 2 ** (k + n + 1) + 2 ** (k + n + 1 - j) + 1; alpar@9: alpar@9: param b := 0.5 * floor(sum{j in 1..n} a[j]); alpar@9: alpar@9: var x{1..n} binary; alpar@9: alpar@9: maximize obj: sum{j in 1..n} a[j] * x[j]; alpar@9: alpar@9: s.t. cap: sum{j in 1..n} a[j] * x[j] <= b; alpar@9: alpar@9: data; alpar@9: alpar@9: param n := 15; alpar@9: /* change this parameter to choose a particular instance */ alpar@9: alpar@9: end;