diff --git a/src/fortesting.py b/src/fortesting.py index a4db43f569ca4240fcadab89f8353fa731789770..880385c6653859e8d85c9323326266520de6d85e 100644 --- a/src/fortesting.py +++ b/src/fortesting.py @@ -21,7 +21,7 @@ def count_crossings_via_variables(c_vars): for c_var in c_vars.values(): if c_var.varValue == 1: crossings += 1 - print("Crossings:", crossings) + return(crossings) def solve_bipartite_minimization(graph_file): logging.info(f"Prozess für {graph_file} gestartet") @@ -57,7 +57,23 @@ def solve_bipartite_minimization(graph_file): # Zielfunktion, die minimiert werden soll prob += lpSum(c.values()) logging.info("Zielfunktion aufgestellt.") + + # Definieren der Crossing Constraints effizienter + # Crossing Constraints basierend auf Kantenpaaren + + 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:]: + if k > i: # Da die Liste sortiert ist, brauchen wir nur k > i zu prüfen + 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)] + + """ # Crossing Constraints basierend auf Kantenpaaren for (i, j) in edges: for (k, l) in edges: @@ -71,6 +87,7 @@ def solve_bipartite_minimization(graph_file): if l > j: prob += c[(i, j, k, l)] == 1 - y[(j, l)] logging.info("Crossing Constraints aufgestellt.") + """ initial_crossings = count_initial_crossings(edges) logging.info(f"Initial crossings edges: {initial_crossings}") @@ -135,20 +152,32 @@ def solve_bipartite_minimization(graph_file): if in_degree[neighbor] == 0: zero_in_degree_queue.append(neighbor) - for b in sorted_b: - print(f"{b}") - """ # Ausgabe der sortierten Knoten + a = count_crossings_via_variables(c) + + # Ausgabe der sortierten Knoten 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") print(f"{b}") - count_crossings_via_variables(c) - logging.info(f"Ergebnisse in {output_file} gespeichert")""" + f.write(f"Crossings: {a}\n") + print("Crossings: ", a) + logging.info(f"Ergebnisse in {output_file} gespeichert") else: logging.warning("Keine optimale Lösung gefunden.") +def process_directory(directory_path): + # Durchlaufe alle Dateien im angegebenen Verzeichnis + for filename in os.listdir(directory_path): + if filename.endswith('.gr'): # Überprüfen, ob die Datei eine .gr Datei ist + file_path = os.path.join(directory_path, filename) + 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/website_20.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 02577d6c53d358838183a4d72c24ddae31def6e0..1d8d3a80bc4b0bcd91aacbfe63d37d4812405627 100644 --- a/src/main.py +++ b/src/main.py @@ -48,7 +48,19 @@ def solve_bipartite_minimization(graph_file): # 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:]: + if k > i: # Da die Liste sortiert ist, brauchen wir nur k > i zu prüfen + 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.") + """ # Crossing Constraints basierend auf Kantenpaaren for (i, j) in edges: for (k, l) in edges: @@ -62,6 +74,8 @@ def solve_bipartite_minimization(graph_file): 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]}") @@ -76,7 +90,6 @@ def solve_bipartite_minimization(graph_file): 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.") @@ -122,5 +135,5 @@ def solve_bipartite_minimization(graph_file): #test_file = 'githubtests/tiny_test_set/instances/grid_9_shuffled.gr' -test_file = 'test_instances/0.gr' +test_file = 'test_instances/1.gr' solve_bipartite_minimization(test_file) diff --git a/src/solution_instances/0.sol b/src/solution_instances/0.sol index 292ff76f03cd38c78e04979106e1fcb289a304c8..c9a1c6728a5c124d4d27481f0bbc1859216e5700 100644 --- a/src/solution_instances/0.sol +++ b/src/solution_instances/0.sol @@ -1,3 +1,4 @@ 5 4 6 +Crossings: 0 diff --git a/src/solution_instances/complete_4_5.sol b/src/solution_instances/complete_4_5.sol index b040bdf616793518cf67f1c354974d7fb51e36a5..ea99ee268e25e93ca59ca2debca04a80b3641e97 100644 --- a/src/solution_instances/complete_4_5.sol +++ b/src/solution_instances/complete_4_5.sol @@ -3,3 +3,4 @@ 7 6 5 +Crossings: 60 diff --git a/src/solution_instances/cycle_8_shuffled.sol b/src/solution_instances/cycle_8_shuffled.sol index 3590b120515e7d1676e2cda33c21153f8137432f..b2cb16c3ab4c674f19c2d85b76579335439556d8 100644 --- a/src/solution_instances/cycle_8_shuffled.sol +++ b/src/solution_instances/cycle_8_shuffled.sol @@ -2,3 +2,4 @@ 7 8 5 +Crossings: 4 diff --git a/src/solution_instances/cycle_8_sorted.sol b/src/solution_instances/cycle_8_sorted.sol index 5957c0fd30f1d1c724ee0cef9f31e2aa03ec8d5a..ce4c234d81787879c0a4e9f013bc57523ba513d7 100644 --- a/src/solution_instances/cycle_8_sorted.sol +++ b/src/solution_instances/cycle_8_sorted.sol @@ -2,3 +2,4 @@ 7 6 8 +Crossings: 3 diff --git a/src/solution_instances/grid_9_shuffled.sol b/src/solution_instances/grid_9_shuffled.sol index 486c1901fbb92fd8aad5b8cf547dfa6fdc193b1c..24d0b7133eac574e6737f334af1c6cf248ea9faa 100644 --- a/src/solution_instances/grid_9_shuffled.sol +++ b/src/solution_instances/grid_9_shuffled.sol @@ -3,3 +3,4 @@ 7 5 6 +Crossings: 17 diff --git a/src/solution_instances/ladder_4_4_shuffled.sol b/src/solution_instances/ladder_4_4_shuffled.sol index c21318104c87e7753cf77710811b96ece447c87a..d20ccb4b639a020be455749d6f544d4eb8b3d96e 100644 --- a/src/solution_instances/ladder_4_4_shuffled.sol +++ b/src/solution_instances/ladder_4_4_shuffled.sol @@ -2,3 +2,4 @@ 8 5 7 +Crossings: 11 diff --git a/src/solution_instances/ladder_4_4_sorted.sol b/src/solution_instances/ladder_4_4_sorted.sol index 701bf8a8f0a28ca759e2be69767c8cb9ab6493be..35f149c7c8428aa5e01865c28fe73e944912d1bc 100644 --- a/src/solution_instances/ladder_4_4_sorted.sol +++ b/src/solution_instances/ladder_4_4_sorted.sol @@ -2,3 +2,4 @@ 8 7 6 +Crossings: 3 diff --git a/src/solution_instances/matching_4_4.sol b/src/solution_instances/matching_4_4.sol index 95fc5e4e0a65822bba117e5d1693d2bb274fe32d..1370cd69a7b77b7df97b664e6eb857e43a22a361 100644 --- a/src/solution_instances/matching_4_4.sol +++ b/src/solution_instances/matching_4_4.sol @@ -2,3 +2,4 @@ 5 6 8 +Crossings: 0 diff --git a/src/solution_instances/path_9_shuffled.sol b/src/solution_instances/path_9_shuffled.sol index e8af654cb316935458944427702fa42b22d723cc..a12444e456d1cc2ef4ff5168a617e316839b7df2 100644 --- a/src/solution_instances/path_9_shuffled.sol +++ b/src/solution_instances/path_9_shuffled.sol @@ -2,3 +2,4 @@ 6 7 9 +Crossings: 6 diff --git a/src/solution_instances/path_9_sorted.sol b/src/solution_instances/path_9_sorted.sol index b86e09948b2f06b1fff40a5649a9cfeab507caa0..082ab63bb2e4fb8df87230c49f076c7f6031d730 100644 --- a/src/solution_instances/path_9_sorted.sol +++ b/src/solution_instances/path_9_sorted.sol @@ -2,3 +2,4 @@ 9 6 8 +Crossings: 0 diff --git a/src/solution_instances/plane_5_6.sol b/src/solution_instances/plane_5_6.sol index e70e8bf79e2940ffedf78fd819ccda8ff13207f7..44592e234c064ce7bee5e69a50e5cf0ce6a5aeb7 100644 --- a/src/solution_instances/plane_5_6.sol +++ b/src/solution_instances/plane_5_6.sol @@ -4,3 +4,4 @@ 10 7 8 +Crossings: 0 diff --git a/src/solution_instances/star_6.sol b/src/solution_instances/star_6.sol index dd866a9aacbaf7d0ecaa57c1d05c91901d68ee72..835c63666be0beba29833f0811654b4071ba6e29 100644 --- a/src/solution_instances/star_6.sol +++ b/src/solution_instances/star_6.sol @@ -4,3 +4,4 @@ 4 6 8 +Crossings: 0 diff --git a/src/solution_instances/tree_6_10.sol b/src/solution_instances/tree_6_10.sol index c8e2fc5934e2f11a25743d4e3d2b8b046d00f082..dedff8a06e68c52daab6a6f2473a5355bbb2737e 100644 --- a/src/solution_instances/tree_6_10.sol +++ b/src/solution_instances/tree_6_10.sol @@ -8,3 +8,4 @@ 14 15 16 +Crossings: 13 diff --git a/src/solution_instances/website_20.sol b/src/solution_instances/website_20.sol index 4d5dc4bcdbeb153dc564fd7db2e3231763a3368d..37dd3ec2966be51975039fac4ec4294a1765bfbb 100644 --- a/src/solution_instances/website_20.sol +++ b/src/solution_instances/website_20.sol @@ -8,3 +8,4 @@ 14 16 15 +Crossings: 17