// Υπερπαράμετροι εκπαίδευσης float alpha = 0.1; // learning rate float gamma = 0.95; // discount factor float epsilon = 1.0; // exploration rate float reward = 0; // το άμεσο reward σε κάθε απόφαση int action=2; // j στον Q, που δείχνει την επιλεγμένη ενέργεια στη γραμμή currState int currState; // i στον S όπου βρίσκεται στο current state int nextState; // i στον S όπου βρίσκεται το state που θα πάει από currState αφού κάνει action int nextMaxQ; // j στον Q με την μέγιστη τιμή στη γραμμή nextState int numActions = 3; // up, down, stay δηλ. 3 δυνατές ενέργειες της ρακέτας σε κάθε κατάσταση int numPosX = 12; // πόσες δαφορετικές θέσεις αναγνωρίζουμε στον οριζόντιο άξονα int numPosY = 12; // πόσες δαφορετικές θέσεις αναγνωρίζουμε στον κάθετο άξονα int numDir = 4; // πόσες διαφορετικές κατευθύνσεις αναγνωρίζουμε για την κίνηση της μπάλας // 1 προς κατω+δεξιά, 2 προς πανω+δεξιά, -1 προς κάτω+αριστερά, -2, προς πάνω+αριστερά String[] S; // states: bX,bY,pY,bDir δηλ. 4 ακέραιες τιμές διαχωρισμένες με κόμμα float[][] Q; // q-value ανά action σε κάθε state int numStates = numPosX * numPosY * numPosY * numDir; // πλήθος όλων των δυνατών states void setup() { size(600, 400); // μέγεθος παραθύρου fill(0, 255, 0); // το χρώμα των σχημάτων είναι πράσινο // Δημιουργούνται οι πίνακες S, Q (ως χώρος) S = new String[numStates]; Q = new float[numStates][numActions]; initTables(); // printTables(); String test="0,0,0,-2"; String test2="5,3,0,-2"; int testi = searchState(test); int testi2 = searchState(test2); Q[testi][0] = 0; Q[testi][1] = 0; Q[testi][2] = 0; Q[testi2][0] = 13; Q[testi2][1] = 8; Q[testi2][2] = 5; nextMaxQ = findMaxQIndex(testi2); currState = testi; nextState = testi2; updateQValue(); println(Q[testi][0]); println(Q[testi][1]); println(Q[testi][2]); } // τέλος της setup void draw() { } // τέλος της draw