Skip to content
Snippets Groups Projects
Commit 8fddbbb1 authored by konog98's avatar konog98
Browse files

Hinzufügung von Batch scripts, sodass der pace2024tester in Windows verwendet...

Hinzufügung von Batch scripts, sodass der pace2024tester in Windows verwendet werden kann. Hinzufügung des archives, sowie Umstrukturieung der Tests, sodass Sie mit dem pace2024tester verwendet werden können.
parent 8da8ee89
Branches
No related tags found
1 merge request!1Kleines Framework aufgestellt, bereitgestellter Tester noch nicht getestet,...
Showing
with 91 additions and 95 deletions
File added
...@@ -7,5 +7,11 @@ xij = 1 bedeutet, dass π1(i) < π1(j) — Knoten i kommt vor Knoten j in der er ...@@ -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. yij = 1 bedeutet, dass π2(i) < π2(j) — Knoten i kommt vor Knoten j in der zweiten Permutation.
main: logged nur das wesentliche main: logged nur das wesentliche
backupmain: aktuelles backup 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
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
...@@ -174,10 +174,10 @@ def process_directory(directory_path): ...@@ -174,10 +174,10 @@ def process_directory(directory_path):
solve_bipartite_minimization(file_path) # Rufe die Verarbeitungsfunktion für jede .gr Datei auf solve_bipartite_minimization(file_path) # Rufe die Verarbeitungsfunktion für jede .gr Datei auf
logging.info(f"Verarbeitung abgeschlossen für {file_path}") logging.info(f"Verarbeitung abgeschlossen für {file_path}")
"""
directory_path = 'githubtests/tiny_test_set/instances/' directory_path = 'githubtests/tiny_test_set/instances/'
process_directory(directory_path) 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' #test_file = 'test_instances/0.gr'
#solve_bipartite_minimization(test_file) solve_bipartite_minimization(test_file)
import os import os
import logging import logging
import time
from datetime import datetime, timedelta
from pulp import * from pulp import *
# Erstellen eines Graphen zur Bestimmung der Knotenreihenfolge # Erstellen eines Graphen zur Bestimmung der Knotenreihenfolge
from collections import defaultdict, deque 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): def solve_bipartite_minimization(graph_file):
start_time = time()
logging.info(f"Prozess für {graph_file} gestartet") logging.info(f"Prozess für {graph_file} gestartet")
# Extrahiere den Basisnamen der Eingabedatei # Extrahiere den Basisnamen der Eingabedatei
base_name = os.path.basename(graph_file) base_name = os.path.basename(graph_file)
new_base_name = base_name.replace('.gr', '.sol') new_base_name = base_name.replace('.gr', '.sol')
new_base_name1 = base_name.replace('.gr', '.cros')
# Erstelle den Ausgabepfad # 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") logging.info(f"Die Ausgabedatei wird {output_file} sein")
edges = [] edges = []
...@@ -37,18 +52,11 @@ def solve_bipartite_minimization(graph_file): ...@@ -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} 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} 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.") 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 # Zielfunktion, die minimiert werden soll
prob += lpSum(c.values()) prob += lpSum(c.values())
logging.info("Zielfunktion aufgestellt.") logging.info("Zielfunktion aufgestellt.")
"""
edges.sort(key=lambda x: x[0]) # Sortieren der Kanten nach dem Startknoten edges.sort(key=lambda x: x[0]) # Sortieren der Kanten nach dem Startknoten
for idx, (i, j) in enumerate(edges): for idx, (i, j) in enumerate(edges):
for (k, l) in edges[idx + 1:]: for (k, l) in edges[idx + 1:]:
...@@ -60,36 +68,10 @@ def solve_bipartite_minimization(graph_file): ...@@ -60,36 +68,10 @@ def solve_bipartite_minimization(graph_file):
elif l > j: elif l > j:
prob += c[(i, j, k, l)] == 1 - y[(j, l)] prob += c[(i, j, k, l)] == 1 - y[(j, l)]
logging.info("Crossing Constraints aufgestellt.") 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() prob.solve()
logging.info(f"Status der Lösung: {LpStatus[prob.status]}") 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: if prob.status == LpStatusOptimal:
logging.info("Optimale Lösung gefunden. Ergebnisse werden gespeichert.") logging.info("Optimale Lösung gefunden. Ergebnisse werden gespeichert.")
...@@ -128,11 +110,34 @@ def solve_bipartite_minimization(graph_file): ...@@ -128,11 +110,34 @@ def solve_bipartite_minimization(graph_file):
os.makedirs(os.path.dirname(output_file), exist_ok=True) os.makedirs(os.path.dirname(output_file), exist_ok=True)
with open(output_file, 'w') as f: with open(output_file, 'w') as f:
for b in sorted_b: for b in sorted_b:
f.write(f"{b}\n") f.write(f"{b}\n")
logging.info(f"Ergebnisse in {output_file} gespeichert") 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: else:
logging.warning("Keine optimale Lösung gefunden.") 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): def process_directory(directory_path):
# Durchlaufe alle Dateien im angegebenen Verzeichnis # Durchlaufe alle Dateien im angegebenen Verzeichnis
for filename in os.listdir(directory_path): for filename in os.listdir(directory_path):
...@@ -141,11 +146,13 @@ def process_directory(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 solve_bipartite_minimization(file_path) # Rufe die Verarbeitungsfunktion für jede .gr Datei auf
logging.info(f"Verarbeitung abgeschlossen für {file_path}") logging.info(f"Verarbeitung abgeschlossen für {file_path}")
"""
directory_path = 'githubtests/tiny_test_set/instances/' directory_path = 'githubtests/tiny_test_set/instances/'
#directory_path = 'mytests/instances/'
process_directory(directory_path) 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) solve_bipartite_minimization(test_file)
"""
\ No newline at end of file
5
4
6
Crossings: 0 Crossings: 0
Crossings: 1482
9
8
7
6
5
Crossings: 60 Crossings: 60
6
7
8
5
Crossings: 4 Crossings: 4
5
7
6
8
Crossings: 3 Crossings: 3
8
9
7
5
6
Crossings: 17 Crossings: 17
6
8
5
7
Crossings: 11 Crossings: 11
5
8
7
6
Crossings: 3 Crossings: 3
7
5
6
8
Crossings: 0 Crossings: 0
8
6
7
9
Crossings: 6 Crossings: 6
7
9
6
8
Crossings: 0 Crossings: 0
3
5
7
4
6
8
Crossings: 0 Crossings: 0
Crossings: 0
Crossings: 13
Crossings: 17
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment