def isWinner(self): return self.utils.isWinner(self.board) def printBoard(self): self.utils.printBoard(self.board) if __name__ == "__main__": #players = [ dumb.dumb(1), dumb.dumb(2) ] #players = [ dumb.url(1,'http://dl.no.de/ai/twostep/move'), genetic.genetic(2, 'best.c4') ] #players = [ dumb.url(1,'http://dl.no.de/ai/random/move'), genetic.genetic(2, 'best.c4') ] #players = [ genetic.genetic(1, 'best.c4'), dumb.url(2,'http://dl.no.de/ai/random/move') ] #players = [ genetic.genetic(1, 'best_so_far2.c4'), dumb.dumb(2) ] #players = [ genetic.genetic(1, 'best_so_far2.c4'), dumb.url(2,'http://dl.no.de/ai/twostep/move') ] #players = [ genetic.genetic(1, 'best.c4'), dumb.url(2,'http://dl.no.de/ai/twostep/move') ] players = [ genetic.genetic(1, 'best.c4'), dumb.url(2,'http://dl.no.de/ai/random/move') ] NUM_GAMES = 200 ROWS = 6 COLS = 7 win_stats = defaultdict(int) for g in range(NUM_GAMES): c = c4(rows=ROWS,cols=COLS) for i in range(c.rows * c.cols): #c.printBoard() winner = c.isWinner() if winner <> 0: print 'Player %d has won' % winner #c.printBoard() #exit() break
def eval_func(chromosome): try: old_best_comp = compile(pickle.load(open('best.c4', 'rb')), "<string>", "eval") except: old_best_comp = None code_comp = chromosome.getCompiledCode() win = lose = tie = 0.0 for rnd in range(ROUNDS): c = c4(rows=ROWS,cols=COLS) if rnd % 2 == 0: other_player = dumb.url(1,'http://dl.no.de/ai/twostep/move') else: other_player = dumb.url(2,'http://dl.no.de/ai/twostep/move') winner = 0 turns = 0 total_turns = c.rows * c.cols for i in range(total_turns): winner = c.isWinner() if winner <> 0: break board = c.getBoard(is_json=False) player = (i % 2) + 1 # Train if we're not the genetic player if other_player.getPlayer() == player: json_state = json.dumps( { "rows":ROWS, "cols":COLS, "board":board, "currentTurn":player, "moveNumber":i} ) column = other_player.getMoveJSON(json_state) else: # Otherwise let's eval and see what we get col_scores = [] for col in utils.getFreeCols(board): const, aps, apo, nlts, nlto, nr = utils.getStats(board,player,col) score = eval(code_comp) col_scores.append((score, col)) random.shuffle(col_scores) sc = sorted(col_scores, key=itemgetter(0), reverse=True) #print 'Col Scores', str(sc) column = sc[0][1] c.move(player, column) # This is to compete against self, to do later #if False: #old_best_comp is not None: # col_scores = [] # for col in utils.getFreeCols(board): # aps, apo, nlts, nlto, nr = utils.getStats(board,player,col) # score = eval(old_best_comp) # col_scores.append((score, col)) # random.shuffle(col_scores) # sc = sorted(col_scores, key=itemgetter(0), reverse=True) # #print 'Col Scores', str(sc) # column = sc[0][1] turns += 1 if winner == 0: tie += 1.0 elif winner == other_player.getPlayer(): lose += 1.0 else: win += 1.0 return (win + tie * 0.5)/ROUNDS