You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: Homework_6/homework.tex
+23-23Lines changed: 23 additions & 23 deletions
Original file line number
Diff line number
Diff line change
@@ -59,11 +59,11 @@
59
59
\subsection*{1. Define the 0-1 knapsack problem.}
60
60
61
61
Το knapsack problem είναι κλασσικό πρόβλημα βελτιστοποίησης. Υπάρχουν διαθέσιμα αντκείμενα, που το καθένα έχει συγκεκριμένη αξία και βάρος και διαθέσιμα σακίδια (ή ένα σακίδιο) και στόχος είναι να τοποθετηθούν τα αντικείμενα στο σακίδιο με τέτοιον τρόπο, ώστε να μεγιστοποιηθεί η συνολική αξία των αντικειμένων, χωρίς να παραβιαζεται η χωρητικότητα του σακιδίου. \\\\
62
-
62
+
63
63
Έχει διάφορες παραλλαγές ως πρόβλημα, που σχετίζονται με την κατανομή των αντικειμένων και των σακιδίων. Σε κάποια είδη προβλημάτων σακιδίου τα αντικείμενα μπορούν να χρησιμοποιηθούν μόνο μία φορά το καθένα, ενώ σε κάποια άλλα υπάρχει μια περιορισμένη ποσότητα από κάθε αντικείμενο. Επίσης, υπάρχει η δυνατότητα σε κάποια είδη προβλημάτων να επιλέξουμε κλάσματα αντικειμένων, ενώ σε άλλα είμαστε υποχρεωμένοι αν επιλέξουμε ένα αντικείμενο να το τοποθετήσουμε ολόκληρο στο σακίδιο. Τέλος, υπάρχει η παραλλαγή την πολλαπλής επιλογή του ίδιου αντικειμένου και η παραλλαγή που απαγορεύεται αυστηρώς να επιλέξουμε το ίδιο αντικείμενο δεύτερη φορά. \\ \\
64
64
65
65
Μπορούμε να συνοψίσουμε τα είδη των knapsack προβλημάτων ως προς τη δυνατότητα επιλογής αντικειμένων ως εξής: \\
\caption{Ποιά είναι η καλύτερη επιλογή αντικειμένων;}
86
86
\end{figure}
87
87
@@ -101,17 +101,17 @@ \subsection*{1. Define the 0-1 knapsack problem.}
101
101
102
102
\begin{align*}
103
103
\max\sum_{j=1}^{n}{p_{j}x_{j}}
104
-
\end{align*}
104
+
\end{align*}
105
105
υπό τον περιορισμό:
106
106
107
107
\begin{align*}
108
108
\sum_{j=1}^{n}{w_{j}x_{j}} \leq C
109
109
\end{align*}
110
110
111
111
όπου \(x_{j}\) είναι μία δυαδική μεταβλητή που δηλώνει αν έχουμε τοποθετήσει το \(j\)-οστό αντικείμενο στο σακίδιο.
112
-
113
-
\[ x_{j} =
114
-
\begin{cases}
112
+
113
+
\[ x_{j} =
114
+
\begin{cases}
115
115
1 & \text{αν το j-οστό αντικείμενο τοποθετηθεί στο σακίδιο} \\
116
116
0 & \text{αν το j-οστό αντικείμενο ΔΕΝ τοποθετηθεί στο σακίδιο}
117
117
\end{cases}
@@ -124,7 +124,7 @@ \subsection*{1. Define the 0-1 knapsack problem.}
124
124
w_{j} \geq 0 \\
125
125
C \geq 0 \\
126
126
w_{j} \leq c \\
127
-
\sum_{j=1}^{n} w_{j} \geq C
127
+
\sum_{j=1}^{n} w_{j} \geq C
128
128
\end{align*}
129
129
130
130
\vspace{2in}
@@ -146,7 +146,7 @@ \subsection*{2. Give a dynamic programming solution to the 0-1 knapsack problem.
146
146
έως το n και σε κάθε υποπρόβλημα m, υπολογίζεται η τιμή \(f_{m}(c)\) καθώς το
147
147
c μεγαλώνει από το 0 έως το C. \\\\
148
148
149
-
Η βέλτιστη λύση για αυτό το στιγμιότυπο είναι:
149
+
Η βέλτιστη λύση για αυτό το στιγμιότυπο είναι:
150
150
\begin{align*}
151
151
f_{m}(c) = \max {\sum_{j=1}^{m}{p_{j}x_{j}}} \text{ όπου } \\
152
152
\sum_{j=1}^{m}{w_{j}x_{j}} \leq c \\
@@ -155,8 +155,8 @@ \subsection*{2. Give a dynamic programming solution to the 0-1 knapsack problem.
155
155
156
156
και ισχύει ότι
157
157
158
-
\[ f_{m}(c) =
159
-
\begin{cases}
158
+
\[ f_{m}(c) =
159
+
\begin{cases}
160
160
f_{m-1}(c) & \text{ για } c = 0,...,w_{m}-1 \\
161
161
\max\left( f_{m-1}(c), f_{m-1}(c-w_{m}) + p_{j} \right) & \text{ για } c = w_{m},...,C
162
162
\end{cases}
@@ -167,7 +167,7 @@ \subsection*{2. Give a dynamic programming solution to the 0-1 knapsack problem.
167
167
\(\textbf{Βήμα 1:}\)\\
168
168
Κατασκευάζουμε έναν πίνακα \((n+1) \times (c+1)\). Η γραμμή j υποδηλώνει ότι έχουμε στη διάθεσή μας μόνο αντικείμενα 1,...,j. Η στήλη i υποδηλώνει ότι έχουμε χωρητικότητα σακιδίου i. Συνεπώς, αν ονομάζουμε τον πίνακα Κ, τότε το Κ[j][i] στοιχείο του πίνακα είναι η μεγαλύτερη "αξία" που μπορούμε να αποκομίσουμε από τα αντικείμενα 1,...,j με σακίδιο χωρητικότητας i. \\
169
169
\(\textbf{Βήμα 2:}\)\\
170
-
Τοποθετούμε τις αρχικές τιμές στον πίνακα, που δε χρειάζονται ιδιαίτερη υπολογιστική διαδικασία. Τα κελιά του πίνακα που μπορούμε να συμπληρώσουμε αμέσως είναι η γραμμή 0, όπου αν δεν έχουμε κανένα αντικείμενο, θα έχουμε 0 τελική αξία και η στήλη 0, όπου αν το σακίδιο έχει μηδενική χωρητικότητα δε μπορούμε να αποθηκεύσουμε κανένα αντικείμενο. \\
170
+
Τοποθετούμε τις αρχικές τιμές στον πίνακα, που δε χρειάζονται ιδιαίτερη υπολογιστική διαδικασία. Τα κελιά του πίνακα που μπορούμε να συμπληρώσουμε αμέσως είναι η γραμμή 0, όπου αν δεν έχουμε κανένα αντικείμενο, θα έχουμε 0 τελική αξία και η στήλη 0, όπου αν το σακίδιο έχει μηδενική χωρητικότητα δε μπορούμε να αποθηκεύσουμε κανένα αντικείμενο. \\
171
171
\(\textbf{Βήμα 3:}\)\\
172
172
Υπολογίζουμε την τιμή για το κελι Κ[j][i], λαμβάνοντας υπόψη τα προηγούμενα κελιά. Υπάρχουν δύο εκδοχές, είτε να τοποθετήσουμε το αντικείμενο j στο σακίδιο, είτε όχι. Αν δεν τοποθετήσουμε το αντικείμενο στο σακίδιο, τότε η μέγιστη τιμή που μπορούμε να λάβουμε στη συγκεκριμένη περίπτωση βρίσκεται στο Κ[j-1][i]. Αν επιλέξουμε να τοποθετήσουμε το αντικείμενο στο σακίδιο (αυτό σημαίνει ότι τα βάρος του είναι κατάλληλο σε σχέση με τη χωρητικότητα που έχει τη δεδομένη στιγμή το σακίδιο), τότε το κελί Κ[j][i] είναι ίσο με την αξία του αντικειμένου j συν τη μέγιστη αξία που έχει προκύψει από τα προηγούμενα αντικείμενα, που χωρούν να μπούν στο σακίδιο μετά την καταχώρηση του j-οστού αντικειμένου στο σακίδιο. Συμπληρώνουμε όλον τον πίνακα. (Σημείωση: θέλουμε να χρησιμοποιήσουμε όλη τη χωρητικότητα του σακιδίου ή έστω να κάνουμε όσο καλύτερη δυνατή εκμετάλλευση του χώρου του). \\
173
173
\(\textbf{Βήμα 4:}\)\\
@@ -186,7 +186,7 @@ \subsection*{3. Give real world applications of knapsack problem.}
186
186
187
187
\(\bullet\) Η αποθήκευση εμπορευμάτων σε αποθήκες. Ο χώρος της αποθήκης είναι καθορισμένος και δεν μεταβάλλεται και πρέπει σε αυτόν το χώρο να μπορέσουν να χωρέσουν όσο το δυνατό περισσότερα εμπορεύματα. Απλουστεύοντας τα δεδομένα, μπορόυμε να υποθέσουμε ότι περισσότερα προϊόντα στην αποθήκη, σημαίνει αύξηση των κερδών της επιχείρησης. \\
188
188
189
-
\(\bullet\) Οι κατάλληλες επενδύσεις. Έστω ότι επιθυμούμε να επενδύσουμε όλα ή ένα μέρος από τα κεφάλαια. Έχουμε να επιλέξουμε ανάμεσα σε κάποιες πιθανές επενδύσεις. Κάθε επένδυση έχει ένα συγκεκριμένο κόστος και ένα αναμενόμενο κέρδος. Η βέλτιστη επιλογή μπορεί να βρεθεί με το πρόβλημα του σακιδίου. \\
189
+
\(\bullet\) Οι κατάλληλες επενδύσεις. Έστω ότι επιθυμούμε να επενδύσουμε όλα ή ένα μέρος από τα κεφάλαια. Έχουμε να επιλέξουμε ανάμεσα σε κάποιες πιθανές επενδύσεις. Κάθε επένδυση έχει ένα συγκεκριμένο κόστος και ένα αναμενόμενο κέρδος. Η βέλτιστη επιλογή μπορεί να βρεθεί με το πρόβλημα του σακιδίου. \\
190
190
191
191
\(\bullet\) Η επιλογή υπαλλήλων για μία επιχείρηση. Υπάρχουν πολλοί εν δυνάμει υπάλληλοι, με διαφορετικές ικανότητες, ταλέντα, γνώσεις, πτυχία και πιστοποιήσεις, αλλά ταυτόχρονα και με διαφορετικές μισθολογικές απαιτήσεις. Η επιχείρηση είναι σε θέση να διαθέτει ένας συγκεκριμένο ποσό για μισθοδοσίες και μπορεί να παρέχει καθορισμένες παροχές στους εργαζομένους της (π.χ. κτηριακές υποδομές). Ποιά είναι η καλύτερη επιλογή εργαζομένων, ώστε η επιχείρηση να αυξήσει τα κέρδη της; \\
192
192
@@ -196,7 +196,7 @@ \subsection*{3. Give real world applications of knapsack problem.}
@@ -212,24 +212,24 @@ \subsection*{4. Define the Subset sum problem and give a dynamic programming sol
212
212
213
213
Το Subset sum problem ή αλλιώς Value Independent Knapsack Problem ή Stickstacking Problem μπορεί να θεωρηθεί στιγμιότυπο του 0-1 Knapsack problem. Πρέπει να επιλέξουμε ένα υποσύνολο βαρών, τέτοιο ώστε το άθροισμά τους να είναι το μεγαλύτερο δυνατό και ταυτόχρονα να μην υπερβαίνει τη χωρητικότητα του σακιδίου. \\\\
214
214
215
-
Έστω ότι έχουμε n αντικείμενα συνολικά και ένα σακίδιο χωρητικότητας C. Κάθε αντικείμενο j έχει βάρος \(w_{j}\). Στόχος είναι να επιλεγεί ένα υποσύνολο αντικειμένων τέτοιο ώστε το συνολικό βάρος τους να είναι ίσο ή να μη ξεπερνά τη χωρητικότητα του σακιδίου. \\\\
215
+
Έστω ότι έχουμε n αντικείμενα συνολικά και ένα σακίδιο χωρητικότητας C. Κάθε αντικείμενο j έχει βάρος \(w_{j}\). Στόχος είναι να επιλεγεί ένα υποσύνολο αντικειμένων τέτοιο ώστε το συνολικό βάρος τους να είναι ίσο ή να μη ξεπερνά τη χωρητικότητα του σακιδίου. \\\\
216
216
217
217
Η μαθηματική μοντελοποίηση όσων αναφέραμε είναι: \\
218
218
219
219
\begin{align*}
220
220
\max\sum_{j=1}^{n}{w_{j}x_{j}}
221
-
\end{align*}
221
+
\end{align*}
222
222
223
223
υπό τον περιορισμό:
224
224
225
225
\begin{align*}
226
226
\sum_{j=1}^{n}{w_{j}x_{j}} \leq C
227
227
\end{align*}
228
228
229
-
με
229
+
με
230
230
231
-
\[ x_{j} =
232
-
\begin{cases}
231
+
\[ x_{j} =
232
+
\begin{cases}
233
233
1 & \text{αν το j-οστό αντικείμενο τοποθετηθεί στο σακίδιο} \\
234
234
0 & \text{αν το j-οστό αντικείμενο ΔΕΝ τοποθετηθεί στο σακίδιο}
235
235
\end{cases}
@@ -241,7 +241,7 @@ \subsection*{4. Define the Subset sum problem and give a dynamic programming sol
241
241
w_{j} \geq 0 \\
242
242
C \geq 0 \\
243
243
w_{j} \leq c \\
244
-
\sum_{j=1}^{n} w_{j} \geq C
244
+
\sum_{j=1}^{n} w_{j} \geq C
245
245
\end{align*}
246
246
247
247
Ουσιαστικά, το Subset sum problem είναι ειδική περίπτωση του 0-1 Knapsack problem. Το 0-1 Knapsack problem γίνεται Subset sum problem αν η "αξία" στην περίπτωση του 0-1 Knapsack problem είναι ταυτόσημη με το βάρος του του j-οστού αντικειμένου, \(p_{j} = w_{j}, \forall j\). \\\\
@@ -251,9 +251,9 @@ \subsection*{4. Define the Subset sum problem and give a dynamic programming sol
251
251
\(\textbf{Βήμα 1:}\)\\
252
252
Κατασκευάζουμε έναν πίνακα \((n+1) \times (c+1)\), στον οποίο καταχωρίζουμε true ή false. Η γραμμή j υποδηλώνει ότι έχουμε στη διάθεσή μας μόνο τους αριθμούς 1,...,j. Η στήλη i υποδηλώνει ότι θέλουμε να επιτύχουμε άθροισμα i. Συνεπώς, αν ονομάζουμε τον πίνακα Κ, τότε το Κ[j][i] στοιχείο του πίνακα δηλώνει αν μπορούμε ή όχι να επιτύχουμε άθροισμα ίσο με i, με διαθέσιμους προσθεταίoυς τους αριθμους 1,...,j. \\
253
253
\(\textbf{Βήμα 2:}\)\\
254
-
Τοποθετούμε τις αρχικές τιμές στον πίνακα, που δε χρειάζονται ιδιαίτερη υπολογιστική διαδικασία. Τα κελιά του πίνακα που μπορούμε να συμπληρώσουμε αμέσως είναι εκείνα της γραμμής 0,με false, καθώς αν δεν έχουμε κανέναν διαθέσιμο αριθμό, δε μπορούμε να επιτύχουμε άθροισμα και της στήλης 0, με true, αφού το άθροισμα του κενού υποσυνόλου είναι 0. \\
254
+
Τοποθετούμε τις αρχικές τιμές στον πίνακα, που δε χρειάζονται ιδιαίτερη υπολογιστική διαδικασία. Τα κελιά του πίνακα που μπορούμε να συμπληρώσουμε αμέσως είναι εκείνα της γραμμής 0,με false, καθώς αν δεν έχουμε κανέναν διαθέσιμο αριθμό, δε μπορούμε να επιτύχουμε άθροισμα και της στήλης 0, με true, αφού το άθροισμα του κενού υποσυνόλου είναι 0. \\
255
255
\(\textbf{Βήμα 3:}\)\\
256
-
Υπολογίζουμε την τιμή για το κελι Κ[j][i], λαμβάνοντας υπόψη τα προηγούμενα κελιά. Υπάρχουν δύο εκδοχές, είτε να τοποθετήσουμε στο υποσύνολο των προσθεταίων τον αριθμό j, είτε όχι. Αν υπάρχει υποσύνολο ακεραίων από το 1 ως το j-1, τέτοιο ώστε \(\sum_{k=1}^{j-1}k = i\), τότε στο κελί Κ[j][i] τοποθετούμε true, αλλιώς τοποθετούμε false. \\
256
+
Υπολογίζουμε την τιμή για το κελι Κ[j][i], λαμβάνοντας υπόψη τα προηγούμενα κελιά. Υπάρχουν δύο εκδοχές, είτε να τοποθετήσουμε στο υποσύνολο των προσθεταίων τον αριθμό j, είτε όχι. Αν υπάρχει υποσύνολο ακεραίων από το 1 ως το j-1, τέτοιο ώστε \(\sum_{k=1}^{j-1}k = i\), τότε στο κελί Κ[j][i] τοποθετούμε true, αλλιώς τοποθετούμε false. \\
257
257
\(\textbf{Βήμα 4:}\)\\
258
258
Η τελική απάντηση στο Subset sum problem βρίσκεται στη θέση Κ[n+1][c+1].
259
259
@@ -269,7 +269,7 @@ \subsection*{References:}
269
269
270
270
3. "How to solve the Knapsack Problem with dynamic programming", https://medium.com/@fabianterh/how-to-solve-the-knapsack-problem-with-dynamic-programming-eb88c706d3cf \\\\
271
271
272
-
4. "Subset sum problem", https://en.wikipedia.org/wiki/Subset\_sum\_problem \\\\
272
+
4. "Subset sum problem", https://en.wikipedia.org/wiki/Subset\_sum\_problem \\\\
273
273
274
274
5. "Subset Sum Problem using Dynamic Programming (O(N*sum) time complexity)", https://iq.opengenus.org/subset-sum-problem-dynamic-programming/ \\\\
0 commit comments