def test_sum_of_min_distances_ext2(self):
     ev = CenterMassEvaluator()
     l = [(0,0),(1,0),(3,0), 
          (0,1),      (2,1), 
          (0,2),(1,2),(4,4)]
     cm = ev.center_of_mass_from_coord_list(l)
     r = ev.sum_of_min_distances_ext2(cm, l)
class WeightedEvaluatorI():
    def __init__(self, wanted_mass, weight_before, weight_after, weight_enemy):
        '''
        @param weight_before: weight of euler
        '''
        self.wanted_mass = wanted_mass # center of mass, 
        #after this value we put weight_after on number of connected components
        self.weight_before = weight_before
        self.weight_after  = weight_after
        self.weight_enemy  = weight_enemy
        self.cm_eval = CenterMassEvaluator()
        self.quad_eval = QuadEvaluator()
    
    def evaluate(self, state, my_player, info_set):
        enemy = other_player(my_player)
        
        com_mine = self.cm_eval.evaluate(state, my_player, info_set)
        com_his = self.cm_eval.evaluate(state,enemy , info_set)
        
        euler_mine =  self.quad_eval.evaluate(state, my_player, info_set)
        euler_his = self.quad_eval.evaluate(state, enemy, info_set)
        
        if com_mine < self.wanted_mass:
            weight = self.weight_before
        else: 
            weight = self.weight_after
        
        h_mine = apply_weight(weight,euler_mine, com_mine)
        h_his =  apply_weight(weight,1-euler_his, com_his)
        
        h = h_mine - self.weight_enemy * h_his
        return h 
 def test_center_of_mass_from_coord_list(self):
     ev = CenterMassEvaluator()
     l = [(0,0),(1,0),(2,0), 
          (0,1),      (2,1), 
          (0,2),(1,2),(2,2)]
     cx,cy = ev.center_of_mass_from_coord_list(l)
     self.assertEquals((cx,cy),(1,1))
 def test__all(self):
     stat = TimeStatisticsClass()
     ev = CenterMassEvaluator()
     state  = LinesOfActionState(100, 50)
     
     stat.restart_measure("f")
     ev.evaluate(state, WHITE, 10)
     stat.restart_measure("f")
     
     stat.stop_measure()
     print stat.stats
     pass
 def test_state_to_coord_repr(self):
     ev = CenterMassEvaluator()
     state  = LinesOfActionState(6, 50)
     chord_repr_of_state = ev.state_to_coord_repr(state)
     #print 
     #print chord_repr_of_state
     #print state
     #ev.evaluate(state, player, action, quad_table_ext)
     expected = {'B': [(0, 1), (5, 1), (0, 2), (5, 2), (0, 3), (5, 3), (0, 4), (5, 4)], 'W': [(1, 0), (2, 0), (3, 0), (4, 0), (1, 5), (2, 5), (3, 5), (4, 5)]}
     
     def test(player):
         self.assertEqual(len(chord_repr_of_state[player]), len(expected[player]))
         for xy in  chord_repr_of_state[player]:
             self.assertTrue( xy in expected[player])
     test(WHITE)
     test(BLACK)
Exemple #6
0
    def setup(self, player, game_state, turn_time_limit, setup_time_limit):
        #TODO: use my_init to config final agent
        
        # we need init state to determine if we have to
        self.init_state = game_state
        self.prev_state = game_state
        
        #save params
        self.safe_delta = 0.085
        self.corrected_turn_time_limit = turn_time_limit - self.safe_delta
        self.player = player
        
        # choose evaluator
        self.evaluator = CenterMassEvaluator()

        #TODO: check set_uptime
        
        # == Setup info set ==
        self.info_set = {}
        
        self.info_set[QUAD_TABLE_TAG] = {
            ITERATIVE: QuadTable,
            NON_ITERATIVE: QuadTableNoUpdate
        }[self.use_iterative](game_state.board, game_state.size, initialize =True)
        
        # == Setup caching ==
        if self.caching: self.turn_cache = TurnCache()
        else:       self.turn_cache = NoneTurnCache()
 def __init__(self, wanted_mass, weight_before, weight_after, weight_enemy):
     '''
     @param weight_before: weight of euler
     '''
     self.wanted_mass = wanted_mass # center of mass, 
     #after this value we put weight_after on number of connected components
     self.weight_before = weight_before
     self.weight_after  = weight_after
     self.weight_enemy  = weight_enemy
     self.cm_eval = CenterMassEvaluator()
     self.quad_eval = QuadEvaluator()
class WeightedEvaluatorH():
    def __str__(self):
        return "WeightedEvaluatorH wanted_mass=%s, weight_before=%s, weight_after=%s, weight_enemy=%s" % (
        self.wanted_mass, 
        self.weight_before,
        self.weight_after, 
        self.weight_enemy                                                                                                           
        )   
    
    def __init__(self, wanted_mass, weight_before, weight_after, weight_enemy):
        '''
        @param weight_before: weight of euler
        '''
        self.wanted_mass = wanted_mass # center of mass, 
        #after this value we put weight_after on number of connected components
        self.weight_before = weight_before
        self.weight_after  = weight_after
        self.weight_enemy  = weight_enemy
        self.cm_eval = CenterMassEvaluator()
        self.quad_eval = QuadEvaluator()
    
    def evaluate(self, state, my_player, info_set):
        enemy = other_player(my_player)
        
        com_mine = self.cm_eval.evaluate(state, my_player, info_set)
        com_his = self.cm_eval.evaluate(state,enemy , info_set)
        
        euler_mine =  self.quad_eval.evaluate(state, my_player, info_set)
        euler_his = self.quad_eval.evaluate(state, enemy, info_set)
        
        if com_mine < self.wanted_mass:
            weight = self.weight_before
        else: 
            weight = self.weight_after
        
        h_mine = (1 - weight) * com_mine + weight * euler_mine
        h_his =  (1 - weight) * com_his + weight * euler_his
        h = h_mine - self.weight_enemy * h_his
        return h 
Exemple #9
0
class AnytimeSmartAlphaBetaPrintAgentParamsOld(GameAgent):
    # ----------------------- Info API -------------------------------
    def get_name(self):
        return self.alphaBeta.get_name()
    
    def myinit(self, caching, init_max_depth, depth_delta,  use_iterative):
        ''' 
        use string names names
        allow to confine agent'''
        self.caching = caching
        self.depth_delta = depth_delta
        self.use_iterative = use_iterative
        self.rand = Random(0)
        self.init_max_depth = init_max_depth
        
        self.use_quads = False
        
        #TODO:
        self.winner_check = QUAD_WINNER 
    
    # ---------------------- Timer ----------------------------------
    def start_timer(self):
        EndTimer.set_limit_and_start(self.corrected_turn_time_limit)
    
    def stop_timer(self):
        EndTimer.stop() 
    
    # ---------------------- Game Interface ----------------------------------
    
    def setup(self, player, game_state, turn_time_limit, setup_time_limit):
        #TODO: use my_init to config final agent
        
        # we need init state to determine if we have to
        self.init_state = game_state
        self.prev_state = game_state
        
        #save params
        self.safe_delta = 0.085
        self.corrected_turn_time_limit = turn_time_limit - self.safe_delta
        self.player = player
        
        # choose evaluator
        self.evaluator = CenterMassEvaluator()

        #TODO: check set_uptime
        
        # == Setup info set ==
        self.info_set = {}
        
        self.info_set[QUAD_TABLE_TAG] = {
            ITERATIVE: QuadTable,
            NON_ITERATIVE: QuadTableNoUpdate
        }[self.use_iterative](game_state.board, game_state.size, initialize =True)
        
        # == Setup caching ==
        if self.caching: self.turn_cache = TurnCache()
        else:       self.turn_cache = NoneTurnCache()

        
     
    # ---------------------  The heuristics ------------------------------    
    def utility(self,state,info_set):
        GTimeStatistics.start_measure("heur")
        r = self.evaluator.evaluate(state, self.player,info_set)
        GTimeStatistics.stop_measure("heur")
        return r
    
    def info_print(self,game_state):
        pass
#        print "The heuristics of game state"
#        print game_state
#        r1,r2 = self.evaluator.evaluate2(game_state, self.player,end_time)
#        r = r1 + r2
#        print "r=", r, "    their:",r1, "    fix:",r2      

    def _update_info_set_no_action(self, oldstate, newstate, info_set):
        new_info_set = {}
        for info_tag, info_table in info_set.items():
            new_info_set[info_tag] = self.turn_cache.get_wkt(newstate, # use cache
                 info_tag, info_tag + '.update_no_action', 
                 lambda: info_table.updateWithoutAction(oldstate, newstate)                 )
        return new_info_set 
    
    
    def choose_default_answer(self,current_state):
        #succesors = self.turn_cache.get(current_state, LinesOfActionState.getSuccessors)
        succesors = current_state.getSuccessors()
                # choose default move randomly: 
        index = self.rand.randint(0, len(succesors)-1)
        res_action, res_state = succesors.items()[index]
        return res_action, res_state
         
        
    def move(self, game_state):
        self.start_timer()
        self.res_action, self.res_state = self.choose_default_answer(game_state)
        print "w=",CenterMassEvaluator().evaluate(game_state,WHITE)
        print "b=",CenterMassEvaluator().evaluate(game_state,BLACK)
        try:
            EndTimer.check("m10")
            # calculate info set for this game_state
            if self.init_state is self.prev_state:
                state_info_set = self.info_set #first turn is us: we already has infoset
            else: 
                state_info_set = self._update_info_set_no_action(self.prev_state, game_state, self.info_set)
            
            EndTimer.check("m20")
            # calculate info set for result game_state
            self.res_info_set = self._update_info_set_no_action(game_state, self.res_state, state_info_set)
            
            #choose our move
            # results saved in self.res_action, self.res_state
            self.search(game_state,  state_info_set, self.init_max_depth)
            
            #save our turn and its info set: to be able calculate next one

        except TimeOutException: #TODO for release handle all exceptios
            pass
        
        # save data about our move
        self.prev_state = self.res_state
        self.info_set   = self.res_info_set 
        return self.res_action
    
    # --------------------------- search algorithm ------------------------
    
    def search(self, current_state, info_set, init_max_depth):
        '''
        @param info_set: info set of current_state
        '''        
        # start iterative search
        curr_max_depth = init_max_depth
        # print "time left", end_time - time.clock(), "d=", curr_max_depth
        
        while True:
            EndTimer.check("start search")
            print  "time left", EndTimer.time_left(), "d=", curr_max_depth
            alg = SmartAlphaBetaSearch(self.player, self.utility, self.turn_cache, self.winner_check,self.use_quads)
            self.res_action, self.res_state, self.res_info_set = alg.search(current_state, curr_max_depth, info_set)
            curr_max_depth += self.depth_delta #TODO: TODO