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