Version 1.0 (16/03/2017) Σχολή Τεχνολογικών Εφαρμογών (ΣΤΕΦ) Τμήμα Μηχανικών Πληροφορικής Τ.Ε. Διδάσκων: Γκόγκος Χρήστος Μάθημα: Τεχνητή Νοημοσύνη (εργαστήριο Δ εξαμήνου) Ακαδημαϊκό έτος 2016-2017 εαρινό εξάμηνο ΑΣΚΗΣΕΙΣ ΓΙΑ ΤΟ ΕΡΓΑΣΤΗΡΙΟ 3 Άσκηση 1 Να γράψετε πρόγραμμα που να παίζει ένα παιχνίδι Οθέλλο χωρίς την παρέμβαση του χρήστη κατά τη διάρκεια του παιχνιδιού. Το παιχνίδι θα ξεκινά από ένα αρχικό ταμπλό και θα γίνονται αυτόματα τυχαίες έγκυρες κινήσεις και από τους δύο παίκτες εφόσον αυτό είναι δυνατόν. Το παιχνίδι θα ολοκληρώνεται είτε όταν συμπληρωθεί το ταμπλό είτε όταν πλέον δεν θα υπάρχουν έγκυρες κινήσεις οι οποίες θα μπορούσαν να γίνουν και από τους δύο παίκτες. Άσκηση 2 Να γράψετε πρόγραμμα που να παίζει ένα παιχνίδι Οθέλλο ο επιλυτής άλφα-βήτα (παίκτης O) με τον απλό ευρετικό επιλυτή (παίκτης X) του εργαστηρίου. Άσκηση 3 1. Εφαρμόστε τον αλγόριθμο minimax και τον αλγόριθμο άλφα-βήτα στο ακόλουθο δένδρο. 2. Επιβεβαιώστε τα αποτελέσματα που υπολογίσατε με αυτά που δίνει η εκτέλεση του αλγορίθμου άλφα-βήτα στην ιστοσελίδα http://homepage.ufp.pt/jtorres/ensino/ia/alfabeta.html. 3. Τι τιμή θα έπρεπε να έχει κάποιος από τους τερματικούς κόμβους που έχουν προηγηθεί του πρώτου κλαδέματος έτσι ώστε να μη συμβεί το πρώτο κλάδεμα; Άσκηση 4 1. Εφαρμόστε τον αλγόριθμο άλφα-βήτα στο ακόλουθο δένδρο. Ποιοι θα είναι οι κόμβοι που θα κλαδέψει ο αλγόριθμος; 2. Ποια θα είναι η τιμή του κόμβου ρίζα και ποια σειρά ενεργειών θα ακολουθηθεί; 3. Τι τιμή θα έπρεπε να έχει κάποιος από τους τερματικούς κόμβους που έχουν προηγηθεί του πρώτου κλαδέματος έτσι ώστε να μη συμβεί το πρώτο κλάδεμα; 1
Άσκηση 5 Εφαρμόστε τον αλγόριθμο άλφα-βήτα στο ακόλουθο δένδρο. 2
Άσκηση 1 #include "lab03_board.hpp" int main() { default_random_engine gen; gen.seed(time(null)); char **board = initialize_board(); bool flag{false; int moves{0; draw_board(board); while (!flag) { bool player1_moved{false; bool player2_moved{false; vector<pair<int, int>> valid_pairs_x = get_valid_positions(board, 'X'); if (!(valid_pairs_x.empty())) { shuffle(valid_pairs_x.begin(), valid_pairs_x.end(), gen); pair<int, int> p = valid_pairs_x.front(); update_board(board, p.first, p.second, 'X'); player1_moved = true; vector<pair<int, int>> valid_pairs_o = get_valid_positions(board, 'O'); if (!(valid_pairs_o.empty())) { shuffle(valid_pairs_o.begin(), valid_pairs_o.end(), gen); pair<int, int> p = valid_pairs_o.front(); update_board(board, p.first, p.second, 'O'); player2_moved = true; if ((moves == ROWS * COLS - 4) (!player1_moved &&!player2_moved)) flag = true; draw_board(board); lab03_exercise01.cpp g++ lab03_board.cpp lab03_exercise01.cpp -o lab03_exercise01 -std=c++11./lab03_exercise01 0 1 2 3 X O 4 O X 5 6 7 Score X=2 O=2 0 O O X X X X X X 1 O O O O O O O X 2 O X X O X O X X 3 X X X O O X X X 4 X X X O O X O X 5 X O X X X X O X 6 X X X X O O X X 7 X X X X X X X X 3
Score X=43 O=21 Άσκηση 2 #include "lab03_board.hpp" #include "lab03_human.hpp" #include "lab03_solvers.hpp" int main() { char **board = initialize_board(); bool flag{false; int moves{0; draw_board(board); while (!flag) { bool player1_moved{false; bool player2_moved{false; if (!(get_valid_positions(board, 'X').empty())) { computer_move_using_simple_heuristic(board, 'X'); player1_moved = true; if (!(get_valid_positions(board, 'O').empty())) { computer_move_using_alpha_beta(board, 5, 'O'); player2_moved = true; if ((moves == ROWS * COLS - 4) (!player1_moved &&!player2_moved)) flag = true; delete_board(board); lab03_exercise02.cpp g++ lab03_board.cpp lab03_solvers.cpp lab03_exercise02.cpp -o lab03_exercise02 -std=c++11./lab03_exercise01... Computer using heuristic plays with disk X (7 6)->27 0 O O O O O O X X 1 O O O O O O O X 2 O O O O X X O X 3 O O O X O O X X 4 O O O O O O X X 5 X X X O X O X X 6 X X X X X X X X 7 O O O O O X X Score X=27 O=36 Computer using alpha-beta plays with disk O 0 O O O O O O X X 1 O O O O O O O X 2 O O O O X X O X 3 O O O X O O X X 4 O O O O O O X X 5 X X O O O O X X 6 X X X O O X X X 7 O O O O O O X X Score X=23 O=41 4
Άσκηση 3 http://homepage.ufp.pt/jtorres/ensino/ia/alfabeta.html game tree structure: 2 3 3 2 1 3 1 2 3 3 2 3 2 1 2 3 2 1 3 2 3 game tree terminal nodes: 4 3 8 2 1 4 2 3 6 4 7 5 2 1 9 0 4 3 0 2 8 4 3 7 5 4 1 5
Ξεκινώντας από τον αριθμό 1 και αριθμώντας τους κόμβους από πάνω προς τα κάτω και από αριστερά προς τα δεξιά ο κόμβος 25 θα πρέπει να είχε τιμή μεγαλύτερη του 3 έτσι ώστε να μην κλαδευτεί ο κόμβος 26. Άσκηση 4 http://homepage.ufp.pt/jtorres/ensino/ia/alfabeta.html game tree structure: 3 2 2 3 1 2 1 2 2 2 2 game tree terminal nodes: 5 16 15 8 9 7 16 14 1 3 6 2 1. Ξεκινώντας από τον αριθμό 1 και αριθμώντας τους κόμβους από πάνω προς τα κάτω και από αριστερά προς τα δεξιά ο αλγόριθμος άλφα-βήτα θα κλαδέψει τους κόμβους 11, 14, 17, 22 και 23. 2. Η διαδρομή που θα πρέπει να ακολουθήσει ο max έτσι ώστε να επιτευχθεί μέγιστο κέρδος για αυτόν είναι η 1-3-7-15. Σε αυτή τη περίπτωση το μέγιστο κέρδος για τον max θα είναι 8. 3. Ο πρώτος κόμβος ο οποίος κλαδεύεται είναι ο κόμβος 14. Για να μην κλαδευτεί θα έπρεπε ο κόμβος 13 να έχει τιμή μικρότερη του 5. 6
Άσκηση 5 http://homepage.ufp.pt/jtorres/ensino/ia/alfabeta.html Game tree structure: 3 3 2 2 2 2 2 2 2 2 2 2 Game tree terminal values: 2 3 6 5 7 9 1 2 3 5 7 3 8 2 7