diff --git a/__pycache__/visualizer.cpython-311.pyc b/__pycache__/visualizer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3644ac9b9c653403cbe4f1b02b6d6cd3d978a06e Binary files /dev/null and b/__pycache__/visualizer.cpython-311.pyc differ diff --git a/src/README.md b/src/README.md index 758aa4357001bf07214cd579af387a1b86cfb94e..66911e86f34d92872919d07cc3387de2e7c4abf8 100644 --- a/src/README.md +++ b/src/README.md @@ -7,5 +7,11 @@ xij = 1 bedeutet, dass π1(i) < π1(j) — Knoten i kommt vor Knoten j in der er yij = 1 bedeutet, dass π2(i) < π2(j) — Knoten i kommt vor Knoten j in der zweiten Permutation. main: logged nur das wesentliche + backupmain: aktuelles backup -foretesting: gleiches wie main, nur mit konsolen output, was nur für kleine graphen etwas bringt. \ No newline at end of file + +foretesting: gleiches wie main, nur mit konsolen output, was nur für kleine graphen etwas bringt. + +solver.py: Funktion die 2 Argumente übernimmt, Inputgraph und Outputgraph. Wird für den pace2024tester genutzt. + +solver.bat: Script für windwos, welches die solver.py mit den beiden Konsolen Inputs ausführt. \ No newline at end of file diff --git a/src/archive/logfile.log b/src/archive/logfile.log new file mode 100644 index 0000000000000000000000000000000000000000..ebd0169b5515c81f8290aeab748b409ae05b5dd4 --- /dev/null +++ b/src/archive/logfile.log @@ -0,0 +1,26 @@ +2024-05-10 18:20:35,031 - INFO - Prozess f�r test_instances/0.gr gestartet +2024-05-10 18:20:35,032 - INFO - Die Ausgabedatei wird solution_instances\0.sol sein +2024-05-10 18:20:35,032 - INFO - Gr��en der Partitionen: A=3, B=3 +2024-05-10 18:20:35,033 - INFO - 3 Kanten geladen. +2024-05-10 18:20:35,033 - INFO - x, y und c geladen. +2024-05-10 18:20:35,033 - INFO - Zielfunktion aufgestellt. +2024-05-10 18:20:35,034 - INFO - Crossing Constraints aufgestellt. +2024-05-10 18:20:35,050 - INFO - Status der L�sung: Optimal +2024-05-10 18:20:35,050 - INFO - Optimale L�sung gefunden. Ergebnisse werden gespeichert. +2024-05-10 18:20:35,051 - INFO - Ergebnisse in solution_instances\0.sol gespeichert +2024-05-10 18:20:35,052 - INFO - Crossings: 0, in solution_instances\0.cros gespeichert +2024-05-10 18:20:35,052 - INFO - Verstrichene Zeit: 0:00:00.021 (h:m:s.ms) + +2024-05-10 18:20:35,053 - INFO - Verarbeitung abgeschlossen f�r test_instances/0.gr +2024-05-10 18:20:35,053 - INFO - Prozess f�r test_instances/1.gr gestartet +2024-05-10 18:20:35,053 - INFO - Die Ausgabedatei wird solution_instances\1.sol sein +2024-05-10 18:20:35,053 - INFO - Gr��en der Partitionen: A=780, B=743 +2024-05-10 18:20:35,055 - INFO - 1522 Kanten geladen. +2024-05-10 18:20:37,375 - INFO - x, y und c geladen. +2024-05-10 18:20:37,648 - INFO - Zielfunktion aufgestellt. +2024-05-10 18:20:44,635 - INFO - Crossing Constraints aufgestellt. +2024-05-10 18:51:32,831 - INFO - Status der L�sung: Optimal +2024-05-10 18:51:32,832 - INFO - Optimale L�sung gefunden. Ergebnisse werden gespeichert. +2024-05-10 18:51:32,990 - INFO - Ergebnisse in solution_instances\1.sol gespeichert +2024-05-10 18:51:33,029 - INFO - Crossings: 1482, in solution_instances\1.cros gespeichert +2024-05-10 18:51:33,030 - INFO - Verstrichene Zeit: 0:30:57.977 (h:m:s.ms) \ No newline at end of file diff --git a/src/fortesting.py b/src/fortesting.py index 880385c6653859e8d85c9323326266520de6d85e..4a3b5858debb8b7231c4b6674a5b9914444ae346 100644 --- a/src/fortesting.py +++ b/src/fortesting.py @@ -174,10 +174,10 @@ def process_directory(directory_path): solve_bipartite_minimization(file_path) # Rufe die Verarbeitungsfunktion für jede .gr Datei auf logging.info(f"Verarbeitung abgeschlossen für {file_path}") - +""" directory_path = 'githubtests/tiny_test_set/instances/' process_directory(directory_path) - -#test_file = 'githubtests/tiny_test_set/instances/complete_4_5.gr' +""" +test_file = 'githubtests/tiny_test_set/instances/complete_4_5.gr' #test_file = 'test_instances/0.gr' -#solve_bipartite_minimization(test_file) +solve_bipartite_minimization(test_file) diff --git a/src/main.py b/src/main.py index 9c03128cf4212daf99cf8f4031bd7b9c12b6ca71..27e69b0d50eb21bd227faad2295b0b8878ae2c1f 100644 --- a/src/main.py +++ b/src/main.py @@ -1,19 +1,34 @@ import os import logging +import time +from datetime import datetime, timedelta from pulp import * # Erstellen eines Graphen zur Bestimmung der Knotenreihenfolge from collections import defaultdict, deque -# Konfiguriere Logging -logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +# Erstelle einen FileHandler und einen StreamHandler +file_handler = logging.FileHandler('logfile.log') +console_handler = logging.StreamHandler() +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[file_handler, console_handler]) + +def count_crossings_via_variables(c_vars): + crossings = 0 + for c_var in c_vars.values(): + if c_var.varValue == 1: + crossings += 1 + return(crossings) def solve_bipartite_minimization(graph_file): + start_time = time() logging.info(f"Prozess für {graph_file} gestartet") # Extrahiere den Basisnamen der Eingabedatei base_name = os.path.basename(graph_file) new_base_name = base_name.replace('.gr', '.sol') + new_base_name1 = base_name.replace('.gr', '.cros') # Erstelle den Ausgabepfad - output_file = os.path.join('solution_instances', new_base_name) + output_file = os.path.join('mytests/solutions', new_base_name) + output_file1 = os.path.join('mytests/crossings', new_base_name1) logging.info(f"Die Ausgabedatei wird {output_file} sein") edges = [] @@ -37,18 +52,11 @@ def solve_bipartite_minimization(graph_file): y = {(i, j): LpVariable(f"y_{i}_{j}", 0, 1, cat='Binary') for i in range(n0 + 1, n0 + n1 + 1) for j in range(n0 + 1, n0 + n1 + 1) if i < j} c = {(i, j, k, l): LpVariable(f"c_{i}_{j}_{k}_{l}", 0, 1, cat='Binary') for (i, j) in edges for (k, l) in edges if i < j and k < l and i < k and j != l} logging.info("x, y und c geladen.") - """ - # Crossing Variables - c = {} - for (i, j) in edges: - for (k, l) in edges: - if i < j and k < l and i < k and j != l: - c[(i, j, k, l)] = LpVariable(f"c_{i}_{j}_{k}_{l}", 0, 1, cat='Binary') - """ + # Zielfunktion, die minimiert werden soll prob += lpSum(c.values()) logging.info("Zielfunktion aufgestellt.") - """ + edges.sort(key=lambda x: x[0]) # Sortieren der Kanten nach dem Startknoten for idx, (i, j) in enumerate(edges): for (k, l) in edges[idx + 1:]: @@ -60,36 +68,10 @@ def solve_bipartite_minimization(graph_file): elif l > j: prob += c[(i, j, k, l)] == 1 - y[(j, l)] logging.info("Crossing Constraints aufgestellt.") - """ - # Crossing Constraints basierend auf Kantenpaaren - for (i, j) in edges: - for (k, l) in edges: - if i < k: # Nur Kantenpaare betrachten, wo i < k - if (i, j, k, l) not in c: - c[(i, j, k, l)] = LpVariable(f"c_{i}_{j}_{k}_{l}", 0, 1, cat='Binary') - - # Sicherstellen, dass nur gültige y-Variable-Zugriffe stattfinden - if j > l: - prob += c[(i, j, k, l)] == y[(l, j)] # Verwende .get() für sichere Zugriffe - if l > j: - prob += c[(i, j, k, l)] == 1 - y[(j, l)] # Verwende .get() für sichere Zugriffe - logging.info("Crossing Constraints aufgestellt.") - - prob.solve() logging.info(f"Status der Lösung: {LpStatus[prob.status]}") - """ - for key, var in x.items(): - print(f"x[{key}] = {var.varValue}") - - for key, var in y.items(): - print(f"y[{key}] = {var.varValue}") - - for key, var in c.items(): - print(f"c[{key}] = {var.varValue}") - """ if prob.status == LpStatusOptimal: logging.info("Optimale Lösung gefunden. Ergebnisse werden gespeichert.") @@ -128,11 +110,34 @@ def solve_bipartite_minimization(graph_file): os.makedirs(os.path.dirname(output_file), exist_ok=True) with open(output_file, 'w') as f: for b in sorted_b: - f.write(f"{b}\n") + f.write(f"{b}\n") logging.info(f"Ergebnisse in {output_file} gespeichert") + # Ausgabe der sortierten Knoten + + a = count_crossings_via_variables(c) + + os.makedirs(os.path.dirname(output_file1), exist_ok=True) + with open(output_file1, 'w') as f: + f.write(f"Crossings: {a}\n") + logging.info(f"Crossings: {a}, in {output_file1} gespeichert") + + end_time = time() + elapsed_time = end_time - start_time + elapsed_time_td = timedelta(seconds=elapsed_time) + formatted_time = str(elapsed_time_td) # '0:00:01.234000' für das obige Beispiel + formatted_time = formatted_time[:-3] + logging.info(f"Verstrichene Zeit: {formatted_time} (h:m:s.ms) \n") else: logging.warning("Keine optimale Lösung gefunden.") + end_time = time() + elapsed_time = end_time - start_time + elapsed_time_td = timedelta(seconds=elapsed_time) + formatted_time = str(elapsed_time_td) # '0:00:01.234000' für das obige Beispiel + formatted_time = formatted_time[:-3] + logging.info(f"Verstrichene Zeit: {formatted_time} (h:m:s.ms) \n") + + def process_directory(directory_path): # Durchlaufe alle Dateien im angegebenen Verzeichnis for filename in os.listdir(directory_path): @@ -141,11 +146,13 @@ def process_directory(directory_path): solve_bipartite_minimization(file_path) # Rufe die Verarbeitungsfunktion für jede .gr Datei auf logging.info(f"Verarbeitung abgeschlossen für {file_path}") -""" + directory_path = 'githubtests/tiny_test_set/instances/' +#directory_path = 'mytests/instances/' process_directory(directory_path) -""" -#test_file = 'githubtests/tiny_test_set/instances/grid_9_shuffled.gr' -test_file = 'test_instances/1.gr' +""" +test_file = 'githubtests/tiny_test_set/instances/complete_4_5.gr' +#test_file = 'mytests/instances/2.gr' solve_bipartite_minimization(test_file) +""" \ No newline at end of file diff --git a/src/solution_instances/0.sol b/src/mytests/crossings/0.cros similarity index 68% rename from src/solution_instances/0.sol rename to src/mytests/crossings/0.cros index c9a1c6728a5c124d4d27481f0bbc1859216e5700..edbe1c0e813360e623093b31b227beeb58b9198e 100644 --- a/src/solution_instances/0.sol +++ b/src/mytests/crossings/0.cros @@ -1,4 +1 @@ -5 -4 -6 Crossings: 0 diff --git a/src/mytests/crossings/1.cros b/src/mytests/crossings/1.cros new file mode 100644 index 0000000000000000000000000000000000000000..b168036c8605a7319b7926e183794c5916ec4ba2 --- /dev/null +++ b/src/mytests/crossings/1.cros @@ -0,0 +1 @@ +Crossings: 1482 diff --git a/src/solution_instances/complete_4_5.sol b/src/mytests/crossings/complete_4_5.cros similarity index 58% rename from src/solution_instances/complete_4_5.sol rename to src/mytests/crossings/complete_4_5.cros index ea99ee268e25e93ca59ca2debca04a80b3641e97..40161bce43919a8f4f337164b1dbfa8562e764b8 100644 --- a/src/solution_instances/complete_4_5.sol +++ b/src/mytests/crossings/complete_4_5.cros @@ -1,6 +1 @@ -9 -8 -7 -6 -5 Crossings: 60 diff --git a/src/solution_instances/cycle_8_shuffled.sol b/src/mytests/crossings/cycle_8_shuffled.cros similarity index 61% rename from src/solution_instances/cycle_8_shuffled.sol rename to src/mytests/crossings/cycle_8_shuffled.cros index b2cb16c3ab4c674f19c2d85b76579335439556d8..b4ce40dff2db1161fe132dbfba50eaf3c8a96db4 100644 --- a/src/solution_instances/cycle_8_shuffled.sol +++ b/src/mytests/crossings/cycle_8_shuffled.cros @@ -1,5 +1 @@ -6 -7 -8 -5 Crossings: 4 diff --git a/src/solution_instances/cycle_8_sorted.sol b/src/mytests/crossings/cycle_8_sorted.cros similarity index 61% rename from src/solution_instances/cycle_8_sorted.sol rename to src/mytests/crossings/cycle_8_sorted.cros index ce4c234d81787879c0a4e9f013bc57523ba513d7..4ec4c4ecfe9e42df888d39dfa7411d9dd8f61b16 100644 --- a/src/solution_instances/cycle_8_sorted.sol +++ b/src/mytests/crossings/cycle_8_sorted.cros @@ -1,5 +1 @@ -5 -7 -6 -8 Crossings: 3 diff --git a/src/solution_instances/grid_9_shuffled.sol b/src/mytests/crossings/grid_9_shuffled.cros similarity index 58% rename from src/solution_instances/grid_9_shuffled.sol rename to src/mytests/crossings/grid_9_shuffled.cros index 24d0b7133eac574e6737f334af1c6cf248ea9faa..add6133f7519c014694671472996388ac1b68147 100644 --- a/src/solution_instances/grid_9_shuffled.sol +++ b/src/mytests/crossings/grid_9_shuffled.cros @@ -1,6 +1 @@ -8 -9 -7 -5 -6 Crossings: 17 diff --git a/src/solution_instances/ladder_4_4_shuffled.sol b/src/mytests/crossings/ladder_4_4_shuffled.cros similarity index 63% rename from src/solution_instances/ladder_4_4_shuffled.sol rename to src/mytests/crossings/ladder_4_4_shuffled.cros index d20ccb4b639a020be455749d6f544d4eb8b3d96e..7caca1e9635145da9b4fa329c010449dd1c794cb 100644 --- a/src/solution_instances/ladder_4_4_shuffled.sol +++ b/src/mytests/crossings/ladder_4_4_shuffled.cros @@ -1,5 +1 @@ -6 -8 -5 -7 Crossings: 11 diff --git a/src/solution_instances/ladder_4_4_sorted.sol b/src/mytests/crossings/ladder_4_4_sorted.cros similarity index 61% rename from src/solution_instances/ladder_4_4_sorted.sol rename to src/mytests/crossings/ladder_4_4_sorted.cros index 35f149c7c8428aa5e01865c28fe73e944912d1bc..4ec4c4ecfe9e42df888d39dfa7411d9dd8f61b16 100644 --- a/src/solution_instances/ladder_4_4_sorted.sol +++ b/src/mytests/crossings/ladder_4_4_sorted.cros @@ -1,5 +1 @@ -5 -8 -7 -6 Crossings: 3 diff --git a/src/solution_instances/matching_4_4.sol b/src/mytests/crossings/matching_4_4.cros similarity index 61% rename from src/solution_instances/matching_4_4.sol rename to src/mytests/crossings/matching_4_4.cros index 1370cd69a7b77b7df97b664e6eb857e43a22a361..edbe1c0e813360e623093b31b227beeb58b9198e 100644 --- a/src/solution_instances/matching_4_4.sol +++ b/src/mytests/crossings/matching_4_4.cros @@ -1,5 +1 @@ -7 -5 -6 -8 Crossings: 0 diff --git a/src/solution_instances/path_9_shuffled.sol b/src/mytests/crossings/path_9_shuffled.cros similarity index 61% rename from src/solution_instances/path_9_shuffled.sol rename to src/mytests/crossings/path_9_shuffled.cros index a12444e456d1cc2ef4ff5168a617e316839b7df2..7b687de22feb7d8cccb1214aaf22a07d02350a1f 100644 --- a/src/solution_instances/path_9_shuffled.sol +++ b/src/mytests/crossings/path_9_shuffled.cros @@ -1,5 +1 @@ -8 -6 -7 -9 Crossings: 6 diff --git a/src/solution_instances/path_9_sorted.sol b/src/mytests/crossings/path_9_sorted.cros similarity index 61% rename from src/solution_instances/path_9_sorted.sol rename to src/mytests/crossings/path_9_sorted.cros index 082ab63bb2e4fb8df87230c49f076c7f6031d730..edbe1c0e813360e623093b31b227beeb58b9198e 100644 --- a/src/solution_instances/path_9_sorted.sol +++ b/src/mytests/crossings/path_9_sorted.cros @@ -1,5 +1 @@ -7 -9 -6 -8 Crossings: 0 diff --git a/src/solution_instances/star_6.sol b/src/mytests/crossings/plane_5_6.cros similarity index 52% rename from src/solution_instances/star_6.sol rename to src/mytests/crossings/plane_5_6.cros index 835c63666be0beba29833f0811654b4071ba6e29..edbe1c0e813360e623093b31b227beeb58b9198e 100644 --- a/src/solution_instances/star_6.sol +++ b/src/mytests/crossings/plane_5_6.cros @@ -1,7 +1 @@ -3 -5 -7 -4 -6 -8 Crossings: 0 diff --git a/src/mytests/crossings/star_6.cros b/src/mytests/crossings/star_6.cros new file mode 100644 index 0000000000000000000000000000000000000000..edbe1c0e813360e623093b31b227beeb58b9198e --- /dev/null +++ b/src/mytests/crossings/star_6.cros @@ -0,0 +1 @@ +Crossings: 0 diff --git a/src/mytests/crossings/tree_6_10.cros b/src/mytests/crossings/tree_6_10.cros new file mode 100644 index 0000000000000000000000000000000000000000..256863668686f5715a0e9676b955a0688bd8033a --- /dev/null +++ b/src/mytests/crossings/tree_6_10.cros @@ -0,0 +1 @@ +Crossings: 13 diff --git a/src/mytests/crossings/website_20.cros b/src/mytests/crossings/website_20.cros new file mode 100644 index 0000000000000000000000000000000000000000..add6133f7519c014694671472996388ac1b68147 --- /dev/null +++ b/src/mytests/crossings/website_20.cros @@ -0,0 +1 @@ +Crossings: 17 diff --git a/src/test_instances/0.gr b/src/mytests/instances/0.gr similarity index 100% rename from src/test_instances/0.gr rename to src/mytests/instances/0.gr diff --git a/src/test_instances/1.gr b/src/mytests/instances/1.gr similarity index 100% rename from src/test_instances/1.gr rename to src/mytests/instances/1.gr diff --git a/src/test_instances/10.gr b/src/mytests/instances/10.gr similarity index 100% rename from src/test_instances/10.gr rename to src/mytests/instances/10.gr diff --git a/src/test_instances/100.gr b/src/mytests/instances/100.gr similarity index 100% rename from src/test_instances/100.gr rename to src/mytests/instances/100.gr diff --git a/src/test_instances/11.gr b/src/mytests/instances/11.gr similarity index 100% rename from src/test_instances/11.gr rename to src/mytests/instances/11.gr diff --git a/src/test_instances/12.gr b/src/mytests/instances/12.gr similarity index 100% rename from src/test_instances/12.gr rename to src/mytests/instances/12.gr diff --git a/src/test_instances/13.gr b/src/mytests/instances/13.gr similarity index 100% rename from src/test_instances/13.gr rename to src/mytests/instances/13.gr diff --git a/src/test_instances/14.gr b/src/mytests/instances/14.gr similarity index 100% rename from src/test_instances/14.gr rename to src/mytests/instances/14.gr diff --git a/src/test_instances/15.gr b/src/mytests/instances/15.gr similarity index 100% rename from src/test_instances/15.gr rename to src/mytests/instances/15.gr diff --git a/src/test_instances/16.gr b/src/mytests/instances/16.gr similarity index 100% rename from src/test_instances/16.gr rename to src/mytests/instances/16.gr diff --git a/src/test_instances/17.gr b/src/mytests/instances/17.gr similarity index 100% rename from src/test_instances/17.gr rename to src/mytests/instances/17.gr diff --git a/src/test_instances/18.gr b/src/mytests/instances/18.gr similarity index 100% rename from src/test_instances/18.gr rename to src/mytests/instances/18.gr diff --git a/src/test_instances/19.gr b/src/mytests/instances/19.gr similarity index 100% rename from src/test_instances/19.gr rename to src/mytests/instances/19.gr diff --git a/src/test_instances/2.gr b/src/mytests/instances/2.gr similarity index 100% rename from src/test_instances/2.gr rename to src/mytests/instances/2.gr diff --git a/src/test_instances/20.gr b/src/mytests/instances/20.gr similarity index 100% rename from src/test_instances/20.gr rename to src/mytests/instances/20.gr diff --git a/src/test_instances/21.gr b/src/mytests/instances/21.gr similarity index 100% rename from src/test_instances/21.gr rename to src/mytests/instances/21.gr diff --git a/src/test_instances/22.gr b/src/mytests/instances/22.gr similarity index 100% rename from src/test_instances/22.gr rename to src/mytests/instances/22.gr diff --git a/src/test_instances/23.gr b/src/mytests/instances/23.gr similarity index 100% rename from src/test_instances/23.gr rename to src/mytests/instances/23.gr diff --git a/src/test_instances/24.gr b/src/mytests/instances/24.gr similarity index 100% rename from src/test_instances/24.gr rename to src/mytests/instances/24.gr diff --git a/src/test_instances/25.gr b/src/mytests/instances/25.gr similarity index 100% rename from src/test_instances/25.gr rename to src/mytests/instances/25.gr diff --git a/src/test_instances/26.gr b/src/mytests/instances/26.gr similarity index 100% rename from src/test_instances/26.gr rename to src/mytests/instances/26.gr diff --git a/src/test_instances/27.gr b/src/mytests/instances/27.gr similarity index 100% rename from src/test_instances/27.gr rename to src/mytests/instances/27.gr diff --git a/src/test_instances/28.gr b/src/mytests/instances/28.gr similarity index 100% rename from src/test_instances/28.gr rename to src/mytests/instances/28.gr diff --git a/src/test_instances/29.gr b/src/mytests/instances/29.gr similarity index 100% rename from src/test_instances/29.gr rename to src/mytests/instances/29.gr diff --git a/src/test_instances/3.gr b/src/mytests/instances/3.gr similarity index 100% rename from src/test_instances/3.gr rename to src/mytests/instances/3.gr diff --git a/src/test_instances/30.gr b/src/mytests/instances/30.gr similarity index 100% rename from src/test_instances/30.gr rename to src/mytests/instances/30.gr diff --git a/src/test_instances/31.gr b/src/mytests/instances/31.gr similarity index 100% rename from src/test_instances/31.gr rename to src/mytests/instances/31.gr diff --git a/src/test_instances/32.gr b/src/mytests/instances/32.gr similarity index 100% rename from src/test_instances/32.gr rename to src/mytests/instances/32.gr diff --git a/src/test_instances/33.gr b/src/mytests/instances/33.gr similarity index 100% rename from src/test_instances/33.gr rename to src/mytests/instances/33.gr diff --git a/src/test_instances/34.gr b/src/mytests/instances/34.gr similarity index 100% rename from src/test_instances/34.gr rename to src/mytests/instances/34.gr diff --git a/src/test_instances/35.gr b/src/mytests/instances/35.gr similarity index 100% rename from src/test_instances/35.gr rename to src/mytests/instances/35.gr diff --git a/src/test_instances/36.gr b/src/mytests/instances/36.gr similarity index 100% rename from src/test_instances/36.gr rename to src/mytests/instances/36.gr diff --git a/src/test_instances/37.gr b/src/mytests/instances/37.gr similarity index 100% rename from src/test_instances/37.gr rename to src/mytests/instances/37.gr diff --git a/src/test_instances/38.gr b/src/mytests/instances/38.gr similarity index 100% rename from src/test_instances/38.gr rename to src/mytests/instances/38.gr diff --git a/src/test_instances/39.gr b/src/mytests/instances/39.gr similarity index 100% rename from src/test_instances/39.gr rename to src/mytests/instances/39.gr diff --git a/src/test_instances/4.gr b/src/mytests/instances/4.gr similarity index 100% rename from src/test_instances/4.gr rename to src/mytests/instances/4.gr diff --git a/src/test_instances/40.gr b/src/mytests/instances/40.gr similarity index 100% rename from src/test_instances/40.gr rename to src/mytests/instances/40.gr diff --git a/src/test_instances/41.gr b/src/mytests/instances/41.gr similarity index 100% rename from src/test_instances/41.gr rename to src/mytests/instances/41.gr diff --git a/src/test_instances/42.gr b/src/mytests/instances/42.gr similarity index 100% rename from src/test_instances/42.gr rename to src/mytests/instances/42.gr diff --git a/src/test_instances/43.gr b/src/mytests/instances/43.gr similarity index 100% rename from src/test_instances/43.gr rename to src/mytests/instances/43.gr diff --git a/src/test_instances/44.gr b/src/mytests/instances/44.gr similarity index 100% rename from src/test_instances/44.gr rename to src/mytests/instances/44.gr diff --git a/src/test_instances/45.gr b/src/mytests/instances/45.gr similarity index 100% rename from src/test_instances/45.gr rename to src/mytests/instances/45.gr diff --git a/src/test_instances/46.gr b/src/mytests/instances/46.gr similarity index 100% rename from src/test_instances/46.gr rename to src/mytests/instances/46.gr diff --git a/src/test_instances/47.gr b/src/mytests/instances/47.gr similarity index 100% rename from src/test_instances/47.gr rename to src/mytests/instances/47.gr diff --git a/src/test_instances/48.gr b/src/mytests/instances/48.gr similarity index 100% rename from src/test_instances/48.gr rename to src/mytests/instances/48.gr diff --git a/src/test_instances/49.gr b/src/mytests/instances/49.gr similarity index 100% rename from src/test_instances/49.gr rename to src/mytests/instances/49.gr diff --git a/src/test_instances/5.gr b/src/mytests/instances/5.gr similarity index 100% rename from src/test_instances/5.gr rename to src/mytests/instances/5.gr diff --git a/src/test_instances/50.gr b/src/mytests/instances/50.gr similarity index 100% rename from src/test_instances/50.gr rename to src/mytests/instances/50.gr diff --git a/src/test_instances/51.gr b/src/mytests/instances/51.gr similarity index 100% rename from src/test_instances/51.gr rename to src/mytests/instances/51.gr diff --git a/src/test_instances/52.gr b/src/mytests/instances/52.gr similarity index 100% rename from src/test_instances/52.gr rename to src/mytests/instances/52.gr diff --git a/src/test_instances/53.gr b/src/mytests/instances/53.gr similarity index 100% rename from src/test_instances/53.gr rename to src/mytests/instances/53.gr diff --git a/src/test_instances/54.gr b/src/mytests/instances/54.gr similarity index 100% rename from src/test_instances/54.gr rename to src/mytests/instances/54.gr diff --git a/src/test_instances/55.gr b/src/mytests/instances/55.gr similarity index 100% rename from src/test_instances/55.gr rename to src/mytests/instances/55.gr diff --git a/src/test_instances/56.gr b/src/mytests/instances/56.gr similarity index 100% rename from src/test_instances/56.gr rename to src/mytests/instances/56.gr diff --git a/src/test_instances/57.gr b/src/mytests/instances/57.gr similarity index 100% rename from src/test_instances/57.gr rename to src/mytests/instances/57.gr diff --git a/src/test_instances/58.gr b/src/mytests/instances/58.gr similarity index 100% rename from src/test_instances/58.gr rename to src/mytests/instances/58.gr diff --git a/src/test_instances/59.gr b/src/mytests/instances/59.gr similarity index 100% rename from src/test_instances/59.gr rename to src/mytests/instances/59.gr diff --git a/src/test_instances/6.gr b/src/mytests/instances/6.gr similarity index 100% rename from src/test_instances/6.gr rename to src/mytests/instances/6.gr diff --git a/src/test_instances/60.gr b/src/mytests/instances/60.gr similarity index 100% rename from src/test_instances/60.gr rename to src/mytests/instances/60.gr diff --git a/src/test_instances/61.gr b/src/mytests/instances/61.gr similarity index 100% rename from src/test_instances/61.gr rename to src/mytests/instances/61.gr diff --git a/src/test_instances/62.gr b/src/mytests/instances/62.gr similarity index 100% rename from src/test_instances/62.gr rename to src/mytests/instances/62.gr diff --git a/src/test_instances/63.gr b/src/mytests/instances/63.gr similarity index 100% rename from src/test_instances/63.gr rename to src/mytests/instances/63.gr diff --git a/src/test_instances/64.gr b/src/mytests/instances/64.gr similarity index 100% rename from src/test_instances/64.gr rename to src/mytests/instances/64.gr diff --git a/src/test_instances/65.gr b/src/mytests/instances/65.gr similarity index 100% rename from src/test_instances/65.gr rename to src/mytests/instances/65.gr diff --git a/src/test_instances/66.gr b/src/mytests/instances/66.gr similarity index 100% rename from src/test_instances/66.gr rename to src/mytests/instances/66.gr diff --git a/src/test_instances/67.gr b/src/mytests/instances/67.gr similarity index 100% rename from src/test_instances/67.gr rename to src/mytests/instances/67.gr diff --git a/src/test_instances/68.gr b/src/mytests/instances/68.gr similarity index 100% rename from src/test_instances/68.gr rename to src/mytests/instances/68.gr diff --git a/src/test_instances/69.gr b/src/mytests/instances/69.gr similarity index 100% rename from src/test_instances/69.gr rename to src/mytests/instances/69.gr diff --git a/src/test_instances/7.gr b/src/mytests/instances/7.gr similarity index 100% rename from src/test_instances/7.gr rename to src/mytests/instances/7.gr diff --git a/src/test_instances/70.gr b/src/mytests/instances/70.gr similarity index 100% rename from src/test_instances/70.gr rename to src/mytests/instances/70.gr diff --git a/src/test_instances/71.gr b/src/mytests/instances/71.gr similarity index 100% rename from src/test_instances/71.gr rename to src/mytests/instances/71.gr diff --git a/src/test_instances/72.gr b/src/mytests/instances/72.gr similarity index 100% rename from src/test_instances/72.gr rename to src/mytests/instances/72.gr diff --git a/src/test_instances/73.gr b/src/mytests/instances/73.gr similarity index 100% rename from src/test_instances/73.gr rename to src/mytests/instances/73.gr diff --git a/src/test_instances/74.gr b/src/mytests/instances/74.gr similarity index 100% rename from src/test_instances/74.gr rename to src/mytests/instances/74.gr diff --git a/src/test_instances/75.gr b/src/mytests/instances/75.gr similarity index 100% rename from src/test_instances/75.gr rename to src/mytests/instances/75.gr diff --git a/src/test_instances/76.gr b/src/mytests/instances/76.gr similarity index 100% rename from src/test_instances/76.gr rename to src/mytests/instances/76.gr diff --git a/src/test_instances/77.gr b/src/mytests/instances/77.gr similarity index 100% rename from src/test_instances/77.gr rename to src/mytests/instances/77.gr diff --git a/src/test_instances/78.gr b/src/mytests/instances/78.gr similarity index 100% rename from src/test_instances/78.gr rename to src/mytests/instances/78.gr diff --git a/src/test_instances/79.gr b/src/mytests/instances/79.gr similarity index 100% rename from src/test_instances/79.gr rename to src/mytests/instances/79.gr diff --git a/src/test_instances/8.gr b/src/mytests/instances/8.gr similarity index 100% rename from src/test_instances/8.gr rename to src/mytests/instances/8.gr diff --git a/src/test_instances/80.gr b/src/mytests/instances/80.gr similarity index 100% rename from src/test_instances/80.gr rename to src/mytests/instances/80.gr diff --git a/src/test_instances/81.gr b/src/mytests/instances/81.gr similarity index 100% rename from src/test_instances/81.gr rename to src/mytests/instances/81.gr diff --git a/src/test_instances/82.gr b/src/mytests/instances/82.gr similarity index 100% rename from src/test_instances/82.gr rename to src/mytests/instances/82.gr diff --git a/src/test_instances/83.gr b/src/mytests/instances/83.gr similarity index 100% rename from src/test_instances/83.gr rename to src/mytests/instances/83.gr diff --git a/src/test_instances/84.gr b/src/mytests/instances/84.gr similarity index 100% rename from src/test_instances/84.gr rename to src/mytests/instances/84.gr diff --git a/src/test_instances/85.gr b/src/mytests/instances/85.gr similarity index 100% rename from src/test_instances/85.gr rename to src/mytests/instances/85.gr diff --git a/src/test_instances/86.gr b/src/mytests/instances/86.gr similarity index 100% rename from src/test_instances/86.gr rename to src/mytests/instances/86.gr diff --git a/src/test_instances/87.gr b/src/mytests/instances/87.gr similarity index 100% rename from src/test_instances/87.gr rename to src/mytests/instances/87.gr diff --git a/src/test_instances/88.gr b/src/mytests/instances/88.gr similarity index 100% rename from src/test_instances/88.gr rename to src/mytests/instances/88.gr diff --git a/src/test_instances/89.gr b/src/mytests/instances/89.gr similarity index 100% rename from src/test_instances/89.gr rename to src/mytests/instances/89.gr diff --git a/src/test_instances/9.gr b/src/mytests/instances/9.gr similarity index 100% rename from src/test_instances/9.gr rename to src/mytests/instances/9.gr diff --git a/src/test_instances/90.gr b/src/mytests/instances/90.gr similarity index 100% rename from src/test_instances/90.gr rename to src/mytests/instances/90.gr diff --git a/src/test_instances/91.gr b/src/mytests/instances/91.gr similarity index 100% rename from src/test_instances/91.gr rename to src/mytests/instances/91.gr diff --git a/src/test_instances/92.gr b/src/mytests/instances/92.gr similarity index 100% rename from src/test_instances/92.gr rename to src/mytests/instances/92.gr diff --git a/src/test_instances/93.gr b/src/mytests/instances/93.gr similarity index 100% rename from src/test_instances/93.gr rename to src/mytests/instances/93.gr diff --git a/src/test_instances/94.gr b/src/mytests/instances/94.gr similarity index 100% rename from src/test_instances/94.gr rename to src/mytests/instances/94.gr diff --git a/src/test_instances/95.gr b/src/mytests/instances/95.gr similarity index 100% rename from src/test_instances/95.gr rename to src/mytests/instances/95.gr diff --git a/src/test_instances/96.gr b/src/mytests/instances/96.gr similarity index 100% rename from src/test_instances/96.gr rename to src/mytests/instances/96.gr diff --git a/src/test_instances/97.gr b/src/mytests/instances/97.gr similarity index 100% rename from src/test_instances/97.gr rename to src/mytests/instances/97.gr diff --git a/src/test_instances/98.gr b/src/mytests/instances/98.gr similarity index 100% rename from src/test_instances/98.gr rename to src/mytests/instances/98.gr diff --git a/src/test_instances/99.gr b/src/mytests/instances/99.gr similarity index 100% rename from src/test_instances/99.gr rename to src/mytests/instances/99.gr diff --git a/src/mytests/solutions/0.sol b/src/mytests/solutions/0.sol new file mode 100644 index 0000000000000000000000000000000000000000..292ff76f03cd38c78e04979106e1fcb289a304c8 --- /dev/null +++ b/src/mytests/solutions/0.sol @@ -0,0 +1,3 @@ +5 +4 +6 diff --git a/src/solution_instances/1.sol b/src/mytests/solutions/1.sol similarity index 100% rename from src/solution_instances/1.sol rename to src/mytests/solutions/1.sol diff --git a/src/mytests/solutions/complete_4_5.sol b/src/mytests/solutions/complete_4_5.sol new file mode 100644 index 0000000000000000000000000000000000000000..b040bdf616793518cf67f1c354974d7fb51e36a5 --- /dev/null +++ b/src/mytests/solutions/complete_4_5.sol @@ -0,0 +1,5 @@ +9 +8 +7 +6 +5 diff --git a/src/githubtests/tiny_test_set/solutions/complete_4_5.sol b/src/mytests/solutions/cycle_8_shuffled.sol similarity index 88% rename from src/githubtests/tiny_test_set/solutions/complete_4_5.sol rename to src/mytests/solutions/cycle_8_shuffled.sol index 56593e110f71dd9704c883852e3f1b427b515b4d..3590b120515e7d1676e2cda33c21153f8137432f 100644 --- a/src/githubtests/tiny_test_set/solutions/complete_4_5.sol +++ b/src/mytests/solutions/cycle_8_shuffled.sol @@ -1,5 +1,4 @@ -5 6 7 8 -9 \ No newline at end of file +5 diff --git a/src/mytests/solutions/cycle_8_sorted.sol b/src/mytests/solutions/cycle_8_sorted.sol new file mode 100644 index 0000000000000000000000000000000000000000..5957c0fd30f1d1c724ee0cef9f31e2aa03ec8d5a --- /dev/null +++ b/src/mytests/solutions/cycle_8_sorted.sol @@ -0,0 +1,4 @@ +5 +7 +6 +8 diff --git a/src/mytests/solutions/grid_9_shuffled.sol b/src/mytests/solutions/grid_9_shuffled.sol new file mode 100644 index 0000000000000000000000000000000000000000..486c1901fbb92fd8aad5b8cf547dfa6fdc193b1c --- /dev/null +++ b/src/mytests/solutions/grid_9_shuffled.sol @@ -0,0 +1,5 @@ +8 +9 +7 +5 +6 diff --git a/src/mytests/solutions/ladder_4_4_shuffled.sol b/src/mytests/solutions/ladder_4_4_shuffled.sol new file mode 100644 index 0000000000000000000000000000000000000000..c21318104c87e7753cf77710811b96ece447c87a --- /dev/null +++ b/src/mytests/solutions/ladder_4_4_shuffled.sol @@ -0,0 +1,4 @@ +6 +8 +5 +7 diff --git a/src/mytests/solutions/ladder_4_4_sorted.sol b/src/mytests/solutions/ladder_4_4_sorted.sol new file mode 100644 index 0000000000000000000000000000000000000000..701bf8a8f0a28ca759e2be69767c8cb9ab6493be --- /dev/null +++ b/src/mytests/solutions/ladder_4_4_sorted.sol @@ -0,0 +1,4 @@ +5 +8 +7 +6 diff --git a/src/mytests/solutions/matching_4_4.sol b/src/mytests/solutions/matching_4_4.sol new file mode 100644 index 0000000000000000000000000000000000000000..95fc5e4e0a65822bba117e5d1693d2bb274fe32d --- /dev/null +++ b/src/mytests/solutions/matching_4_4.sol @@ -0,0 +1,4 @@ +7 +5 +6 +8 diff --git a/src/mytests/solutions/path_9_shuffled.sol b/src/mytests/solutions/path_9_shuffled.sol new file mode 100644 index 0000000000000000000000000000000000000000..e8af654cb316935458944427702fa42b22d723cc --- /dev/null +++ b/src/mytests/solutions/path_9_shuffled.sol @@ -0,0 +1,4 @@ +8 +6 +7 +9 diff --git a/src/mytests/solutions/path_9_sorted.sol b/src/mytests/solutions/path_9_sorted.sol new file mode 100644 index 0000000000000000000000000000000000000000..b86e09948b2f06b1fff40a5649a9cfeab507caa0 --- /dev/null +++ b/src/mytests/solutions/path_9_sorted.sol @@ -0,0 +1,4 @@ +7 +9 +6 +8 diff --git a/src/solution_instances/plane_5_6.sol b/src/mytests/solutions/plane_5_6.sol similarity index 51% rename from src/solution_instances/plane_5_6.sol rename to src/mytests/solutions/plane_5_6.sol index 44592e234c064ce7bee5e69a50e5cf0ce6a5aeb7..e70e8bf79e2940ffedf78fd819ccda8ff13207f7 100644 --- a/src/solution_instances/plane_5_6.sol +++ b/src/mytests/solutions/plane_5_6.sol @@ -4,4 +4,3 @@ 10 7 8 -Crossings: 0 diff --git a/src/mytests/solutions/star_6.sol b/src/mytests/solutions/star_6.sol new file mode 100644 index 0000000000000000000000000000000000000000..dd866a9aacbaf7d0ecaa57c1d05c91901d68ee72 --- /dev/null +++ b/src/mytests/solutions/star_6.sol @@ -0,0 +1,6 @@ +3 +5 +7 +4 +6 +8 diff --git a/src/solution_instances/tree_6_10.sol b/src/mytests/solutions/tree_6_10.sol similarity index 65% rename from src/solution_instances/tree_6_10.sol rename to src/mytests/solutions/tree_6_10.sol index dedff8a06e68c52daab6a6f2473a5355bbb2737e..c8e2fc5934e2f11a25743d4e3d2b8b046d00f082 100644 --- a/src/solution_instances/tree_6_10.sol +++ b/src/mytests/solutions/tree_6_10.sol @@ -8,4 +8,3 @@ 14 15 16 -Crossings: 13 diff --git a/src/solution_instances/website_20.sol b/src/mytests/solutions/website_20.sol similarity index 68% rename from src/solution_instances/website_20.sol rename to src/mytests/solutions/website_20.sol index 37dd3ec2966be51975039fac4ec4294a1765bfbb..4d5dc4bcdbeb153dc564fd7db2e3231763a3368d 100644 --- a/src/solution_instances/website_20.sol +++ b/src/mytests/solutions/website_20.sol @@ -8,4 +8,3 @@ 14 16 15 -Crossings: 17 diff --git a/src/prob.lp b/src/prob.lp index 0949b7c5dce585c175ad07e5b824f823a8f112b6..f4c2742a5a600297b7e321552323912f661453cc 100644 --- a/src/prob.lp +++ b/src/prob.lp @@ -1,187 +1,275 @@ \* Minimize_Crossings *\ Minimize -OBJ: c_1_15_10_16 + c_1_15_2_17 + c_1_15_3_18 + c_1_15_4_19 + c_1_15_5_20 - + c_1_15_6_11 + c_1_15_7_12 + c_1_15_8_13 + c_1_15_9_14 + c_1_16_10_15 - + c_1_16_2_17 + c_1_16_3_18 + c_1_16_4_19 + c_1_16_5_20 + c_1_16_6_11 - + c_1_16_7_12 + c_1_16_8_13 + c_1_16_9_14 + c_2_17_10_15 + c_2_17_10_16 - + c_2_17_3_18 + c_2_17_4_19 + c_2_17_5_20 + c_2_17_6_11 + c_2_17_7_12 - + c_2_17_8_13 + c_2_17_9_14 + c_3_18_10_15 + c_3_18_10_16 + c_3_18_4_19 - + c_3_18_5_20 + c_3_18_6_11 + c_3_18_7_12 + c_3_18_8_13 + c_3_18_9_14 - + c_4_19_10_15 + c_4_19_10_16 + c_4_19_5_20 + c_4_19_6_11 + c_4_19_7_12 - + c_4_19_8_13 + c_4_19_9_14 + c_5_20_10_15 + c_5_20_10_16 + c_5_20_6_11 - + c_5_20_7_12 + c_5_20_8_13 + c_5_20_9_14 + c_6_11_10_15 + c_6_11_10_16 - + c_6_11_7_12 + c_6_11_8_13 + c_6_11_9_14 + c_7_12_10_15 + c_7_12_10_16 - + c_7_12_8_13 + c_7_12_9_14 + c_8_13_10_15 + c_8_13_10_16 + c_8_13_9_14 - + c_9_14_10_15 + c_9_14_10_16 +OBJ: c_1_5_2_6 + c_1_5_2_7 + c_1_5_2_8 + c_1_5_2_9 + c_1_5_3_6 + c_1_5_3_7 + + c_1_5_3_8 + c_1_5_3_9 + c_1_5_4_6 + c_1_5_4_7 + c_1_5_4_8 + c_1_5_4_9 + + c_1_6_2_5 + c_1_6_2_7 + c_1_6_2_8 + c_1_6_2_9 + c_1_6_3_5 + c_1_6_3_7 + + c_1_6_3_8 + c_1_6_3_9 + c_1_6_4_5 + c_1_6_4_7 + c_1_6_4_8 + c_1_6_4_9 + + c_1_7_2_5 + c_1_7_2_6 + c_1_7_2_8 + c_1_7_2_9 + c_1_7_3_5 + c_1_7_3_6 + + c_1_7_3_8 + c_1_7_3_9 + c_1_7_4_5 + c_1_7_4_6 + c_1_7_4_8 + c_1_7_4_9 + + c_1_8_2_5 + c_1_8_2_6 + c_1_8_2_7 + c_1_8_2_9 + c_1_8_3_5 + c_1_8_3_6 + + c_1_8_3_7 + c_1_8_3_9 + c_1_8_4_5 + c_1_8_4_6 + c_1_8_4_7 + c_1_8_4_9 + + c_1_9_2_5 + c_1_9_2_6 + c_1_9_2_7 + c_1_9_2_8 + c_1_9_3_5 + c_1_9_3_6 + + c_1_9_3_7 + c_1_9_3_8 + c_1_9_4_5 + c_1_9_4_6 + c_1_9_4_7 + c_1_9_4_8 + + c_2_5_3_6 + c_2_5_3_7 + c_2_5_3_8 + c_2_5_3_9 + c_2_5_4_6 + c_2_5_4_7 + + c_2_5_4_8 + c_2_5_4_9 + c_2_6_3_5 + c_2_6_3_7 + c_2_6_3_8 + c_2_6_3_9 + + c_2_6_4_5 + c_2_6_4_7 + c_2_6_4_8 + c_2_6_4_9 + c_2_7_3_5 + c_2_7_3_6 + + c_2_7_3_8 + c_2_7_3_9 + c_2_7_4_5 + c_2_7_4_6 + c_2_7_4_8 + c_2_7_4_9 + + c_2_8_3_5 + c_2_8_3_6 + c_2_8_3_7 + c_2_8_3_9 + c_2_8_4_5 + c_2_8_4_6 + + c_2_8_4_7 + c_2_8_4_9 + c_2_9_3_5 + c_2_9_3_6 + c_2_9_3_7 + c_2_9_3_8 + + c_2_9_4_5 + c_2_9_4_6 + c_2_9_4_7 + c_2_9_4_8 + c_3_5_4_6 + c_3_5_4_7 + + c_3_5_4_8 + c_3_5_4_9 + c_3_6_4_5 + c_3_6_4_7 + c_3_6_4_8 + c_3_6_4_9 + + c_3_7_4_5 + c_3_7_4_6 + c_3_7_4_8 + c_3_7_4_9 + c_3_8_4_5 + c_3_8_4_6 + + c_3_8_4_7 + c_3_8_4_9 + c_3_9_4_5 + c_3_9_4_6 + c_3_9_4_7 + c_3_9_4_8 Subject To -_C1: c_1_15_2_17 + y_15_17 = 1 -_C10: c_1_16_2_17 + y_16_17 = 1 -_C11: c_1_16_3_18 + y_16_18 = 1 -_C12: c_1_16_4_19 + y_16_19 = 1 -_C13: c_1_16_5_20 + y_16_20 = 1 -_C14: c_1_16_6_11 - y_11_16 = 0 -_C15: c_1_16_7_12 - y_12_16 = 0 -_C16: c_1_16_8_13 - y_13_16 = 0 -_C17: c_1_16_9_14 - y_14_16 = 0 -_C18: c_1_16_10_15 - y_15_16 = 0 -_C19: c_2_17_3_18 + y_17_18 = 1 -_C2: c_1_15_3_18 + y_15_18 = 1 -_C20: c_2_17_4_19 + y_17_19 = 1 -_C21: c_2_17_5_20 + y_17_20 = 1 -_C22: c_2_17_6_11 - y_11_17 = 0 -_C23: c_2_17_7_12 - y_12_17 = 0 -_C24: c_2_17_8_13 - y_13_17 = 0 -_C25: c_2_17_9_14 - y_14_17 = 0 -_C26: c_2_17_10_15 - y_15_17 = 0 -_C27: c_2_17_10_16 - y_16_17 = 0 -_C28: c_3_18_4_19 + y_18_19 = 1 -_C29: c_3_18_5_20 + y_18_20 = 1 -_C3: c_1_15_4_19 + y_15_19 = 1 -_C30: c_3_18_6_11 - y_11_18 = 0 -_C31: c_3_18_7_12 - y_12_18 = 0 -_C32: c_3_18_8_13 - y_13_18 = 0 -_C33: c_3_18_9_14 - y_14_18 = 0 -_C34: c_3_18_10_15 - y_15_18 = 0 -_C35: c_3_18_10_16 - y_16_18 = 0 -_C36: c_4_19_5_20 + y_19_20 = 1 -_C37: c_4_19_6_11 - y_11_19 = 0 -_C38: c_4_19_7_12 - y_12_19 = 0 -_C39: c_4_19_8_13 - y_13_19 = 0 -_C4: c_1_15_5_20 + y_15_20 = 1 -_C40: c_4_19_9_14 - y_14_19 = 0 -_C41: c_4_19_10_15 - y_15_19 = 0 -_C42: c_4_19_10_16 - y_16_19 = 0 -_C43: c_5_20_6_11 - y_11_20 = 0 -_C44: c_5_20_7_12 - y_12_20 = 0 -_C45: c_5_20_8_13 - y_13_20 = 0 -_C46: c_5_20_9_14 - y_14_20 = 0 -_C47: c_5_20_10_15 - y_15_20 = 0 -_C48: c_5_20_10_16 - y_16_20 = 0 -_C49: c_6_11_7_12 + y_11_12 = 1 -_C5: c_1_15_6_11 - y_11_15 = 0 -_C50: c_6_11_8_13 + y_11_13 = 1 -_C51: c_6_11_9_14 + y_11_14 = 1 -_C52: c_6_11_10_15 + y_11_15 = 1 -_C53: c_6_11_10_16 + y_11_16 = 1 -_C54: c_7_12_8_13 + y_12_13 = 1 -_C55: c_7_12_9_14 + y_12_14 = 1 -_C56: c_7_12_10_15 + y_12_15 = 1 -_C57: c_7_12_10_16 + y_12_16 = 1 -_C58: c_8_13_9_14 + y_13_14 = 1 -_C59: c_8_13_10_15 + y_13_15 = 1 -_C6: c_1_15_7_12 - y_12_15 = 0 -_C60: c_8_13_10_16 + y_13_16 = 1 -_C61: c_9_14_10_15 + y_14_15 = 1 -_C62: c_9_14_10_16 + y_14_16 = 1 -_C7: c_1_15_8_13 - y_13_15 = 0 -_C8: c_1_15_9_14 - y_14_15 = 0 -_C9: c_1_15_10_16 + y_15_16 = 1 +_C1: c_1_5_2_6 + y_5_6 = 1 +_C10: c_1_5_4_7 + y_5_7 = 1 +_C100: c_2_9_4_8 - y_8_9 = 0 +_C101: c_3_5_4_6 + y_5_6 = 1 +_C102: c_3_5_4_7 + y_5_7 = 1 +_C103: c_3_5_4_8 + y_5_8 = 1 +_C104: c_3_5_4_9 + y_5_9 = 1 +_C105: c_3_6_4_5 - y_5_6 = 0 +_C106: c_3_6_4_7 + y_6_7 = 1 +_C107: c_3_6_4_8 + y_6_8 = 1 +_C108: c_3_6_4_9 + y_6_9 = 1 +_C109: c_3_7_4_5 - y_5_7 = 0 +_C11: c_1_5_4_8 + y_5_8 = 1 +_C110: c_3_7_4_6 - y_6_7 = 0 +_C111: c_3_7_4_8 + y_7_8 = 1 +_C112: c_3_7_4_9 + y_7_9 = 1 +_C113: c_3_8_4_5 - y_5_8 = 0 +_C114: c_3_8_4_6 - y_6_8 = 0 +_C115: c_3_8_4_7 - y_7_8 = 0 +_C116: c_3_8_4_9 + y_8_9 = 1 +_C117: c_3_9_4_5 - y_5_9 = 0 +_C118: c_3_9_4_6 - y_6_9 = 0 +_C119: c_3_9_4_7 - y_7_9 = 0 +_C12: c_1_5_4_9 + y_5_9 = 1 +_C120: c_3_9_4_8 - y_8_9 = 0 +_C13: c_1_6_2_5 - y_5_6 = 0 +_C14: c_1_6_2_7 + y_6_7 = 1 +_C15: c_1_6_2_8 + y_6_8 = 1 +_C16: c_1_6_2_9 + y_6_9 = 1 +_C17: c_1_6_3_5 - y_5_6 = 0 +_C18: c_1_6_3_7 + y_6_7 = 1 +_C19: c_1_6_3_8 + y_6_8 = 1 +_C2: c_1_5_2_7 + y_5_7 = 1 +_C20: c_1_6_3_9 + y_6_9 = 1 +_C21: c_1_6_4_5 - y_5_6 = 0 +_C22: c_1_6_4_7 + y_6_7 = 1 +_C23: c_1_6_4_8 + y_6_8 = 1 +_C24: c_1_6_4_9 + y_6_9 = 1 +_C25: c_1_7_2_5 - y_5_7 = 0 +_C26: c_1_7_2_6 - y_6_7 = 0 +_C27: c_1_7_2_8 + y_7_8 = 1 +_C28: c_1_7_2_9 + y_7_9 = 1 +_C29: c_1_7_3_5 - y_5_7 = 0 +_C3: c_1_5_2_8 + y_5_8 = 1 +_C30: c_1_7_3_6 - y_6_7 = 0 +_C31: c_1_7_3_8 + y_7_8 = 1 +_C32: c_1_7_3_9 + y_7_9 = 1 +_C33: c_1_7_4_5 - y_5_7 = 0 +_C34: c_1_7_4_6 - y_6_7 = 0 +_C35: c_1_7_4_8 + y_7_8 = 1 +_C36: c_1_7_4_9 + y_7_9 = 1 +_C37: c_1_8_2_5 - y_5_8 = 0 +_C38: c_1_8_2_6 - y_6_8 = 0 +_C39: c_1_8_2_7 - y_7_8 = 0 +_C4: c_1_5_2_9 + y_5_9 = 1 +_C40: c_1_8_2_9 + y_8_9 = 1 +_C41: c_1_8_3_5 - y_5_8 = 0 +_C42: c_1_8_3_6 - y_6_8 = 0 +_C43: c_1_8_3_7 - y_7_8 = 0 +_C44: c_1_8_3_9 + y_8_9 = 1 +_C45: c_1_8_4_5 - y_5_8 = 0 +_C46: c_1_8_4_6 - y_6_8 = 0 +_C47: c_1_8_4_7 - y_7_8 = 0 +_C48: c_1_8_4_9 + y_8_9 = 1 +_C49: c_1_9_2_5 - y_5_9 = 0 +_C5: c_1_5_3_6 + y_5_6 = 1 +_C50: c_1_9_2_6 - y_6_9 = 0 +_C51: c_1_9_2_7 - y_7_9 = 0 +_C52: c_1_9_2_8 - y_8_9 = 0 +_C53: c_1_9_3_5 - y_5_9 = 0 +_C54: c_1_9_3_6 - y_6_9 = 0 +_C55: c_1_9_3_7 - y_7_9 = 0 +_C56: c_1_9_3_8 - y_8_9 = 0 +_C57: c_1_9_4_5 - y_5_9 = 0 +_C58: c_1_9_4_6 - y_6_9 = 0 +_C59: c_1_9_4_7 - y_7_9 = 0 +_C6: c_1_5_3_7 + y_5_7 = 1 +_C60: c_1_9_4_8 - y_8_9 = 0 +_C61: c_2_5_3_6 + y_5_6 = 1 +_C62: c_2_5_3_7 + y_5_7 = 1 +_C63: c_2_5_3_8 + y_5_8 = 1 +_C64: c_2_5_3_9 + y_5_9 = 1 +_C65: c_2_5_4_6 + y_5_6 = 1 +_C66: c_2_5_4_7 + y_5_7 = 1 +_C67: c_2_5_4_8 + y_5_8 = 1 +_C68: c_2_5_4_9 + y_5_9 = 1 +_C69: c_2_6_3_5 - y_5_6 = 0 +_C7: c_1_5_3_8 + y_5_8 = 1 +_C70: c_2_6_3_7 + y_6_7 = 1 +_C71: c_2_6_3_8 + y_6_8 = 1 +_C72: c_2_6_3_9 + y_6_9 = 1 +_C73: c_2_6_4_5 - y_5_6 = 0 +_C74: c_2_6_4_7 + y_6_7 = 1 +_C75: c_2_6_4_8 + y_6_8 = 1 +_C76: c_2_6_4_9 + y_6_9 = 1 +_C77: c_2_7_3_5 - y_5_7 = 0 +_C78: c_2_7_3_6 - y_6_7 = 0 +_C79: c_2_7_3_8 + y_7_8 = 1 +_C8: c_1_5_3_9 + y_5_9 = 1 +_C80: c_2_7_3_9 + y_7_9 = 1 +_C81: c_2_7_4_5 - y_5_7 = 0 +_C82: c_2_7_4_6 - y_6_7 = 0 +_C83: c_2_7_4_8 + y_7_8 = 1 +_C84: c_2_7_4_9 + y_7_9 = 1 +_C85: c_2_8_3_5 - y_5_8 = 0 +_C86: c_2_8_3_6 - y_6_8 = 0 +_C87: c_2_8_3_7 - y_7_8 = 0 +_C88: c_2_8_3_9 + y_8_9 = 1 +_C89: c_2_8_4_5 - y_5_8 = 0 +_C9: c_1_5_4_6 + y_5_6 = 1 +_C90: c_2_8_4_6 - y_6_8 = 0 +_C91: c_2_8_4_7 - y_7_8 = 0 +_C92: c_2_8_4_9 + y_8_9 = 1 +_C93: c_2_9_3_5 - y_5_9 = 0 +_C94: c_2_9_3_6 - y_6_9 = 0 +_C95: c_2_9_3_7 - y_7_9 = 0 +_C96: c_2_9_3_8 - y_8_9 = 0 +_C97: c_2_9_4_5 - y_5_9 = 0 +_C98: c_2_9_4_6 - y_6_9 = 0 +_C99: c_2_9_4_7 - y_7_9 = 0 Binaries -c_1_15_10_16 -c_1_15_2_17 -c_1_15_3_18 -c_1_15_4_19 -c_1_15_5_20 -c_1_15_6_11 -c_1_15_7_12 -c_1_15_8_13 -c_1_15_9_14 -c_1_16_10_15 -c_1_16_2_17 -c_1_16_3_18 -c_1_16_4_19 -c_1_16_5_20 -c_1_16_6_11 -c_1_16_7_12 -c_1_16_8_13 -c_1_16_9_14 -c_2_17_10_15 -c_2_17_10_16 -c_2_17_3_18 -c_2_17_4_19 -c_2_17_5_20 -c_2_17_6_11 -c_2_17_7_12 -c_2_17_8_13 -c_2_17_9_14 -c_3_18_10_15 -c_3_18_10_16 -c_3_18_4_19 -c_3_18_5_20 -c_3_18_6_11 -c_3_18_7_12 -c_3_18_8_13 -c_3_18_9_14 -c_4_19_10_15 -c_4_19_10_16 -c_4_19_5_20 -c_4_19_6_11 -c_4_19_7_12 -c_4_19_8_13 -c_4_19_9_14 -c_5_20_10_15 -c_5_20_10_16 -c_5_20_6_11 -c_5_20_7_12 -c_5_20_8_13 -c_5_20_9_14 -c_6_11_10_15 -c_6_11_10_16 -c_6_11_7_12 -c_6_11_8_13 -c_6_11_9_14 -c_7_12_10_15 -c_7_12_10_16 -c_7_12_8_13 -c_7_12_9_14 -c_8_13_10_15 -c_8_13_10_16 -c_8_13_9_14 -c_9_14_10_15 -c_9_14_10_16 -y_11_12 -y_11_13 -y_11_14 -y_11_15 -y_11_16 -y_11_17 -y_11_18 -y_11_19 -y_11_20 -y_12_13 -y_12_14 -y_12_15 -y_12_16 -y_12_17 -y_12_18 -y_12_19 -y_12_20 -y_13_14 -y_13_15 -y_13_16 -y_13_17 -y_13_18 -y_13_19 -y_13_20 -y_14_15 -y_14_16 -y_14_17 -y_14_18 -y_14_19 -y_14_20 -y_15_16 -y_15_17 -y_15_18 -y_15_19 -y_15_20 -y_16_17 -y_16_18 -y_16_19 -y_16_20 -y_17_18 -y_17_19 -y_17_20 -y_18_19 -y_18_20 -y_19_20 +c_1_5_2_6 +c_1_5_2_7 +c_1_5_2_8 +c_1_5_2_9 +c_1_5_3_6 +c_1_5_3_7 +c_1_5_3_8 +c_1_5_3_9 +c_1_5_4_6 +c_1_5_4_7 +c_1_5_4_8 +c_1_5_4_9 +c_1_6_2_5 +c_1_6_2_7 +c_1_6_2_8 +c_1_6_2_9 +c_1_6_3_5 +c_1_6_3_7 +c_1_6_3_8 +c_1_6_3_9 +c_1_6_4_5 +c_1_6_4_7 +c_1_6_4_8 +c_1_6_4_9 +c_1_7_2_5 +c_1_7_2_6 +c_1_7_2_8 +c_1_7_2_9 +c_1_7_3_5 +c_1_7_3_6 +c_1_7_3_8 +c_1_7_3_9 +c_1_7_4_5 +c_1_7_4_6 +c_1_7_4_8 +c_1_7_4_9 +c_1_8_2_5 +c_1_8_2_6 +c_1_8_2_7 +c_1_8_2_9 +c_1_8_3_5 +c_1_8_3_6 +c_1_8_3_7 +c_1_8_3_9 +c_1_8_4_5 +c_1_8_4_6 +c_1_8_4_7 +c_1_8_4_9 +c_1_9_2_5 +c_1_9_2_6 +c_1_9_2_7 +c_1_9_2_8 +c_1_9_3_5 +c_1_9_3_6 +c_1_9_3_7 +c_1_9_3_8 +c_1_9_4_5 +c_1_9_4_6 +c_1_9_4_7 +c_1_9_4_8 +c_2_5_3_6 +c_2_5_3_7 +c_2_5_3_8 +c_2_5_3_9 +c_2_5_4_6 +c_2_5_4_7 +c_2_5_4_8 +c_2_5_4_9 +c_2_6_3_5 +c_2_6_3_7 +c_2_6_3_8 +c_2_6_3_9 +c_2_6_4_5 +c_2_6_4_7 +c_2_6_4_8 +c_2_6_4_9 +c_2_7_3_5 +c_2_7_3_6 +c_2_7_3_8 +c_2_7_3_9 +c_2_7_4_5 +c_2_7_4_6 +c_2_7_4_8 +c_2_7_4_9 +c_2_8_3_5 +c_2_8_3_6 +c_2_8_3_7 +c_2_8_3_9 +c_2_8_4_5 +c_2_8_4_6 +c_2_8_4_7 +c_2_8_4_9 +c_2_9_3_5 +c_2_9_3_6 +c_2_9_3_7 +c_2_9_3_8 +c_2_9_4_5 +c_2_9_4_6 +c_2_9_4_7 +c_2_9_4_8 +c_3_5_4_6 +c_3_5_4_7 +c_3_5_4_8 +c_3_5_4_9 +c_3_6_4_5 +c_3_6_4_7 +c_3_6_4_8 +c_3_6_4_9 +c_3_7_4_5 +c_3_7_4_6 +c_3_7_4_8 +c_3_7_4_9 +c_3_8_4_5 +c_3_8_4_6 +c_3_8_4_7 +c_3_8_4_9 +c_3_9_4_5 +c_3_9_4_6 +c_3_9_4_7 +c_3_9_4_8 +y_5_6 +y_5_7 +y_5_8 +y_5_9 +y_6_7 +y_6_8 +y_6_9 +y_7_8 +y_7_9 +y_8_9 End diff --git a/src/solver.bat b/src/solver.bat new file mode 100644 index 0000000000000000000000000000000000000000..4139868fe5efffcd006ebcfcb0b6b746287520bb --- /dev/null +++ b/src/solver.bat @@ -0,0 +1,4 @@ +@echo off +call .\.venv\Scripts\activate +python solver.py %* +call deactivate diff --git a/src/solver.py b/src/solver.py new file mode 100644 index 0000000000000000000000000000000000000000..863d6ad3a05bc2d1bbddccb651222ee01abbd945 --- /dev/null +++ b/src/solver.py @@ -0,0 +1,122 @@ +import os +import logging +from datetime import timedelta +import time +import argparse +from pulp import * +from collections import defaultdict, deque + +# Konfiguriere Logging +file_handler = logging.FileHandler('logfile.log') +console_handler = logging.StreamHandler() +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[file_handler, console_handler]) + +def count_crossings_via_variables(c_vars): + crossings = 0 + for c_var in c_vars.values(): + if c_var.varValue == 1: + crossings += 1 + return crossings + +def solve_bipartite_minimization(input_file, output_file): + start_time = time() + logging.info(f"Prozess für {input_file} gestartet") + + # Dateinamen basierend auf input_file generieren + output_crossings_file = output_file.replace('.sol', '.cros') + + edges = [] + with open(input_file, "r") as file: + for line in file: + if line.startswith('c'): + continue + elif line.startswith('p'): + parts = line.split() + n0 = int(parts[2]) + n1 = int(parts[3]) + logging.info(f"Größen der Partitionen: A={n0}, B={n1}") + else: + x, y = map(int, line.split()) + edges.append((x, y)) + logging.info(f"{len(edges)} Kanten geladen.") + + prob = LpProblem("Minimize_Crossings", LpMinimize) + + y = {(i, j): LpVariable(f"y_{i}_{j}", 0, 1, cat='Binary') for i in range(n0 + 1, n0 + n1 + 1) for j in range(n0 + 1, n0 + n1 + 1) if i < j} + c = {(i, j, k, l): LpVariable(f"c_{i}_{j}_{k}_{l}", 0, 1, cat='Binary') for (i, j) in edges for (k, l) in edges if i < j and k < l and i < k and j != l} + logging.info("Variablen für y und c geladen.") + + prob += lpSum(c.values()) + logging.info("Zielfunktion aufgestellt.") + + edges.sort(key=lambda x: x[0]) # Sortierung der Kanten nach dem Startknoten + for idx, (i, j) in enumerate(edges): + for (k, l) in edges[idx + 1:]: + if k > i: # Prüfung nur, wenn k > i nach Sortierung + if (i, j, k, l) not in c: + c[(i, j, k, l)] = LpVariable(f"c_{i}_{j}_{k}_{l}", 0, 1, cat='Binary') + if j > l: + prob += c[(i, j, k, l)] == y[(l, j)] + elif l > j: + prob += c[(i, j, k, l)] == 1 - y[(j, l)] + logging.info("Crossing Constraints aufgestellt.") + + prob.solve() + logging.info(f"Status der Lösung: {LpStatus[prob.status]}") + + if prob.status == LpStatusOptimal: + logging.info("Optimale Lösung gefunden. Ergebnisse werden gespeichert.") + graph = defaultdict(list) + in_degree = defaultdict(int) + nodes = range(n0+1, n0+n1+1) + + for i in nodes: + for j in nodes: + if i != j: + y_ij = y.get((i, j)) + if y_ij is not None and y_ij.varValue == 1: + graph[i].append(j) + in_degree[j] += 1 + elif y_ij is not None and y_ij.varValue == 0: + graph[j].append(i) + in_degree[i] += 1 + + zero_in_degree_queue = deque([i for i in nodes if in_degree[i] == 0]) + sorted_b = [] + while zero_in_degree_queue: + node = zero_in_degree_queue.popleft() + sorted_b.append(node) + for neighbor in graph[node]: + in_degree[neighbor] -= 1 + if in_degree[neighbor] == 0: + zero_in_degree_queue.append(neighbor) + + os.makedirs(os.path.dirname(output_file), exist_ok=True) + with open(output_file, 'w') as f: + for b in sorted_b: + f.write(f"{b}\n") + logging.info(f"Ergebnisse in {output_file} gespeichert") + + crossings_count = count_crossings_via_variables(c) + with open(output_crossings_file, 'w') as f: + f.write(f"Crossings: {crossings_count}\n") + logging.info(f"Crossings: {crossings_count}, in {output_crossings_file} gespeichert") + + end_time = time() + elapsed_time = end_time - start_time + elapsed_time_td = timedelta(seconds=elapsed_time) + logging.info(f"Verstrichene Zeit: {elapsed_time_td.total_seconds()} Sekunden.\n") + else: + logging.warning("Keine optimale Lösung gefunden.\n") + + +def main(): + parser = argparse.ArgumentParser(description="Solve Bipartite Minimization Problem") + parser.add_argument('input_file', type=str, help="The path to the input file") + parser.add_argument('output_file', type=str, help="The path to the output file") + args = parser.parse_args() + + solve_bipartite_minimization(args.input_file, args.output_file) + +if __name__ == "__main__": + main()