class Notrace implements Player { private long played,won; private double[][] q = new double[10000][6]; private int a, box; private double ALPHA,GAMMA; public void reset() { played = won = 0; } private int getBox(State s) { int temp = s.currentNum; for(int i = 0; i < s.cards.length; i++) { temp *=2; if (s.cards[i]>0) temp++; } return s.currentNum; } /* private void sarsa(int s, int a, int sPrime, int aPrime, int r ) { q[s][a] = r + GAMMA*q[sPrime][aPrime] - q[s][a]; }*/ /* private void saveQToFile() { try { System.out.println("Enter filename:"); String s = Stdin.getString(); FileWriter temp = new FileWriter( } catch(IOException e) { } } */ private void sarsa( int s, int a, int sP, int aP, int r) { q[s][a] += 0.9*(q[sP][aP]-q[s][a]); } public long gamesPlayed() { return played; } public long gamesWon() { return won; } public int makeMove(State state) { a = (int)(Math.random()*6); box = getBox(state); for (int i = 0; i < 6; i++) if ( q[box][a] < q[box][i] ) a = i; if ( (int)(Math.random()*300) == 0 ) a = (int)(Math.random()*6); while( state.cards[a] < 1 ) { a = (int)(Math.random()*6); } return a; }; public void onYourMove(State state) { int sPrime = getBox(state); int s = box; //no change required to a, it was the last action you picked int aPrime = 0; for (int i = 0; i < 6; i++) if (q[sPrime][aPrime] < q[sPrime][i]) aPrime = i; if (state.currentNum == 31) for(int i = 0; i < 6; i++) q[sPrime][i] =1; if (state.currentNum > 31) for(int i=0; i<6; i++) q[sPrime][i]=-1; sarsa( s, a, sPrime, aPrime, 0 ); } public void onStart(State state) { a = -1; box = getBox(state); ALPHA = 0.001; GAMMA = 0.9; } public void onEnd(State state) { State s = state.revertedCopy(); if (!(this == state.loser)) { won++; int sPrime = getBox(s); //the opponent's starting position is your ending one //sarsa( box, a, sPrime, 0, 1); } else { int sPrime = getBox(state); int sCurr = getBox(s); //sarsa( box, a, sPrime, 0, -1); } played++; } public void onOpponentMove(State state) { /* State prev = state.revertedCopy(); int sPrime = getBox(state); int a = state.lastPlay; int s = getBox(prev); int aPrime = 0; for(int i =0; i <6; i++) if (q[sPrime][aPrime] 31) for(int i=0; i<6; i++) q[sPrime][i]=-1; if ((double)won/(double)played < 0.5) q[s][a] = 1; sarsa( s, a, sPrime, aPrime, r);*/ } }