Βελτιστοποίηση σε τρίλιζα Καταδίωξη/διαφυγή ΒΕΛΤΙΣΤΟΠΟΙΗΣΗ Ένα απλό παράδειγμα Βελτιστοποίηση σε τρίλιζα Καταδίωξη/διαφυγή (με ορατό ή αόρατο φυγά)
Ας παίξουμε! Δύο παίκτες Ο 1ος παίκτης διαλέγει τον αριθμό 1 ή 2 Το ίδιο και ο 2ος και ο αριθμός του προστίθεται στου πρώτου. Παίζουν εναλλάξ αυξάνοντας τον αριθμό κατά 1 ή 2 Όποιος φτάσει πρώτος στο 10 κερδίζει
Ας παίξουμε! LIVE!
Δέντρο παιχνιδιού 1 2 2 3 3 4 4 5 1 2 1 2 1 2 1 2 1ος παίκτης 1 2 1ος παίκτης 1 2 2ος παίκτης 1 2 2 3 1 2 1ος 3 4 1 2 2ος 4 5
Δέντρο παιχνιδιού 1 2 1ος 1 2 1 2ος 2 2 3 1 1ος 2 3 4 1 2 2ος 4 5
Δέντρο παιχνιδιού 1 2 1ος 1ος 1 2 1 2ος 2 2 3 1 1ος 1ος 2 3 4 1 2 2ος 1 2 1ος 1ος 1 2 1 2ος 2 2 3 1 1ος 1ος 2 3 4 1 2 2ος 4 5 1 2 1ος 5 6 2ος 1 2 1 6 7 7 1ος 1 7
Δέντρο παιχνιδιού 1 2 1ος 1ος 1 2 1 2ος 2 2 3 1 1ος 1ος 2 3 4 1 2 2ος 1 2 1ος 1ος 1 2 1 2ος 2 2 3 1 1ος 1ος 2 3 4 1 2 2ος 4 5 1 2 1ος 1 2 5 6 6 7 2ος 1 2 1 1 6 7 7 7 1ος 1 7
Δέντρο παιχνιδιού 1 2 1ος 1ος 1 2 1 2ος 2 2 3 1 1ος 1ος 2 3 4 1 2 2ος 1 2 1ος 1ος 1 2 1 2ος 2 2 3 1 1ος 1ος 2 3 4 1 2 2ος 1 2 4 5 5 6 1 2 1ος 1 2 1 2 1 5 6 6 7 6 7 7 2ος 1 2 1 1 1 6 7 7 7 7 1ος 1 7
Δέντρο παιχνιδιού 1 2 1ος 1ος 1 2 1 2ος 2 2 3 1 1ος 1ος 2 1 2 3 4 4 5 1 2 1ος 1ος 1 2 1 2ος 2 2 3 1 1ος 1ος 2 1 2 3 4 4 5 1 2 1 2ος 1 2 2 1 2 4 5 5 6 5 6 6 7 1 2 1ος 1 2 1 2 1 1 2 1 1 5 6 6 7 6 7 7 6 7 7 7 2ος 1 2 1 1 1 1 6 7 7 7 7 7 1ος 1 7
Δέντρο παιχνιδιού 1 2 1ος 1ος 1 2 1 2ος 2 1 2 2 3 3 4 1 1ος 1ος 2 1 2 1 2 1ος 1ος 1 2 1 2ος 2 1 2 2 3 3 4 1 1ος 1ος 2 1 2 1 2 1 2 3 4 4 5 4 5 5 6 1 2 1 2 2ος 1 2 2 1 2 1 1 2 1 2 1 4 5 5 6 5 6 6 7 5 6 6 7 6 7 7 1 2 1ος 1 2 1 2 1 1 2 1 1 1 2 1 1 1 5 6 6 7 6 7 7 6 7 7 7 6 7 7 7 7 2ος 1 2 1 1 1 1 1 6 7 7 7 7 7 7 1ος 1 7
Δέντρο παιχνιδιού 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 4 5 5 6 5 6 6 7 5 6 6 7 6 7 7 1ος 5 6 6 7 6 7 7 6 7 7 7 6 7 7 7 7 2ος 6 7 7 7 7 7 7 1ος 7
Δέντρο παιχνιδιού 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 4 5 5 6 5 6 6 7 5 6 6 7 6 7 7 1ος 5 6 6 7 6 7 7 6 7 7 7 6 7 7 7 7 2ος 6 7 7 7 7 7 7 1ος 7
Δέντρο παιχνιδιού 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 4 5 5 6 5 6 6 7 5 6 6 7 6 7 7 1ος 5 6 6 7 6 7 7 6 7 7 7 6 7 7 7 7 2ος 6 7 7 7 7 7 7 1ος 7
Δέντρο παιχνιδιού 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 4 5 5 6 5 6 6 7 5 6 6 7 6 7 7 1ος 5 6 6 7 6 7 7 6 7 7 7 6 7 7 7 7 2ος 6 7 7 7 7 7 7 1ος 7
Δέντρο παιχνιδιού 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 4 5 5 6 5 6 6 7 5 6 6 7 6 7 7 1ος 5 6 6 7 6 7 7 6 7 7 7 6 7 7 7 7 2ος 6 7 7 7 7 7 7 1ος 7
Δέντρο παιχνιδιού 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 1ος 1ος 1 2 2ος 2 3 3 4 1ος 1ος 3 4 4 5 4 5 5 6 2ος 4 5 5 6 5 6 6 7 5 6 6 7 6 7 7 1ος 5 6 6 7 6 7 7 6 7 7 7 6 7 7 7 7 2ος 6 7 7 7 7 7 7 1ος 7
Τρίλιζα
Τρίλιζα Υπάρχει δέντρο παιχνιδιού για την τρίλιζα? Ποιο είναι το βάθος του δέντρου? Είναι σταθερό το βάθος? Πόσες διακλαδώσεις υπάρχουν σε κάθε βήμα?
Τρίλιζα δέντρο 1 1ος παίκτης (επιλέγει maximum) -1 -1 1 2ος παίκτης (επιλέγει minimum) 1 -1 -1 1 1 -1 -1 1 1 1 1
Τρίλιζα Όλο το δέντρο έχει χοντρικά 9! = 360000 τελικούς κόμβους Για την ακρίβεια έχει 549.946 κόμβους (58.924 αν λάβουμε υπόψη τη συμμετρία) Πρακτικά εφαρμόσιμη μέθοδος μόνο για υπολογιστή!
O αλγόριθμος… με απλά λόγια Αλγόριθμος Βρες_Αξία Αν είναι τελικός κόμβος Αν είναι νίκη του Χ: Αξία = 1 Αν είναι νίκη του Ο: Αξία = -1 Αν είναι ισοπαλία: Αξία = 0 Αν δεν είναι τελικός κόμβος Για όλες τις δυνατές κινήσεις: Υπολογίζουμε την αξία του κάθε κόμβου που προκύπτει Αν είναι σειρά του Χ βρίσκουμε το μέγιστο των παραπάνω Αν είναι σειρά του Ο βρίσκουμε το ελάχιστο των παραπάνω Αυτό θα γίνει με τον ίδιο αλγόριθμο
Αναδρομικές διαδικασίες Πρόβλημα Α1 Πρόβλημα Β1 Πρόβλημα Β2 Πρόβλημα Β3 Γ1 Γ2 Γ3 Γ4 Γ5 Γ6 Γ7 Γ8 Γ9
O αλγόριθμος… με απλά λόγια Αλγόριθμος Βρες_Αξία Αν είναι τελικός κόμβος Αν είναι νίκη του Χ: Αξία = 1 Αν είναι νίκη του Ο: Αξία = -1 Αν είναι ισοπαλία: Αξία = 0 Αν δεν είναι τελικός κόμβος Για όλες τις δυνατές κινήσεις: Υπολογίζουμε την αξία του κάθε κόμβου που προκύπτει Αν είναι σειρά του Χ βρίσκουμε το μέγιστο των παραπάνω Αν είναι σειρά του Ο βρίσκουμε το ελάχιστο των παραπάνω
Αλγόριθμος - Ψευδοκώδικας function Value (A[3][3], player) if (A[1][1] + A[1][2] + A[1][3] == 3) or (A[2][1] + A[2][2] + A[2][3] == 3) or …. Value = 1 else if (A[1][1] + A[1][2] + A[1][3] == -3) or (A[2][1] + A[2][2] + A[2][3] == -3) or …. Value = -1 else if (A[1][1] * A[1][2] * A[1][3] * … * A[3][3] != 0) Value = 0 end if Συνέχεια…
Ψευδοκώδικας - Συνέχεια if (player==1) bestValue = -1 // Initialize bestValue if (player==2) bestValue = 1 for (i=1 to 3) for(j=1 to 3) if (A[i][j]==0) // Is free square? A[i][j] = 3 - 2*player // Play the move new_player = 3 – player // Decide next player tempValue = Value(A, new_player) if (tempValue > bestValue AND player==1) bestValue = tempValue else if (tempValue < bestValue AND player==2) end if A[i][j] = 0 // Take back move end for
Πώς γίνεται στην πράξη; Υλοποίηση του αλγορίθμου σε C Εύκολα γραφικά με Visual Basic Δημιουργία .dll με τον κώδικα C και κλήση από Visual Basic!
Τεχνικές λεπτομέρειες Στη C/C++: Δημιουργία dll project Γράφουμε κανονικά τις συναρτήσεις δηλώνοντάς τες ως extern (πχ “extern int myFunc(int var1)”) Στη Visual Basic: Δηλώνουμε στις γενικές μεταβλητές ότι θα χρησιμοποιήσουμε την αντίστοιχη συνάρτηση: Private Declare Function myFunc Lib “path\filename.dll" (ByVal var1 As Long) As Long Καλούμε τη συνάρτηση όποτε θέλουμε όπως και στη C (πχ “b=myFunc(a)”)