Esempio n. 1
0
    def sensorX(self, walls, angle):
        wp = []
        dist = 5
        for w in walls:
            mp = (int(self.center[0] -
                      dist * cos(radians(self.angle + angle))),
                  int(self.center[1] +
                      dist * sin(radians(self.angle + angle))))
            a, b = w.begin, w.end
            p = collide.intersect(w.begin, w.end, self.center, mp)

            if p != None:
                if p[0] >= a[0] and p[0] <= b[0] and p[1] <= b[1] and p[
                        1] >= a[1]:
                    wp.append(p)
                    # ms = (int(self.center[0] + dist * cos(radians(self.angle + angle + 90))),
                    #       int(self.center[1] + dist * sin(radians(self.angle + angle + 90))))
                    #
                    # c, d = droite(self.center, ms)
                    # d = evalPointDroite(p, (c, d))
                    # ang = (self.angle + angle) % 360
                    # if ang <= 270 and ang >= 90:
                    #     if c > 0:
                    #         wp.append(p)
                    # else:
                    #     if c < 0:
                    #         wp.append(p)
        # print(wp)
        dp = [collide.distc(self.center, i) for i in wp]
        if dp != []:
            pos = dp.index(min(dp))
            return wp[pos]
        return a  # TO DO:  a ameliorer
Esempio n. 2
0
def eval_genomes(population,generation,nb_run):
    global solution;
    global probMutation
    taillePopulation =len(population);
    visitedPositions = set();
    for j in range(generation):
        print(j,"-ieme generation")
        pos = []
        dis = []
        delta = 0;
        ### evaluation des reseaux neurones
        for genome in population:
            #affichage de image
#            positionFinale = robot.simulationNavigation(genome);
            positionFinale = robot.simulationNavigationSansImage(genome);
            if positionFinale not in visitedPositions:
                visitedPositions.add(positionFinale);
                delta += 1;
            # evaluation
            pos.append(positionFinale);
            dis.append(10000-distc(positionFinale,robot.finish_position))
            if butAtteint(positionFinale):
                plotmaze(visitedPositions,"./rf/fitnessGuideMaze_{}_run_{}_generation_image_finale.png".format(nb_run,j))
                return;   
            f = open("./rf/fitness_5_run.txt","a");
            f.write(str(positionFinale)+"\n");
            f.close();
        ### generer prochaine generation
        nextPopulation = [];      
        distribution = rangementParQualite(p = 0.1,taille = taillePopulation);
        for i in range(taillePopulation//2):
            #selection
            individu1,individu2 = selection(population,dis,distribution); 
            #croisement
            individu3,individu4 = croissement(individu1,individu2);
            #mutation
            individu3 = mutation(individu3,probMutation);
            individu4 = mutation(individu4,probMutation);
            #ajouter dans la prochaine population
            nextPopulation.append(individu3);
            nextPopulation.append(individu4);
        population = nextPopulation;
        if delta <20:
            probMutation += 0.01
        ### plot
        #generation de graph
        if j%50 == 0 and j!=0:
            plotmaze(visitedPositions,"./rf/fitnessGuideMaze_{}_run_{}_generation_image.png".format(nb_run,j))
Esempio n. 3
0
    def perception(self, walls):
        sensordata = self.sensor(walls)
        assert None not in sensordata
        return [collide.distc(self.center, i)
                for i in sensordata] + self.radar(walls)


#test
#def radar(x0,y0,angle):
#    r = 1
#    x1,y1 = x0-r*cos(radians(angle-45)), y0+r*sin(radians(angle-45));
#    print("x1,y1: ",x1," ",y1)
#    x2,y2 = x0-r*cos(radians(angle+45)), y0+r*sin(radians(angle+45));
#    print("x2,y2: ",x2," ",y2)
#
#radar(0,0,90)
Esempio n. 4
0
def butAtteint(positionFinale):
    if distc(positionFinale, robot.finish_position) < 10 :
        return True;
    else:
        return False;
Esempio n. 5
0
def eval_genomes(population, generation, nb_run):
    global test_var1
    global test_var2
    global solution
    global probMutation
    global position
    k = 20
    #nombre de voisins les plus proches
    visitedPosition = set()
    R = set()
    for j in range(1, generation + 1):
        print(j, "-ieme generation")
        delta = 0
        pos = []
        nouveaute = []
        ### evaluate population and add into archive of past behaviors
        for genome in population:
            #affichage de image
            #            positionFinale = robot.simulationNavigation(genome);
            positionFinale = robot.simulationNavigationSansImage(genome)
            # ajouter la positionFinale dans l'ensemble de positions visitees par la population
            pos.append(positionFinale)
            # ajouter la positionFinale dans la list R
            R.add(positionFinale)
            # MAJ de nouveaute
            if (positionFinale) not in visitedPosition:
                nouveaute.append(10000)
            else:
                nouveaute.append(0)

            # ajouter la positionFinale dans l'ensemble de positions visitees
            if positionFinale not in visitedPosition:
                visitedPosition.add(positionFinale)
                delta += 1
            # verifier si le but est atteint
            if butAtteint(positionFinale):
                plotmaze(
                    visitedPosition,
                    "./rf/noveltyGuideMaze_{}_run_{}_generation.png".format(
                        nb_run, j))
                #                plotmaze(visitedPosition,"./test/result_pb5sur1000p01_250000evaluations/noveltyGuideMaze_{}_run_{}_generation_image_finale.png".format(nb_run,j))
                return
            f = open("./rf/novelty_5_run.txt", "a")
            f.write(str(positionFinale) + "\n")
            f.close()

        ### calculer le nouveaute par rapport a ses distances avec les voisins pour chaque genome dans la population
#        print("visitedPosition: ",visitedPosition);
        for i in range(len(population)):
            #calculer les distances entre cette position et toutes les autres positions visitees
            distances = []
            heapq.heapify(distances)
            for p in R:
                heapq.heappush(distances, distc(pos[i], p))
            nouveaute[i] += sum(
                [heapq.heappop(distances) for d in range(k + 1)])
#            print("len(distance) :",len(distances))
#            print("len(visitedPOsition) :",len(visitedPosition));
#            print("positionFi ", pos[i]);
#            print("pos[i] nouveaute: ",nouveaute[i]);
#        print("nouveaute: ",nouveaute)
#        print("pos : ",pos);

### generer prochaine generation
        nextPopulation = []
        distribution = rangementParQualite(p=0.1, taille=len(population))
        for i in range(len(population) // 2):
            #selection
            individu1, individu2 = selection(population, nouveaute,
                                             distribution)
            #croisement
            individu3, individu4 = croissement(individu1, individu2)
            #mutation
            individu3 = mutation(individu3, probMutation)
            individu4 = mutation(individu4, probMutation)
            #ajouter dans la prochaine population
            nextPopulation.append(individu3)
            nextPopulation.append(individu4)
        population = nextPopulation
        # R ne retenir que les 1250 positions de nouveaute les plus haute
        if len(R) > 1250:  #250*5
            l = []
            for position in R:
                nvt = sum(
                    les_k_plus_petits_elements(
                        20, [distc(position, i) for i in visitedPosition]))
                l.append([position, nvt])
            R = set([i[0] for i in sorted(l, key=lambda x: -x[1])[:1250]])
        # adjuster la probabilite de mutatioin dynamiquement
        if delta < 20:
            probMutation += 0.005
        print("prob mutation ", probMutation)

        #generation de graph
        print("j=", j)
        if j % 50 == 0 and j != 0:
            plotmaze(
                visitedPosition,
                "./rf/noveltyGuideMaze_{}_run_{}_generation.png".format(
                    nb_run, j))
Esempio n. 6
0
def butAtteint(positionFinale):
    if distc(positionFinale, robot.finish_position) < 10:
        print("**************goal atteint************************")
        return True
    else:
        return False
Esempio n. 7
0
def eval_genomes(nb_run):
    global probMutation
    size_layers = (16, 12, 1)

    X = [[None for i in range(200)] for j in range(400)]
    visitedPosition = set()
    R = set()

    #generate and evaluate B random genomes initiales
    B = [Mlp(size_layers) for i in range(1000)]
    pos = [robot.simulationNavigationSansImage(genome) for genome in B]
    for genome, position in zip(B, pos):
        R.add(position)
        X[position[0]][position[1]] = genome
        visitedPosition.add(position)

    nouveaute_position = []
    for position in visitedPosition:
        nouveaute_position.append(
            (position,
             sum(
                 les_k_plus_petits_elements(20,
                                            [distc(position, i) for i in R]))))

    for generation in range(1, 1001):

        delta = 0
        # choisir 250 genomes dans la population par rapport a sa nouveaute
        positions = select_k_position(250, nouveaute_position)
        B = [X[position[0]][position[1]] for position in positions]
        # mutation pour generer leurs enfants
        B = [mutation(genome, 1) for genome in B]
        # evaluer les genomes
        pos = [robot.simulationNavigationSansImage(genome) for genome in B]
        # ajouter dans les grid et la list de positions  visitees dans le passe
        for genome, position in zip(B, pos):
            R.add(position)
            X[position[0]][position[1]] = genome
            # ajouter la positionFinale dans l'ensemble de positions visitees
            if position not in visitedPosition:
                visitedPosition.add(position)
                delta += 1
            # si le goal est atteint
            if butAtteint(position):
                plotmaze(
                    visitedPosition,
                    "./result1905/result_NS_plus_mapelite/NS_mapElite_Maze_{}_run_{}_generation_image_finale.png"
                    .format(nb_run, generation))
                return
        nouveaute_position = []
        # calculer nouveaute pour tout genome de la population
        for position in visitedPosition:
            nouveaute_position.append(
                (position,
                 sum(
                     les_k_plus_petits_elements(
                         20, [distc(position, i) for i in R]))))
        # calculer nouveaute pour tout genome dans le list R
        if len(R) > 1250:  #250*5
            l = []
            for position in R:
                nvt = sum(
                    les_k_plus_petits_elements(
                        20, [distc(position, i) for i in visitedPosition]))
                l.append([position, nvt])
            R = set([i[0] for i in sorted(l, key=lambda x: -x[1])[:1250]])
        print("len(visitedPosition) ", len(visitedPosition))
        #generation de graph
        print("generation = ", generation)
        if generation % 50 == 0 and generation != 0:
            #            plotmaze(visitedPosition,"./result/noveltyGuideMaze_{}_run_{}_generation_image.png".format(nb_run,j))
            plotmaze(
                visitedPosition,
                "./result1905/result_NS_plus_mapelite/NS_mapElite_Maze_{}_run_{}_generation_image.png"
                .format(nb_run, generation))
        if delta < 20:
            probMutation += 0.005
        print("prob mutation ", probMutation)
def eval_genomes(nb_run):
    fn = "./2305/map_" + str(nb_run) + "_run_mutationfaible.txt"
    f = open(fn, "a")
    f.close()
    global probMutation
    size_layers = (16, 12, 1)

    X = [[None for i in range(200)] for j in range(400)]
    visitedPosition = set()
    R = set()

    #generate and evaluate B random genomes initiales
    B = [Mlp(size_layers) for i in range(1000)]
    pos = [robot.simulationNavigationSansImage(genome) for genome in B]
    for genome, position in zip(B, pos):
        if X[position[0]][position[1]] == None:
            R.add(position)
            X[position[0]][position[1]] = genome
            visitedPosition.add(position)
        f = open(fn, "a")
        f.write(str(position) + "\n")
        f.close()
    nouveaute_position = []
    for position in visitedPosition:
        nouveaute_position.append(
            (position,
             sum(
                 les_k_plus_petits_elements(20,
                                            [distc(position, i) for i in R]))))

    for generation in range(1, 501):

        delta = 0
        # choisir 250 genomes dans la population par rapport a sa nouveaute
        positions = select_k_position(200, nouveaute_position)
        B = [X[position[0]][position[1]] for position in positions]
        # mutation pour generer leurs enfants
        B = varier(B)
        # evaluer les genomes
        pos = [robot.simulationNavigationSansImage(genome) for genome in B]
        # ajouter dans les grid et la list de positions  visitees dans le passe
        for genome, position in zip(B, pos):
            if X[position[0]][position[1]] == None:
                R.add(position)
                X[position[0]][position[1]] = genome
                # ajouter la positionFinale dans l'ensemble de positions visitees
                visitedPosition.add(position)
                delta += 1
                # si le goal est atteint
                if butAtteint(position):
                    plotmaze(
                        visitedPosition,
                        "./2305/NS_mapElite_Maze_{}_run_{}_generation.png".
                        format(nb_run, generation))
                    return
            f = open(fn, "a")
            f.write(str(position) + "\n")
            f.close()
        nouveaute_position = []
        # calculer nouveaute pour tout genome de la population
        for position in visitedPosition:
            nouveaute_position.append(
                (position,
                 sum(
                     les_k_plus_petits_elements(
                         20, [distc(position, i) for i in R]))))
        # calculer nouveaute pour tout genome dans le list R
        if len(R) > 1250:  #250*5
            l = []
            for position in R:
                nvt = sum(
                    les_k_plus_petits_elements(
                        20, [distc(position, i) for i in visitedPosition]))
                l.append([position, nvt])
            R = set([i[0] for i in sorted(l, key=lambda x: -x[1])[:1250]])
        print("len(visitedPosition) ", len(visitedPosition))
        #generation de graph
        print("generation = ", generation)
        if generation % 5 == 0 and generation != 0:
            plotmaze(
                visitedPosition,
                "./2305/NS_mapElite_Maze_{}_run_{}_generation.png".format(
                    nb_run, generation))
        if delta < 20:
            probMutation += 0.01
        print("prob mutation ", probMutation)