From 08715aa629a5a5385b7f09e83b41b763de6f32e7 Mon Sep 17 00:00:00 2001 From: konog98 <konog98@mi.fu-berlin.de> Date: Wed, 8 May 2024 11:36:18 +0200 Subject: [PATCH] Reduzierung der x Constraints --- src/fortesting.py | 27 +- src/main.py | 11 +- src/prob.lp | 90 --- src/solution_instances/1.sol | 743 +++++++++++++++++++++++ src/solution_instances/complete_4_5.sol | 8 +- src/solution_instances/cycle_8_sorted.gr | 4 - 6 files changed, 757 insertions(+), 126 deletions(-) create mode 100644 src/solution_instances/1.sol delete mode 100644 src/solution_instances/cycle_8_sorted.gr diff --git a/src/fortesting.py b/src/fortesting.py index 689d621..a4db43f 100644 --- a/src/fortesting.py +++ b/src/fortesting.py @@ -50,18 +50,10 @@ def solve_bipartite_minimization(graph_file): prob = LpProblem("Minimize_Crossings", LpMinimize) # Boolesche Variablen für relative Positionen innerhalb jeder Partition - x = {(i, j): LpVariable(f"x_{i}_{j}", 0, 1, cat='Binary') for i in range(1, n0 + 1) for j in range(1, n0 + 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} 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.") @@ -75,17 +67,11 @@ def solve_bipartite_minimization(graph_file): # 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 + prob += c[(i, j, k, l)] == y[(l, j)] if l > j: - prob += c[(i, j, k, l)] == 1 - y[(j, l)] # Verwende .get() für sichere Zugriffe + prob += c[(i, j, k, l)] == 1 - y[(j, l)] logging.info("Crossing Constraints aufgestellt.") - # Transitivitäts-Constraints für x-Variable, wenn x die Reihenfolge in A darstellt - for i in range(1, n0 + 1): - for j in range(i + 1, n0 + 1): - prob += x[(i, j)] == 1, f"fix_order_{i}_{j}" - logging.info("X fest Constraints aufgestellt.") - initial_crossings = count_initial_crossings(edges) logging.info(f"Initial crossings edges: {initial_crossings}") @@ -94,6 +80,7 @@ def solve_bipartite_minimization(graph_file): prob.writeLP("prob.lp") count_crossings_via_variables(c) + prob.solve() logging.info(f"Status der Lösung: {LpStatus[prob.status]}") @@ -148,14 +135,16 @@ def solve_bipartite_minimization(graph_file): if in_degree[neighbor] == 0: zero_in_degree_queue.append(neighbor) - # Ausgabe der sortierten Knoten + for b in sorted_b: + print(f"{b}") + """ # 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") + logging.info(f"Ergebnisse in {output_file} gespeichert")""" else: logging.warning("Keine optimale Lösung gefunden.") diff --git a/src/main.py b/src/main.py index 998a002..02577d6 100644 --- a/src/main.py +++ b/src/main.py @@ -34,7 +34,6 @@ def solve_bipartite_minimization(graph_file): prob = LpProblem("Minimize_Crossings", LpMinimize) # Boolesche Variablen für relative Positionen innerhalb jeder Partition - x = {(i, j): LpVariable(f"x_{i}_{j}", 0, 1, cat='Binary') for i in range(1, n0 + 1) for j in range(1, n0 + 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} logging.info("x, y und c geladen.") @@ -64,12 +63,6 @@ def solve_bipartite_minimization(graph_file): prob += c[(i, j, k, l)] == 1 - y[(j, l)] # Verwende .get() für sichere Zugriffe logging.info("Crossing Constraints aufgestellt.") - # Transitivitäts-Constraints für x-Variable, wenn x die Reihenfolge in A darstellt - for i in range(1, n0 + 1): - for j in range(i + 1, n0 + 1): - prob += x[(i, j)] == 1, f"fix_order_{i}_{j}" - logging.info("X fest Constraints aufgestellt.") - prob.solve() logging.info(f"Status der Lösung: {LpStatus[prob.status]}") @@ -128,6 +121,6 @@ def solve_bipartite_minimization(graph_file): logging.warning("Keine optimale Lösung gefunden.") -test_file = 'githubtests/tiny_test_set/instances/grid_9_shuffled.gr' -#test_file = 'test_instances/0.gr' +#test_file = 'githubtests/tiny_test_set/instances/grid_9_shuffled.gr' +test_file = 'test_instances/0.gr' solve_bipartite_minimization(test_file) diff --git a/src/prob.lp b/src/prob.lp index 125d6b7..0949b7c 100644 --- a/src/prob.lp +++ b/src/prob.lp @@ -76,51 +76,6 @@ _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 -fix_order_1_10: x_1_10 = 1 -fix_order_1_2: x_1_2 = 1 -fix_order_1_3: x_1_3 = 1 -fix_order_1_4: x_1_4 = 1 -fix_order_1_5: x_1_5 = 1 -fix_order_1_6: x_1_6 = 1 -fix_order_1_7: x_1_7 = 1 -fix_order_1_8: x_1_8 = 1 -fix_order_1_9: x_1_9 = 1 -fix_order_2_10: x_2_10 = 1 -fix_order_2_3: x_2_3 = 1 -fix_order_2_4: x_2_4 = 1 -fix_order_2_5: x_2_5 = 1 -fix_order_2_6: x_2_6 = 1 -fix_order_2_7: x_2_7 = 1 -fix_order_2_8: x_2_8 = 1 -fix_order_2_9: x_2_9 = 1 -fix_order_3_10: x_3_10 = 1 -fix_order_3_4: x_3_4 = 1 -fix_order_3_5: x_3_5 = 1 -fix_order_3_6: x_3_6 = 1 -fix_order_3_7: x_3_7 = 1 -fix_order_3_8: x_3_8 = 1 -fix_order_3_9: x_3_9 = 1 -fix_order_4_10: x_4_10 = 1 -fix_order_4_5: x_4_5 = 1 -fix_order_4_6: x_4_6 = 1 -fix_order_4_7: x_4_7 = 1 -fix_order_4_8: x_4_8 = 1 -fix_order_4_9: x_4_9 = 1 -fix_order_5_10: x_5_10 = 1 -fix_order_5_6: x_5_6 = 1 -fix_order_5_7: x_5_7 = 1 -fix_order_5_8: x_5_8 = 1 -fix_order_5_9: x_5_9 = 1 -fix_order_6_10: x_6_10 = 1 -fix_order_6_7: x_6_7 = 1 -fix_order_6_8: x_6_8 = 1 -fix_order_6_9: x_6_9 = 1 -fix_order_7_10: x_7_10 = 1 -fix_order_7_8: x_7_8 = 1 -fix_order_7_9: x_7_9 = 1 -fix_order_8_10: x_8_10 = 1 -fix_order_8_9: x_8_9 = 1 -fix_order_9_10: x_9_10 = 1 Binaries c_1_15_10_16 c_1_15_2_17 @@ -184,51 +139,6 @@ c_8_13_10_16 c_8_13_9_14 c_9_14_10_15 c_9_14_10_16 -x_1_10 -x_1_2 -x_1_3 -x_1_4 -x_1_5 -x_1_6 -x_1_7 -x_1_8 -x_1_9 -x_2_10 -x_2_3 -x_2_4 -x_2_5 -x_2_6 -x_2_7 -x_2_8 -x_2_9 -x_3_10 -x_3_4 -x_3_5 -x_3_6 -x_3_7 -x_3_8 -x_3_9 -x_4_10 -x_4_5 -x_4_6 -x_4_7 -x_4_8 -x_4_9 -x_5_10 -x_5_6 -x_5_7 -x_5_8 -x_5_9 -x_6_10 -x_6_7 -x_6_8 -x_6_9 -x_7_10 -x_7_8 -x_7_9 -x_8_10 -x_8_9 -x_9_10 y_11_12 y_11_13 y_11_14 diff --git a/src/solution_instances/1.sol b/src/solution_instances/1.sol new file mode 100644 index 0000000..6d9d770 --- /dev/null +++ b/src/solution_instances/1.sol @@ -0,0 +1,743 @@ +922 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1397 diff --git a/src/solution_instances/complete_4_5.sol b/src/solution_instances/complete_4_5.sol index 66f816c..b040bdf 100644 --- a/src/solution_instances/complete_4_5.sol +++ b/src/solution_instances/complete_4_5.sol @@ -1,5 +1,5 @@ -5 -6 -7 -8 9 +8 +7 +6 +5 diff --git a/src/solution_instances/cycle_8_sorted.gr b/src/solution_instances/cycle_8_sorted.gr deleted file mode 100644 index 3aac70f..0000000 --- a/src/solution_instances/cycle_8_sorted.gr +++ /dev/null @@ -1,4 +0,0 @@ -5 -6 -7 -8 -- GitLab