Εργαστήριο 7 στην Python
Θέματα που εξετάζονται στο εργαστήριο: H βιβλιοθήκη OR-Tools της Google1, Constraint Programming2, CP-SAT3.
Εγκατάσταση εξωτερικών βιβλιοθηκών
Για τις ακόλουθες ασκήσεις θα χρειαστεί να εγκαταστήσετε τις βιβλιοθήκες ortools, pandas, plotly.
Άσκηση Ε7Α1 - Να λυθεί το κλασικό πρόβλημα κρυπταριθμητικής SEND + MORE = MONEY όπου κάθε γράμμα αντιστοιχεί σε ένα διαφορετικό ψηφίο από το 0 έως το 9. Τα πρώτα γράμματα των αριθμών δεν επιτρέπεται να είναι 0.
Λύση άσκησης E7A1
Αποτέλεσμα εκτέλεσης E7A1
Άσκηση Ε7Α2 - Να χρωματιστούν οι πολιτείες των ΗΠΑ εκτός από Alaska και Hawaii (48 πολιτείες), έτσι ώστε δύο πολιτείες που συνορεύουν να μην έχουν το ίδιο χρώμα. Χρησιμοποιήστε τα ακόλουθα δεδομένα για τα ονόματα πολιτειών και τις πολιτείες που είναι γειτονικές μεταξύ τους:
states = [
"AL", "AZ", "AR", "CA", "CO", "CT", "DE", "FL",
"GA", "ID", "IL", "IN", "IA", "KS", "KY", "LA",
"ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT",
"NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND",
"OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN",
"TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"
]
edges = [
("AL", "FL"), ("AL", "GA"), ("AL", "MS"), ("AL", "TN"),
("AZ", "CA"), ("AZ", "CO"), ("AZ", "NV"), ("AZ", "NM"), ("AZ", "UT"),
("AR", "LA"), ("AR", "MS"), ("AR", "MO"), ("AR", "OK"), ("AR", "TN"), ("AR", "TX"),
("CA", "NV"), ("CA", "OR"),
("CO", "KS"), ("CO", "NE"), ("CO", "NM"), ("CO", "OK"), ("CO", "UT"), ("CO", "WY"),
("CT", "MA"), ("CT", "NY"), ("CT", "RI"),
("DE", "MD"), ("DE", "NJ"), ("DE", "PA"),
("FL", "GA"),
("GA", "NC"), ("GA", "SC"), ("GA", "TN"),
("ID", "MT"), ("ID", "NV"), ("ID", "OR"), ("ID", "UT"), ("ID", "WA"), ("ID", "WY"),
("IL", "IN"), ("IL", "IA"), ("IL", "KY"), ("IL", "MO"), ("IL", "WI"),
("IN", "KY"), ("IN", "MI"), ("IN", "OH"),
("IA", "MN"), ("IA", "MO"), ("IA", "NE"), ("IA", "SD"), ("IA", "WI"),
("KS", "MO"), ("KS", "NE"), ("KS", "OK"),
("KY", "MO"), ("KY", "OH"), ("KY", "TN"), ("KY", "VA"), ("KY", "WV"),
("LA", "MS"), ("LA", "TX"),
("ME", "NH"),
("MD", "PA"), ("MD", "VA"), ("MD", "WV"),
("MA", "NH"), ("MA", "NY"), ("MA", "RI"), ("MA", "VT"),
("MI", "OH"), ("MI", "WI"),
("MN", "ND"), ("MN", "SD"), ("MN", "WI"),
("MS", "TN"),
("MO", "NE"), ("MO", "OK"), ("MO", "TN"),
("MT", "ND"), ("MT", "SD"), ("MT", "WY"),
("NE", "SD"), ("NE", "WY"),
("NV", "OR"), ("NV", "UT"),
("NH", "VT"),
("NJ", "NY"), ("NJ", "PA"),
("NM", "OK"), ("NM", "TX"), ("NM", "UT"),
("NY", "PA"), ("NY", "VT"),
("NC", "SC"), ("NC", "TN"), ("NC", "VA"),
("ND", "SD"),
("OH", "PA"), ("OH", "WV"),
("OK", "TX"),
("OR", "WA"),
("PA", "WV"),
("SD", "WY"),
("TN", "VA"),
("TX", "NM"),
("UT", "WY"),
("VA", "WV")
]
Λύση άσκησης E7A2
| e7a2.py | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | |
Αποτέλεσμα εκτέλεσης E7A2
Βρέθηκε χρωματισμός:
AL -> Κίτρινο
AZ -> Μπλε
AR -> Κίτρινο
CA -> Κίτρινο
CO -> Κίτρινο
CT -> Πράσινο
DE -> Κόκκινο
FL -> Κόκκινο
GA -> Μπλε
ID -> Κίτρινο
IL -> Κίτρινο
IN -> Πράσινο
IA -> Κόκκινο
KS -> Κόκκινο
KY -> Μπλε
LA -> Μπλε
ME -> Πράσινο
MD -> Μπλε
MA -> Κόκκινο
MI -> Κίτρινο
MN -> Μπλε
MS -> Πράσινο
MO -> Πράσινο
MT -> Μπλε
NE -> Μπλε
NV -> Πράσινο
NH -> Κίτρινο
NJ -> Κίτρινο
NM -> Πράσινο
NY -> Μπλε
NC -> Κίτρινο
ND -> Κόκκινο
OH -> Κόκκινο
OK -> Μπλε
OR -> Κόκκινο
PA -> Πράσινο
RI -> Μπλε
SC -> Κόκκινο
SD -> Κίτρινο
TN -> Κόκκινο
TX -> Κόκκινο
UT -> Κόκκινο
VT -> Πράσινο
VA -> Πράσινο
WA -> Μπλε
WV -> Κίτρινο
WI -> Πράσινο
WY -> Πράσινο
Άσκηση Ε7Α3 - Να γραφεί πρόγραμμα σε Python με χρήση του OR-Tools CP-SAT solver για την επίλυση του προβλήματος των Ν βασιλισσών. Το πρόγραμμα πρέπει να τοποθετεί N βασίλισσες σε μια σκακιέρα διαστάσεων N x N, έτσι ώστε καμία βασίλισσα να μην απειλεί κάποια άλλη, δηλαδή να μην υπάρχουν δύο βασίλισσες στην ίδια γραμμή, στην ίδια στήλη ή στην ίδια διαγώνιο. Θεωρήστε αρχικά N = 8, αλλά το πρόγραμμα θα πρέπει να μπορεί να εκτελεστεί και για διαφορετικές τιμές του N. Να μοντελοποιήσετε το πρόβλημα με μεταβλητές απόφασης και περιορισμούς, να καλέσετε τον solver και να εμφανίσετε μία εφικτή λύση σε μορφή σκακιέρας, χρησιμοποιώντας το σύμβολο Q για τις θέσεις των βασιλισσών και το σύμβολο . για τα κενά τετράγωνα.
Λύση άσκησης E7A3
Αποτέλεσμα εκτέλεσης E7A3
Άσκηση Ε7Α4 - Προγραμματισμός εργασιών σε μία μηχανή με ελαχιστοποίηση συνολικής καθυστέρησης
Να γραφεί πρόγραμμα σε Python με χρήση του OR-Tools CP-SAT solver για τον προγραμματισμό ενός συνόλου εργασιών σε μία μηχανή. Κάθε εργασία έχει γνωστό χρόνο επεξεργασίας, βάρος και προθεσμία ολοκλήρωσης, ενώ η μηχανή μπορεί να εκτελεί μόνο μία εργασία κάθε χρονική στιγμή. Το πρόγραμμα πρέπει να αποφασίζει τη σειρά εκτέλεσης των εργασιών, να υπολογίζει τον χρόνο έναρξης και ολοκλήρωσης κάθε εργασίας και να εξασφαλίζει ότι δεν υπάρχουν επικαλύψεις μεταξύ των εργασιών. Στόχος είναι η ελαχιστοποίηση της συνολικής σταθμισμένης καθυστέρησης: \(\sum_j{w_jT_j}\), όπου η καθυστέρηση μιας εργασίας ορίζεται ως \(T_j = \max(C_j - d_j, 0)\), με \(C_j\) τον χρόνο ολοκλήρωσης και \(d_j\) την προθεσμία της εργασίας.
A) Επιλύστε την άσκηση για τα ακόλουθα δεδομένα:
# Εργασίες 0 έως 9
processing_times = [12, 8, 15, 6, 20, 7, 10, 14, 9, 11]
weights = [4, 2, 5, 3, 6, 1, 4, 7, 2, 5]
due_dates = [25, 20, 35, 18, 45, 30, 28, 40, 32, 38]
Λύση άσκησης E7A4Α
| e7a4.py | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | |
Αποτέλεσμα εκτέλεσης E7A4A
Κατάσταση λύσης: OPTIMAL
Τιμή αντικειμενικής συνάρτησης: 892
Πρόγραμμα εκτέλεσης:
Job | Start | End | p_j | d_j | w_j | T_j | w_j*T_j
----------------------------------------------------------
3 | 0 | 6 | 6 | 18 | 3 | 0 | 0
0 | 6 | 18 | 12 | 25 | 4 | 0 | 0
6 | 18 | 28 | 10 | 28 | 4 | 0 | 0
7 | 28 | 42 | 14 | 40 | 7 | 2 | 14
9 | 42 | 53 | 11 | 38 | 5 | 15 | 75
2 | 53 | 68 | 15 | 35 | 5 | 33 | 165
4 | 68 | 88 | 20 | 45 | 6 | 43 | 258
1 | 88 | 96 | 8 | 20 | 2 | 76 | 152
8 | 96 | 105 | 9 | 32 | 2 | 73 | 146
5 | 105 | 112 | 7 | 30 | 1 | 82 | 82
Σειρά εργασιών: [3, 0, 6, 7, 9, 2, 4, 1, 8, 5]
B) Επιλύστε το ίδιο πρόβλημα για τα αρχεία wt40.txt, wt50.txt και wt100.txt που περιέχουν το καθένα 125 στιγμιότυπα προβλημάτων με 40, 50 και 100 εργασίες αντίστοιχα από το δημόσιο benchmark single-machine total weighted tardiness της OR-Library. Κάθε στιγμιότυπο περιέχει με τη σειρά, τους χρόνους επεξεργασίας, τα βάρη και τις προθεσμίες των εργασιών.
Λύση άσκησης E7A4Β
| e7a4.py | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | |
Αποτέλεσμα εκτέλεσης E7A4A για το στιγμιότυπο 1 του wt40.txt
Κατάσταση: OPTIMAL
Τιμή αντικειμενικής συνάρτησης: 913
Καλύτερο κάτω φράγμα: 913
Χρόνος επίλυσης: 18.173 sec
Σειρά εργασιών:
[18, 25, 37, 11, 6, 24, 19, 10, 16, 35, 38, 36, 29, 5, 9, 22, 34, 21, 33, 32, 15, 4, 14, 26, 3, 27, 13, 30, 1, 0, 2, 8, 23, 20, 28, 17, 31, 39, 7, 12]
Job | Start | End | p_j | w_j | d_j | T_j | w_j*T_j
------------------------------------------------------------------------
18 | 0 | 90 | 90 | 4 | 1484 | 0 | 0
25 | 90 | 185 | 95 | 5 | 1509 | 0 | 0
37 | 185 | 194 | 9 | 10 | 1446 | 0 | 0
11 | 194 | 240 | 46 | 3 | 1539 | 0 | 0
6 | 240 | 313 | 73 | 3 | 1566 | 0 | 0
24 | 313 | 398 | 85 | 9 | 1522 | 0 | 0
19 | 398 | 453 | 55 | 7 | 1559 | 0 | 0
10 | 453 | 539 | 86 | 7 | 1599 | 0 | 0
16 | 539 | 603 | 64 | 7 | 1582 | 0 | 0
35 | 603 | 671 | 68 | 7 | 1497 | 0 | 0
38 | 671 | 720 | 49 | 1 | 1579 | 0 | 0
36 | 720 | 790 | 70 | 5 | 1481 | 0 | 0
29 | 790 | 876 | 86 | 4 | 1628 | 0 | 0
5 | 876 | 911 | 35 | 4 | 1487 | 0 | 0
9 | 911 | 978 | 67 | 3 | 1636 | 0 | 0
22 | 978 | 1014 | 36 | 5 | 1512 | 0 | 0
34 | 1014 | 1044 | 30 | 7 | 1541 | 0 | 0
21 | 1044 | 1096 | 52 | 3 | 1510 | 0 | 0
33 | 1096 | 1108 | 12 | 5 | 1528 | 0 | 0
32 | 1108 | 1147 | 39 | 9 | 1627 | 0 | 0
15 | 1147 | 1241 | 94 | 4 | 1660 | 0 | 0
4 | 1241 | 1273 | 32 | 10 | 1694 | 0 | 0
14 | 1273 | 1302 | 29 | 10 | 1709 | 0 | 0
26 | 1302 | 1316 | 14 | 2 | 1598 | 0 | 0
3 | 1316 | 1362 | 46 | 10 | 1773 | 0 | 0
27 | 1362 | 1440 | 78 | 8 | 1658 | 0 | 0
13 | 1440 | 1480 | 40 | 3 | 1645 | 0 | 0
30 | 1480 | 1524 | 44 | 7 | 1650 | 0 | 0
1 | 1524 | 1548 | 24 | 10 | 1620 | 0 | 0
0 | 1548 | 1574 | 26 | 1 | 1588 | 0 | 0
2 | 1574 | 1653 | 79 | 9 | 1731 | 0 | 0
8 | 1653 | 1667 | 14 | 10 | 1727 | 0 | 0
23 | 1667 | 1736 | 69 | 4 | 1795 | 0 | 0
20 | 1736 | 1771 | 35 | 5 | 1772 | 0 | 0
28 | 1771 | 1808 | 37 | 10 | 1826 | 0 | 0
17 | 1808 | 1835 | 27 | 7 | 1836 | 0 | 0
31 | 1835 | 1863 | 28 | 4 | 1833 | 30 | 120
39 | 1863 | 1913 | 50 | 3 | 1814 | 99 | 297
7 | 1913 | 1987 | 74 | 2 | 1844 | 143 | 286
12 | 1987 | 2065 | 78 | 1 | 1855 | 210 | 210