From 407c36e513fdd9e196dbf5f00dc37174b3190d73 Mon Sep 17 00:00:00 2001 From: Jiri Kalvoda <jirikalvoda@kam.mff.cuni.cz> Date: Wed, 4 Sep 2024 22:26:38 +0200 Subject: [PATCH] Algo += opt_int_prog --- algo/opt_int_prog.sage | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100755 algo/opt_int_prog.sage diff --git a/algo/opt_int_prog.sage b/algo/opt_int_prog.sage new file mode 100755 index 000000000..fb0cdeef2 --- /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)] -- GitLab