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