From 7f9f98a130f1763707e15bc078092c35cc4fb8bc Mon Sep 17 00:00:00 2001 From: konog98 <konog98@mi.fu-berlin.de> Date: Wed, 8 May 2024 19:13:18 +0200 Subject: [PATCH] Directory Verarbeitung und Crossing Constraint Optimierung, .sol beinhaltet jetzt auch die optimalen Crossings --- src/fortesting.py | 45 +++++++++++++++---- src/main.py | 19 ++++++-- src/solution_instances/0.sol | 1 + src/solution_instances/complete_4_5.sol | 1 + src/solution_instances/cycle_8_shuffled.sol | 1 + src/solution_instances/cycle_8_sorted.sol | 1 + src/solution_instances/grid_9_shuffled.sol | 1 + .../ladder_4_4_shuffled.sol | 1 + src/solution_instances/ladder_4_4_sorted.sol | 1 + src/solution_instances/matching_4_4.sol | 1 + src/solution_instances/path_9_shuffled.sol | 1 + src/solution_instances/path_9_sorted.sol | 1 + src/solution_instances/plane_5_6.sol | 1 + src/solution_instances/star_6.sol | 1 + src/solution_instances/tree_6_10.sol | 1 + src/solution_instances/website_20.sol | 1 + 16 files changed, 67 insertions(+), 11 deletions(-) diff --git a/src/fortesting.py b/src/fortesting.py index a4db43f..880385c 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 02577d6..1d8d3a8 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 292ff76..c9a1c67 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 b040bdf..ea99ee2 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 3590b12..b2cb16c 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 5957c0f..ce4c234 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 486c190..24d0b71 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 c213181..d20ccb4 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 701bf8a..35f149c 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 95fc5e4..1370cd6 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 e8af654..a12444e 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 b86e099..082ab63 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 e70e8bf..44592e2 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 dd866a9..835c636 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 c8e2fc5..dedff8a 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 4d5dc4b..37dd3ec 100644 --- a/src/solution_instances/website_20.sol +++ b/src/solution_instances/website_20.sol @@ -8,3 +8,4 @@ 14 16 15 +Crossings: 17 -- GitLab