class Observer(object):
    MAX_STEP=40
    def __init__(self,visu = False):  # Visu permet la visualisation de la simu. Si on en veut pas, on met false. Cela est permis par la fonction start en bas.
        team1 = SoccerTeam("expe1")
        team2 = SoccerTeam("expe2")
        self.strat = shoot()         # On donne la strat qu'on va utiliser.
        team1.add("jexp1", self.strat )
        team2.add("jplot",Strategy())  # Si besoin d'un joueur de team adverse
        self.simu = Simulation(team1,team2,max_steps=10000000) # On def la simu avec un enorme max_steps car on veut test x round et on veut pas devoir recommencer un match
        self.visu = visu
        self.simu.listeners+=self #ajout de l observer
        list_a = np.linspace(0.1,20,30)    # Creation de la matrice pour la parametre a. De param1 a param2 avec param2 valeurs
        list_b = np.linspace(0.1,20,30)
        self.list_params = [(a,b) for a in list_a for b in list_b]   # Creation de tout les couples possible
        self.cpt_params = 0     # Va permettre de tester toute la liste de couple de params
        self.nb_expe = 20       # Nb de round que l on fera par postion 
        self.res = dict()       # Ini de notre dico
        self.pos = dict()
    def begin_match(self,team1,team2,state):
    #initialisation des parametres ...
        self.last, self.but, self.expe = 0, 0, 0
    def begin_round(self,team1,team2,state):
        self.x,self.y = 4*GAME_WIDTH/7+random.uniform(0,1)*GAME_WIDTH/7,GAME_HEIGHT/4+random.uniform(0,1)*GAME_HEIGHT/4  # Ini des postions qu on voudra en depart, dans un secteur donne
        self.simu.state.states[(1,0)].position = Vector2D(self.x,self.y)
        self.simu.state.ball.position = Vector2D(self.x,self.y)
    #ou self.simu.set_state(state)
        self.strat.a,self.strat.b = self.list_params[self.cpt_params]  # On met les vals de a et b dans shoot que l on veut pour les couples dans list_params
        self.last = self.simu.step   # Pas a la fin du round precedant
    def update_round(self,team1,team2,state):
        if state.step>self.last+self.MAX_STEP: 
            self.simu.end_round()
    def end_round(self,team1,team2,state):
        if state.goal>0:    # Si but marque, on incremente but
            self.but+=1
        self.expe+=1        # On increment pour chaque round
        if self.expe > self.nb_expe:
            if self.cpt_params <len(self.list_params)-1:   # Si on a pas traite tout les couples 
                if self.but*1./self.expe > 0.5 :
                    self.res[self.list_params[self.cpt_params]]= self.but*1./self.expe  # On met dans res la proba
                    self.pos[self.list_params[self.cpt_params]]= self.x,self.y
                self.cpt_params+=1  # On change les params qu on va tester
                self.last, self.but, self.expe = 0, 0, 0    # On reinitialise
            else:
                self.simu.end_match()       # Sinon on end
    def start(self):
        if self.visu :
            show_simu(self.simu)
        else:
            self.simu.start()
                    
    
    
# Trouver parametre
示例#2
0
class ShootSearch(object):
    """ nombre d'iterations maximales jusqu'a l'arret d'un round
        discr_step  : pas de discretisation du parametre
        nb_essais : nombre d'essais par parametre
    """
    MAX_STEP = 40

    def __init__(self):
        self.strat = ShootExpe()
        team1 = SoccerTeam("test")
        team1.add("Expe", self.strat)
        team2 = SoccerTeam("test2")
        team2.add("Nothing", Strategy())
        self.simu = Simulation(team1, team2, max_steps=40000)
        self.simu.listeners += self
        self.discr_step = 20
        self.nb_essais = 20

    def start(self, visu=True):
        """ demarre la visualisation avec ou sans affichage"""
        if visu:
            show_simu(self.simu)
        else:
            self.simu.start()

    def begin_match(self, team1, team2, state):
        """ initialise le debut d'une simulation
            res : dictionnaire des Resultats
            last : step du dernier round pour calculer le round de fin avec MAX_STEP
            but : nombre de but pour ce parametre
            cpt : nombre d'essais pour ce parametre
            params : liste des parametres a tester
            idx : identifiant du parametre courant
        """
        self.res = dict()
        self.last = 0
        self.but = 0
        self.cpt = 0
        self.params = [
            x for x in np.linspace(1, settings.maxPlayerShoot, self.discr_step)
        ]
        self.idx = 0

    def begin_round(self, team1, team2, state):
        """ engagement : position random du joueur et de la balle """
        position = Vector2D(
            np.random.random() * settings.GAME_WIDTH / 2. +
            settings.GAME_WIDTH / 2.,
            np.random.random() * settings.GAME_HEIGHT)
        self.simu.state.states[(1, 0)].position = position.copy()
        self.simu.state.states[(1, 0)].vitesse = Vector2D()
        self.simu.state.ball.position = position.copy()
        self.strat.norm = self.params[self.idx]
        self.last = self.simu.step

    def update_round(self, team1, team2, state):
        """ si pas maximal atteint, fin du tour"""
        if state.step > self.last + self.MAX_STEP:
            self.simu.end_round()

    def end_round(self, team1, team2, state):
        if state.goal > 0:
            self.but += 1
        self.cpt += 1
        if self.cpt >= self.nb_essais:
            self.res[self.params[self.idx]] = self.but * 1. / self.cpt
            logger.debug("parametre %s : %f" % (
                (str(self.params[self.idx]), self.res[self.params[self.idx]])))
            self.idx += 1
            self.but = 0
            self.cpt = 0
        """ si plus de parametre, fin du match"""
        if self.idx >= len(self.params):
            self.simu.end_match()
示例#3
0
class ParamSearch(object):
    def __init__(self, strategy, params, simu=None, trials=20, max_steps=1000000,
                 max_round_step=40):
        self.strategy = strategy
        self.params = params.copy()
        self.simu = simu
        self.trials = trials
        self.max_steps = max_steps
        self.max_round_step = max_round_step

    def start(self, show=True):
        if not self.simu:
            team1 = SoccerTeam("Team 1")
            team2 = SoccerTeam("Team 2")
            team1.add(self.strategy.name, self.strategy)
            team2.add(Strategy().name, Strategy())
            self.simu = Simulation(team1, team2, max_steps=self.max_steps)
        self.simu.listeners += self

        if show:
            show_simu(self.simu)
        else:
            self.simu.start()

    def begin_match(self, team1, team2, state):
        self.last = 0  # Step of the last round
        self.crit = 0  # Criterion to maximize (here, number of goals)
        self.cpt = 0  # Counter for trials

        if len(self.params) > 2:
            raise ValueError('Max two parameters')
        self.param_keys = list(self.params.keys())  # Name of all parameters
        self.param_id = [0] * len(self.param_keys)  # Index of the parameter values
        self.res = dict()  # Dictionary of results

    def begin_round(self, team1, team2, state):
        ball = Vector2D.create_random(low=0, high=1)
        ball.x *= GAME_WIDTH / 2
        ball.x += GAME_WIDTH / 2
        ball.y *= GAME_HEIGHT

        # Player and ball postion (random)
        self.simu.state.states[(1, 0)].position = ball.copy()  # Player position
        self.simu.state.states[(1, 0)].vitesse = Vector2D()  # Player acceleration
        self.simu.state.ball.position = ball.copy()  # Ball position

        # Last step of the game
        self.last = self.simu.step

        # Set the current value for the current parameter
        for i, (key, values) in zip(self.param_id, self.params.items()):
            setattr(self.strategy, key, values[i])

    def update_round(self, team1, team2, state):
        # Stop the round if it is too long
        if state.step > self.last + self.max_round_step:
            self.simu.end_round()

    def end_round(self, team1, team2, state):
        # A round ends when there is a goal
        if state.goal > 0:
            self.crit += 1  # Increment criterion

        self.cpt += 1  # Increment number of trials

        for i, (key, values) in zip(self.param_id, self.params.items()):
            print("{}: {}".format(key, values[i]), end="   ")
        print("Crit: {}   Cpt: {}".format(self.crit, self.cpt))

        if self.cpt >= self.trials:
            # Save the result
            res_key = tuple()
            for i, values in zip(self.param_id, self.params.values()):
                res_key += values[i],
            self.res[res_key] = self.crit * 1. / self.trials

            # Reset parameters
            self.crit = 0
            self.cpt = 0

            # Go to the next parameter value to try
            key0 = self.param_keys[0]
            if self.param_id[0] < len(self.params[key0]) - 1:
                self.param_id[0] += 1
            elif len(self.params) > 1:
                key1 = self.param_keys[1]
                if self.param_id[1] < len(self.params[key1]) - 1:
                    self.param_id[0] = 0
                    self.param_id[1] += 1
                else:
                    self.simu.end_match()
            else:
                self.simu.end_match()


    def get_res(self):
        return self.res
class GoalSearch(object):
    def __init__(self,
                 strategy,
                 params,
                 simu=None,
                 trials=20,
                 max_steps=1000000,
                 max_round_step=40):
        self.strategy = strategy
        self.params = params.copy()
        self.simu = simu
        self.trials = trials
        self.max_steps = max_steps
        self.max_round_step = max_round_step

    def start(self, show=True):
        if not self.simu:
            team1 = SoccerTeam(" Team ␣ 1 ")
            team2 = SoccerTeam(" Team ␣ 2 ")
            team1.add(self.strategy.name, self.strategy)
            team2.add(Strategy().name, Strategy())
            self.simu = Simulation(team1, team2, max_steps=self.max_steps)
        self.simu.listeners += self

        if show:
            show_simu(self.simu)
        else:
            self.simu.start()

    def begin_match(self, team1, team2, state):
        self.last_step = 0  # Step of the last round
        self.criterion = 0  # Criterion to maximize ( here , number of goals )
        self.cpt_trials = 0  # Counter for trials
        self.param_grid = iter(ParameterGrid(
            self.params))  # Iterator for the g
        self.cur_param = next(self.param_grid, None)  # Current parameter
        if self.cur_param is None:
            raise ValueError('no parameter given.')
        self.res = dict()  # Dictionary of results

    def begin_round(self, team1, team2, state):
        ball = Vector2D.create_random(low=0, high=1)
        ball.x += 30
        ball.y += GAME_HEIGHT / 2

        # Player and ball postion ( random )
        self.simu.state.states[(1,
                                0)].position = ball.copy()  # Player position
        self.simu.state.states[(1,
                                0)].vitesse = Vector2D()  # Player accelerati
        self.simu.state.ball.position = ball.copy()  # Ball position
        self.last_step = self.simu.step  # Last step of the game

        # Set the current value for the current parameters
        for key, value in self.cur_param.items():
            setattr(self.strategy, key, value)

    def end_round(self, team1, team2, state):
        # A round ends when there is a goal of if max step is achieved
        if state.goal > 0:
            self.criterion += 1  # Increment criterion

        self.cpt_trials += 1  # Increment number of trials

        print(self.cur_param)
        print(" Crit : ␣{}␣␣␣ Cpt :␣{} ".format(self.criterion,
                                                self.cpt_trials))

        if self.cpt_trials >= self.trials:
            # Save the result
            self.res[tuple(
                self.cur_param.items())] = self.criterion * 1. / self.trials

            # Reset parameters
            self.criterion = 0
            self.cpt_trials = 0

            # Next parameter value
            self.cur_param = next(self.param_grid, None)
            if self.cur_param is None:
                self.simu.end_match()

    def update_round(self, team1, team2, state):
        # Stop the round if it is too long
        if state.step > self.last_step + self.max_round_step:
            self.simu.end_round()

    def get_res(self):
        return self.res

    def get_best(self):
        return max(self.res, key=self.res.get)
示例#5
0
class SimpleParamSearch(object):
    def __init__(self, trials=5, max_round_step=100, discret=5):
        self.trials = trials
        self.max_round_step = max_round_step
        #self.list_forces = [0,0.5,1.,1.5,2,2.5,3,3.5]
        self.list_forces = [4.5, 5, 5.5, 6]
        self.list_grille = []
        #Fabrication de la grille de discretisation du terrain
        self.discret = discret
        self.stepx = GAME_WIDTH / (2. * discret)
        self.stepy = GAME_HEIGHT / (1. * discret)
        for i in range(discret):
            for j in range(discret):
                self.list_grille.append(
                    Vector2D(GAME_WIDTH / 2. + self.stepx * i, self.stepy * j))
        self.strategy = FonceurTestStrategy()

    def start(self, show=True):
        team1 = SoccerTeam("Team 1")
        team1.add("Test tire", self.strategy)
        self.simu = Simulation(team1, max_steps=100000)
        self.simu.listeners += self
        if show:
            show_simu(self.simu)
        else:
            self.simu.start()

    def begin_match(self, team1, team2, state):
        self.last = 0  # Step of the last round
        self.crit = 0  # Criterion to maximize (here, number of goals)
        self.cpt = 0  # Counter for trials
        self.res = dict()  # Dictionary of results
        self.idx_force = 0  # counter for parameter index
        self.idx_grille = 0

    def begin_round(self, team1, team2, state):
        # On fixe la position de la balle et du joueur
        ball_pos = self.list_grille[self.idx_grille]
        self.simu.state.states[(1, 0)].position = ball_pos.copy()
        self.simu.state.states[(1, 0)].vitesse = Vector2D()
        self.simu.state.ball.position = ball_pos.copy()

        # Set the current value for the current parameter
        self.strategy.strength = self.list_forces[self.idx_force]

        # Last step of the game
        self.last = self.simu.step

    def update_round(self, team1, team2, state):
        # Stop the round if it is too long
        if state.step > self.last + self.max_round_step:
            self.simu.end_round()

    def end_round(self, team1, team2, state):
        # A round ends when there is a goal
        if state.goal > 0:
            self.crit += 1  # Increment criterion
        self.cpt += 1  # Increment number of trials
        if self.cpt >= self.trials:
            key = (self.list_grille[self.idx_grille].x,
                   self.list_grille[self.idx_grille].y)
            if key not in self.res:
                self.res[key] = []
            self.res[key].append((self.list_forces[self.idx_force],
                                  self.crit * 1. / self.trials))
            print("Res pour  position %s force %f : %f" %
                  (str(key), self.res[key][-1][0], self.res[key][-1][1]))
            # Reset parameters
            self.crit = 0
            self.cpt = 0
            # Go to the next parameter value to try
            self.idx_force += 1
            if self.idx_force >= len(self.list_forces):
                self.idx_grille += 1
                self.idx_force = 0
                if self.idx_grille >= len(self.list_grille):
                    self.simu.end_match()

    def end_match(self, team1, team2, state):
        #Trouve les meilleurs parametres et les sauvegarde
        best_force = dict()
        for k, v in self.res.items():
            best_force[k] = sorted(v, key=lambda x: x[1])[-1][0]
        with open("best_force.pkl", "wb") as fn:
            pickle.dump(best_force, fn)
示例#6
0
class GoalSearchc(object):
    def __init__(self,strategy,params,simu=None, trials=2,max_steps=1000000,max_round_step=40,nogen=2,cpt_gen=0,l=[]):
        self.strategy=strategy
        self.params=params.copy()
        self.simu=simu
        self.trials=trials
        self.max_steps=max_steps
        self.max_round_step=max_round_step
        self.nogen=nogen
        self.cpt_gen=cpt_gen
        self.l=l
    
    def start(self,show=True):
        if not self.simu:
            team1 = SoccerTeam("Team 1")
            team2 = SoccerTeam("Team 2")
            team1.add(self.strategy.name,self.strategy)
            team2.add(Strategy().name , Strategy())
            self.simu = Simulation(team1, team2 , max_steps = self.max_steps )
        self.simu.listeners += self
        if show :
            show_simu(self.simu)
        else :
            self.simu.start()
            
    def begin_match(self, team1, team2, state):

        self.last_step = 0 # Step of the last round
        self.criterion = 0 # Criterion to maximize ( here , number of goals )
        self.cpt_trials = 0 # Counter for trials

            
        for i in range(8):
            a=random.random()
            b=random.random()
            if(b<0.5):
                b=-1
            else:
                b=1
            if(a<0.5):
              a=-1
            else:
              a=1
            dic={
                    "forcet":1+random.random()*0.1*a,
                    "dpos":5/8*GAME_WIDTH+random.random()*0.1*b
            }
            self.l.append(dic)
                      
        self.param_grid = iter(self.l) 
    
        self.cur_param = next(self.param_grid, None ) # Current parameter
        if self.cur_param is None :
            raise ValueError("no parameter given")
        self.res = dict() # Dictionary of results
    def begin_round ( self , team1 , team2 , state ):
        ball = Vector2D.create_random(low=-30,high=30)
        ball.x+=GAME_WIDTH*8/10
        ball.y+=GAME_HEIGHT/2
        # Player and ball postion ( random )
        self.simu.state.states[(1 , 0)].position = ball.copy() # Player position
        self.simu.state.states[(1 , 0)].vitesse = Vector2D() # Player accelerati
        self.simu.state.ball.position = ball.copy() # Ball position
        self.last_step = self.simu.step
        # Last step of the game
        # Set the current value for the current parameters
        for key , value in self.cur_param.items():
            setattr( self.strategy , key , value )
            
    def end_round(self, team1, team2, state):
        # A round ends when there is a goal of if max step is achieved
        if state.goal > 0:
            self.criterion += 1 # Increment criterion
        self.cpt_trials += 1    # Increment number of trials
        print(self.cur_param,end = "  " )
        print ( " Crit :   {}      Cpt :   {} " . format(self.criterion,self.cpt_trials))
        if self.cpt_trials >= self.trials :  # Save the result
            self.res[tuple(self.cur_param.items())] = self.criterion*1./self.trials
            # Reset parameters
            self.criterion = 0
            self.cpt_trials = 0
            # Next parameter value
            self.cur_param = next(self.param_grid , None )
            if self.cur_param is None :
            
                if(self.cpt_gen==self.nogen-1):
                    self.simu.end_match ()
                else:
                    self.cpt_gen+=1
                    mr=0
                    nr=0
                    for t in self.res:
                        mr+=self.res[t]
                        nr+=1
                    mr=mr/nr
                    print(self.res)
                    for t in self.l:
                        key = tuple(t.items())
                        if key in self.res:
                             if (self.res[tuple(t.items())]<mr):
                                 self.l.remove(t)
                    for i in range(8-len(self.l)):
                        a=random.random()
                        b=random.random()
                        if(b<0.5):
                            b=-1
                        else:
                            b=1
                        if(a<0.5):
                            a=-1
                        else:
                            a=1
                        dic={
                                "forcet":2+random.random()*0.1*a,
                                "dpos":5/8+random.random()*0.1*b
                        }
                        self.l.append(dic)
                    self.param_grid = iter(self.l) 
                    self.cur_param = next ( self.param_grid , None )
        
    def update_round ( self , team1 , team2 , state ):
        # Stop the round if it is too long
        if state.step>self.last_step+self.max_round_step:
            self.simu.end_round()

    def get_res (self):
        return self.res

    def get_best(self):
        return max(self.res, key=self.res.get)
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
class SimpleParamSearch(object):
    def __init__(self, trials=10, max_round_step=100, discret=3):
        """
		:param trials: nombre d'essais par endroit et par puissance
		:param max_round_step: durée maximale d'un essai
		:param discret: pas (step) de découpage du terrain.
			Attention, le nombre d'endroits testés est égal à discret^2
		"""
        self.trials = trials
        self.max_round_step = max_round_step
        self.list_forces = [0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5]  #7
        self.list_grille = []
        #Fabrication de la grille de discretisation du terrain
        if discret == 1:
            self.stepx = 0
            self.stepy = 0
        else:
            self.stepx = GAME_WIDTH / (2. * discret)
            self.stepy = GAME_HEIGHT / (2. * discret - 2)
            #D'où le if ==1
        for i in range(discret):
            for j in range(discret):
                self.list_grille.append(
                    Vector2D(GAME_WIDTH / 2. + self.stepx * i, self.stepy * j))
        self.strategy = Fonceur()

    def start(self, show=True):
        team1 = SoccerTeam("Team 1")
        team1.add("Test", self.strategy)
        self.simu = Simulation(team1, max_steps=100000)
        self.simu.listeners += self
        if show:
            show_simu(self.simu)
        else:
            self.simu.start()

    def begin_match(self, team1, team2, state):
        self.last = 0  # Step of the last round
        self.crit = 0  # Criterion to maximize (here, number of goals)
        self.cpt = 0  # Counter for trials
        self.res = dict()  # Dictionary of results
        self.idx_force = 0  # counter for parameter index
        self.idx_grille = 0

    def begin_round(self, team1, team2, state):
        # On fixe la position de la balle et du joueur
        ball_pos = self.list_grille[self.idx_grille]
        self.simu.state.states[(1, 0)].position = ball_pos.copy()
        self.simu.state.states[(1, 0)].vitesse = Vector2D()
        self.simu.state.ball.position = ball_pos.copy()

        # Set the current value for the current parameter
        self.strategy.strength = self.list_forces[self.idx_force]

        # Last step of the game
        self.last = self.simu.step

    def update_round(self, team1, team2, state):
        # Stop the round if it is too long
        if state.step > self.last + self.max_round_step:
            self.simu.end_round()

    def end_round(self, team1, team2, state):
        # A round ends when there is a goal
        if state.goal > 0:
            self.crit += 1  # Increment criterion
        self.cpt += 1  # Increment number of trials

        if self.cpt >= self.trials:
            key = (self.list_grille[self.idx_grille].x,
                   self.list_grille[self.idx_grille].y)

            if key not in self.res:
                self.res[key] = []
            self.res[key].append((self.list_forces[self.idx_force],
                                  self.crit * 1. / self.trials))
            print("Res pour position", key, "force", self.res[key][-1][0], ":",
                  self.res[key][-1][1])
            # Reset parameters
            self.crit = 0
            self.cpt = 0
            # Go to the next parameter value to try
            self.idx_force += 1
            if self.idx_force >= len(self.list_forces):
                self.idx_grille += 1
                self.idx_force = 0
            if self.idx_grille >= len(self.list_grille):
                self.simu.end_match()

    def end_match(self, team1, team2, state):
        #Trouve les meilleurs paramètres et les sauvegarde
        meilleure_force = dict()
        for k, v in self.res.items():
            meilleure_force[k] = sorted(v, key=lambda x: x[1])[-1][0]
        with open("meilleure_force.pkl", "wb") as f:
            pickle.dump(meilleure_force, f)
示例#8
0
class ParamSearchReception(object):
    def __init__(self, strategy, params, simu=None, trials=7, max_steps=1000000,
                 max_round_step=40):
        self.strategy = strategy
        self.params = params.copy()
        self.simu = simu
        self.trials = trials
        self.max_steps = max_steps
        self.max_round_step = max_round_step

    def start(self, show=True):
        if not self.simu:
            team1 = SoccerTeam("Team Passeurs")
            team2 = SoccerTeam("Team Vide")
            team1.add(self.strategy.name, self.strategy)
            team2.add(Strategy().name, Strategy())
            self.simu = Simulation(team1, team2, max_steps=self.max_steps)
        self.simu.listeners += self

        if show:
            show_simu(self.simu)
        else:
            self.simu.start()

    def begin_match(self, team1, team2, state):
        self.last = 0  # Step of the last round
        self.crit = 0  # Criterion to maximize (here, number of goals)
        self.cpt = 0  # Counter for trials
        self.param_keys = list(self.params.keys())  # Name of all parameters
        self.param_id = [0] * len(self.params)  # Index of the parameter values
        self.param_id_id = len(self.params) - 1  # Index of the current parameter
        self.res = dict()  # Dictionary of results

    def begin_round(self, team1, team2, state):
        ball = Vector2D(GAME_WIDTH/2., 60.)

        # Player and ball postion (random)
        self.simu.state.states[(1, 0)].position = Vector2D(50, 45)  # Recepteur position
        self.simu.state.states[(1, 0)].vitesse = Vector2D()  # Recepteur acceleration
        self.simu.state.ball.position = ball.copy()  # Ball position
        self.simu.state.ball.vitesse = Vector2D(-4,-2)  # Ball acceleration

        # Last step of the game
        self.last = self.simu.step

        self.strategy.cont = True
        # Set the current value for the current parameter
        for i, (key, values) in zip(self.param_id, self.params.items()):
            setattr(self.strategy, key, values[i])

    def update_round(self, team1, team2, state):
        me = StateFoot(state, 1, 0)
        # Stop the round if it is too long
        if state.step > self.last + self.max_round_step:
            #print(me.my_pos - me.center_point)
            self.simu.end_round()

    def end_round(self, team1, team2, state):
        # A round ends when there is a goal
        self.cpt += 1  # Increment number of trials
        if self.cpt >= self.trials:
            # Save the result
            res_key = tuple()
            for i, values in zip(self.param_id, self.params.values()):
                res_key += values[i],
            self.res[res_key] = self.crit * 1. / self.trials
            #print(res_key, self.crit)

            # Reset parameters
            self.crit = 0
            self.cpt = 0

            # Go to the next parameter value to try
            key = self.param_keys[self.param_id_id]
            if self.param_id[self.param_id_id] < len(self.params[key]) - 1:
                self.param_id[self.param_id_id] += 1
            else:
                self.simu.end_match()

        for i, (key, values) in zip(self.param_id, self.params.items()):
            #print("{}: {}".format(key, values[i]), end="   ")
        #print("Crit: {}   Cpt: {}".format(self.crit, self.cpt))

    def get_res(self):
        return self.res
示例#9
0
class ParamSearchDribble(object):
    def __init__(self, strategy, params, simu=None, trials=20, max_steps=1000000,
                 max_round_step=40):
        self.strategy = strategy
        self.params = params.copy()
        self.simu = simu
        self.trials = trials
        self.max_steps = max_steps
        self.max_round_step = max_round_step

    def start(self, show=True):
        if not self.simu:
            team1 = SoccerTeam("Team Fonceur")
            team2 = SoccerTeam("Team Dribbler")
            #team1.add(FonceurChallenge1Strategy().name, FonceurChallenge1Strategy())
            team1.add(FonceurStrategy().name, FonceurStrategy())
            team2.add(self.strategy.name, self.strategy)
            self.simu = Simulation(team1, team2, max_steps=self.max_steps)
        self.simu.listeners += self

        if show:
            show_simu(self.simu)
        else:
            self.simu.start()

    def begin_match(self, team1, team2, state):
        self.last = 0  # Step of the last round
        self.crit = 0  # Criterion to maximize (here, number of goals)
        self.cpt = 0  # Counter for trials
        self.param_keys = list(self.params.keys())  # Name of all parameters
        self.param_id = [0] * len(self.params)  # Index of the parameter values
        self.param_id_id = len(self.params) - 1  # Index of the current parameter
        self.res = dict()  # Dictionary of results

    def begin_round(self, team1, team2, state):
        ball = Vector2D.create_random(low=-1, high=1)
        if ball.x < 0. : ball.x = -ball.x
        aleat = Vector2D.create_random(low=25, high=45)
        ball.normalize().scale(aleat.x)
        ball.y += GAME_HEIGHT/2.
        angle = Vector2D.create_random(low=0., high=pi*2.)
        aleat = Vector2D.create_random(low=5, high=15)
        fonc = ball + Vector2D(aleat.x*cos(angle.x), aleat.x*sin(angle.x))

        # Player and ball postion (random)
        self.simu.state.states[(2, 0)].position = ball.copy()  # Shooter position
        self.simu.state.states[(2, 0)].vitesse = Vector2D()  # Shooter acceleration
        self.simu.state.states[(1, 0)].position = fonc.copy()  # Shooter position
        self.simu.state.states[(1, 0)].vitesse = Vector2D()  # Shooter acceleration
        self.simu.state.ball.position = ball.copy()  # Ball position

        # Last step of the game
        self.last = self.simu.step

        # Set the current value for the current parameter
        for i, (key, values) in zip(self.param_id, self.params.items()):
            setattr(self.strategy, key, values[i])

    def update_round(self, team1, team2, state):
        # Stop the round if it is too long
        if state.step > self.last + self.max_round_step:
            self.simu.end_round()

    def end_round(self, team1, team2, state):
        # A round ends when there is a goal
        if state.goal > 0:
            self.crit += 1  # Increment criterion

        self.cpt += 1  # Increment number of trials
        if self.cpt >= self.trials:
            # Save the result
            res_key = tuple()
            for i, values in zip(self.param_id, self.params.values()):
                res_key += values[i],
            self.res[res_key] = self.crit * 1. / self.trials
            #print(res_key, self.crit)

            # Reset parameters
            self.crit = 0
            self.cpt = 0

            # Go to the next parameter value to try
            key2 = self.param_keys[self.param_id_id]
            key1 = self.param_keys[self.param_id_id-1]
            if self.param_id[self.param_id_id] < len(self.params[key2]) - 1:
                self.param_id[self.param_id_id] += 1
            elif self.param_id[self.param_id_id-1] < len(self.params[key1]) - 1:
                self.param_id[self.param_id_id] = 0
                self.param_id[self.param_id_id-1] += 1
            else:
                self.simu.end_match()

        for i, (key, values) in zip(self.param_id, self.params.items()):
            #print("{}: {}".format(key, values[i]), end="   ")
        #print("Crit: {}   Cpt: {}".format(self.crit, self.cpt))

    def get_res(self):
        return self.res