diff --git a/algo/opt_int_prog.sage b/algo/opt_int_prog.sage new file mode 100755 index 0000000000000000000000000000000000000000..fb0cdeef29ca6371d31c92b65aa1b112d5e994b2 --- /dev/null +++ b/algo/opt_int_prog.sage @@ -0,0 +1,26 @@ +#!/usr/bin/env sage +import sys +sys.argv[0] = sys.argv[0][:-3] + +import lib +import numpy as np + +lib.VERSION = int(2) + +@lib.prog +def opt_int_prog(n, inp, args): + other = lib.gen_arr_other_car_of_type(n, inp) + sgn = [1 if other[i]>i else -1 for i in range(2*n)] + p = MixedIntegerLinearProgram(maximization=False, solver=args[0]) + x = p.new_variable(integer=True, nonnegative=True) + car_x = [ x[inp[i]] if sgn[i]==1 else 1-x[inp[i]] for i in range(2*n)] + changes = p.new_variable(integer=True, nonnegative=True) + for i in range(2*n-1): + p.add_constraint(changes[i] >= car_x[i] - car_x[i+1]) + p.add_constraint(changes[i] >= car_x[i+1] - car_x[i]) + p.set_objective(sum(changes[i] for i in range(2*n-1))) + + p.solve() + xv = p.get_values(x) + + return [ int(xv[inp[i]] if sgn[i]==1 else 1-xv[inp[i]]) for i in range(2*n)]