Esempio n. 1
0
def daveAndJane():
    cGenome1 = []
    nGenome1 = []

    #input nodes
    nGenome1.append(gene.NodeGene(1, True, False))
    nGenome1.append(gene.NodeGene(2, True, False))
    nGenome1.append(gene.NodeGene(3, True, False))

    #output nodes
    nGenome1.append(gene.NodeGene(4, False, True))

    #hidden nodes
    nGenome1.append(gene.NodeGene(5, False, False))

    #connections
    cGenome1.append(gene.ConnectGene(1, 4, 1.0, True, 1))
    cGenome1.append(gene.ConnectGene(2, 4, 0.5, True, 2))
    cGenome1.append(gene.ConnectGene(3, 4, -2, True, 3))
    cGenome1.append(gene.ConnectGene(1, 5, 1, True, 4))
    cGenome1.append(gene.ConnectGene(2, 5, 1, True, 5))
    cGenome1.append(gene.ConnectGene(5, 4, -1, True, 6))

    dave = genotype.Genotype(cGenome1, nGenome1)

    cGenome2 = []
    nGenome2 = []

    #input nodes
    nGenome2.append(gene.NodeGene(1, True, False))
    nGenome2.append(gene.NodeGene(2, True, False))
    nGenome2.append(gene.NodeGene(3, True, False))

    #output nodes
    nGenome2.append(gene.NodeGene(4, False, True))

    #hidden nodes
    nGenome2.append(gene.NodeGene(5, False, False))
    nGenome2.append(gene.NodeGene(6, False, False))

    #connections
    cGenome2.append(gene.ConnectGene(1, 4, 1.0, True, 1))
    cGenome2.append(gene.ConnectGene(2, 4, 0.5, True, 2))
    cGenome2.append(gene.ConnectGene(3, 4, 2, True, 3))
    cGenome2.append(gene.ConnectGene(1, 5, 1, True, 4))
    cGenome2.append(gene.ConnectGene(2, 5, -1, True, 5))
    cGenome2.append(gene.ConnectGene(5, 4, 1.6, True, 6))
    cGenome2.append(gene.ConnectGene(3, 5, .9, True, 7))
    cGenome2.append(gene.ConnectGene(4, 5, -7, True, 8))
    cGenome2.append(gene.ConnectGene(4, 5, 2, False, 9))
    cGenome2.append(gene.ConnectGene(1, 6, -2, True, 10))
    cGenome2.append(gene.ConnectGene(2, 6, 2, True, 11))
    cGenome2.append(gene.ConnectGene(6, 4, 2.3, True, 12))

    jane = genotype.Genotype(cGenome2, nGenome2)

    genetics.innovationNumber = 9
    genetics.nodeNumber = 5
    return (dave, jane)
Esempio n. 2
0
def newPop(size):
    #created blank pop
    pop = []
    cGenome = []
    nGenome = []

    #input nodes
    genetics.innovationNumber = 0
    genetics.nodeNumber = 0
    for j in range(784):
        genetics.nodeNumber += 1
        nGenome.append(gene.NodeGene(genetics.nodeNumber, True, False))
        for k in range(10):
            genetics.innovationNumber += 1
            cGenome.append(
                gene.ConnectGene(genetics.nodeNumber, 785 + k,
                                 random.gauss(0, 1), True,
                                 genetics.innovationNumber))
    #output nodes
    for k in range(10):
        genetics.nodeNumber += 1
        nGenome.append(gene.NodeGene(genetics.nodeNumber, False, True))

    baseGeno = genotype.Genotype(cGenome, nGenome)
    for i in range(size):
        print(i)
        pop.append(copy.deepcopy(baseGeno))
    return pop
Esempio n. 3
0
def standardMutate(genotype, weightProb, connectionProb, nodeProb):
    connections = genotype.connectGenome
    nodes = genotype.nodeGenome
    
    #weight mutations
    for connection in connections:
        if random.random() < weightProb:
            connection.weight += random.gauss(0, 0.5)
            
    #new connection
    for i in range(int(connectionProb/1.0)):
        if random.random() < connectionProb%1.0:
            node = random.choice(nodes)
            genetics.innovationNumber += 1
            newGene = Gene.ConnectGene(node.nodeNum, random.choice(nodes).nodeNum, random.gauss(0, 2), True, genetics.innovationNumber)
            connections.append(newGene)
            
    #new node
    for i in range(int(nodeProb/1.0)):
        if random.random() < nodeProb%1.0:
            
    #        print("len of nodes before: " + str(len(nodes)))
    #        print("ADDED NEW NODE")
            connection = random.choice(connections)
            connection.enabled = False
            genetics.nodeNumber += 1
            nodes.append(Gene.NodeGene(genetics.nodeNumber, False, False))
            genetics.innovationNumber += 1
            connections.append(Gene.ConnectGene(connection.inNode, genetics.nodeNumber, connection.weight, True, genetics.innovationNumber))
            genetics.innovationNumber += 1
            connections.append(Gene.ConnectGene(genetics.nodeNumber, connection.outNode, 1, True, genetics.innovationNumber))
    #        print("len of nodes after: " + str(len(nodes)))
    return Genotype.Genotype(connections, nodes)
Esempio n. 4
0
    def test_domination(self):
        g = genotype.Genotype(data_manager.dm.city_ids)
        i1 = individual.Individual(g)
        i2 = individual.Individual(g)

        i1.tour_distance = 500
        i2.tour_distance = 450

        i1.calculate_tour_cost = 40
        i2.calculate_tour_cost = 35

        self.assertTrue(i2.dominates(i1))
        self.assertFalse(i1.dominates(i2))
Esempio n. 5
0
def loadFromFile(file):

    file = open(file, "r")
    popJson = file.read()
    popList = json.loads(popJson)
    pop = []
    for genoList in popList:
        connectGenome = []
        nodeGenome = []
        for cGT in genoList[0]:
            connectGenome.append(
                gene.ConnectGene(cGT[0], cGT[1], cGT[2], cGT[3], cGT[4]))
        for nGT in genoList[1]:
            nodeGenome.append(gene.NodeGene(nGT[0], nGT[1], nGT[2]))
        pop.append(genotype.Genotype(connectGenome, nodeGenome))
    return pop
    """matrixList = []
Esempio n. 6
0
 def allocate_agents(self, n_agents, gen):
     if gen == None:
         gen = genotype.Genotype()
     nr = 0
     while nr < n_agents:
         add = True
         ax = np.random.randint(10, self.xmax - 10)
         ay = np.random.randint(10, self.ymax - 10)
         ao = np.radians(np.random.randint(0, 360))
         # simple check to avoid superposition with trees
         for t in self.trees:
             if np.linalg.norm(np.array([ax, ay]) -
                               np.array([t.x, t.y])) < t.r + gen.r:
                 add = False
         # create agents
         if add:
             ag = agent.Agent(ax, ay, ao, gen)
             self.agents.append(ag)
             nr += 1
     # store
     self.objects["agents"] = self.agents
Esempio n. 7
0
 def test_calculate_tour_distance_and_cost(self):
     g = genotype.Genotype(data_manager.dm.city_ids)
     i = individual.Individual(genotype=g)
     self.assertEqual(i.tour_distance, 153809)
     self.assertEqual(i.tour_cost, 1921)
Esempio n. 8
0
main_window.title('AIPond v.' + version)

print('Версия бота: ', bot.version)
print('Версия генотипа: ', genotype.version)
print('Версия окружающего мира для ботов:', board.version)

# Создаём среду в которой будет жить AI.
pond = tkinter.Canvas(main_window,
                      width=settings.WIDTH,
                      height=settings.HEIGHT)
pond.pack()

# Создаём стартовые генотипы для ботов (10 штук)
# и первых ботов.
for loop in range(0, 10):
    bot_genotype = genotype.Genotype('New')
    bot_genotype.save()
    bot_array.append(bot.Bot(cng=bot_genotype.cng, number=number))
    number += 1

# Помещаем начальных ботов в окружающую среду.
for loop in range(0, number - settings.NUMBER_DEFAULT):
    birth = True
    while birth:
        # Положение бота в мире по оси Х.
        x = random.randint(1, settings.CELL - 1)
        # Положение бота в мире по оси Y.
        y = random.randint(1, settings.CELL - 1)
        if (main_board.board[main_board.td_in_l(x, y)] == settings.EMPTY):
            # Передаём координаты рождения боту.
            bot_array[loop].x = x
Esempio n. 9
0
    def simulation(self):
        # initial conditions
        world_xmax = 250
        world_ymax = 250
        n_walls = 5
        n_trees = 10
        self.initial_population()
        # for each generation
        for n in range(self.n_gen):
            print("\ngeneration = {}/{}".format(n + 1, self.n_gen))
            simworld = world.World()
            max_e = 0
            best_group = None
            # for each group (same world for all for each generation)
            for ng in range(self.n_groups):
                print("group: {}/{}".format(ng + 1, self.n_groups))
                # new agents
                simworld.agents = []
                gen = self.genotypes[ng]
                simworld.allocate_agents(self.n_pop, gen)
                # lifetime simulation
                for t in tqdm(range(self.lifetime)):
                    simworld.update()
                # print results
                agents_e = [ag.energy for ag in simworld.agents]
                total_e = sum(agents_e)
                print("agents energy: {}, total = {}".format(
                    agents_e, total_e))
                if total_e > max_e:
                    max_e = total_e
                    best_group = simworld.agents
                    print("new max = {}".format(max_e))

            # print best data
            print("\nbest agents:")
            for ag in best_group:
                print("agent energy = {}".format(ag.energy))
            print("total energy = {}".format(max_e))
            # store best data (all genotypes - clonal)
            self.genotype = best_group[0].genotype
            self.best_genotypes.append(self.genotype)
            # record best case, only if better than previous best
            if max_e > self.best_e:
                self.best_cases.append([max_e, self.genotype, simworld])
                self.best_e = max_e
                self.anim_best = True
            # animate
            if self.animate:
                # animate if better than previous best
                if self.anim_best:
                    world_animation.sim_animation(self.lifetime,
                                                  [world_xmax, world_ymax],
                                                  simworld.walls,
                                                  simworld.trees, best_group)
                    self.anim_best = False
                # animate after some number of generations
                else:
                    if (n + 1) % self.anim_step == 0:
                        world_animation.sim_animation(self.lifetime,
                                                      [world_xmax, world_ymax],
                                                      simworld.walls,
                                                      simworld.trees,
                                                      best_group)

            # reproduce (create new groups, keep best)
            self.genotypes = [self.genotype]
            for ng in range(self.n_groups - 1):
                # starting energy and sensors (keep for now)
                energy = self.genotype.energy
                r = self.genotype.r
                max_speed = self.genotype.max_speed
                feed_range = self.genotype.feed_range
                feed_rate = self.genotype.feed_rate
                olf_angle = self.genotype.olf_angle
                olf_range = self.genotype.olf_range
                ir_angle = self.genotype.ir_angle
                ray_length = self.genotype.ray_length
                beam_spread = self.genotype.beam_spread
                aud_angle = self.genotype.aud_angle
                aud_range = self.genotype.aud_range
                # inputs and outputs (keep for now)
                n_in = self.genotype.n_in
                n_hidden = self.genotype.n_hidden
                n_out = self.genotype.n_out
                # thresholds
                ut = self.genotype.ut + np.random.randint(-1,
                                                          2) * self.mut_rate
                lt = self.genotype.lt + np.random.randint(-1,
                                                          2) * self.mut_rate
                vt = self.genotype.vt + np.random.randint(-1,
                                                          2) * self.mut_rate
                # weights
                W = self.mut_weights(self.genotype.W)
                V = self.mut_weights(self.genotype.V)
                # plasticity #TODO
                plasticity = self.genotype.plasticity
                # create and save new genotype
                new_genotype = genotype.Genotype(
                    energy, r, max_speed, feed_range, feed_rate, olf_angle,
                    olf_range, ir_angle, ray_length, beam_spread, aud_angle,
                    aud_range, n_in, n_hidden, n_out, ut, lt, vt, W, V,
                    plasticity)
                self.genotypes.append(new_genotype)
Esempio n. 10
0
 def initial_population(self):
     # for each group (clones)
     for ng in range(self.n_groups):
         initial_genotype = genotype.Genotype()
         self.genotypes.append(initial_genotype)
Esempio n. 11
0
import genotype as g
import main
import data

N = 100
df = data.data(main.path_to_datafile)
evaluator = main.fit
subset_size = 6
rep = [i for i in range(0, 6)]

objs = []
for i in range(N):
    obj = g.Genotype(evaluator)
    obj.make_permutation(rep)


def test_genotype_init():
    # Init

    # Creating objects
    for obj in objs:
        for element in obj.r:
            try:
                rep.index(element)
            except ValueError:
                raise ValueError("test_genotype failed!")


def test_genotype_score():

    # Calculating scores
Esempio n. 12
0
def crossover ( genoFit1, genoFit2):
    
    geno1 = genoFit1[0]
    geno2 = genoFit2[0]
    fit1 = genoFit1[1]
    fit2 = genoFit2[1]
    newNodeGenome = []
    newConnectGenome = []
    
    #node genomes
    i = 0
    j = 0
    while i < len(geno1.nodeGenome) and j < len(geno2.nodeGenome):
        if geno1.nodeGenome[i].nodeNum == geno2.nodeGenome[j].nodeNum:
            newNodeGenome.append(geno1.nodeGenome[i])
            i += 1
            j += 1
        else:
            if geno1.nodeGenome[i].nodeNum < geno2.nodeGenome[j].nodeNum:
                newNodeGenome.append(geno1.nodeGenome[i])
                i += 1
            else:
                newNodeGenome.append(geno2.nodeGenome[j])
                j += 1
                
    #excess from 2
    if i == len(geno1.nodeGenome) and j != len(geno2.nodeGenome):
        newNodeGenome += geno2.nodeGenome[j:]
    #Excess from 1
    elif j == len(geno2.nodeGenome) and i != len(geno1.nodeGenome):
        newNodeGenome += geno1.nodeGenome[i:]
        
        
    #connect Genomes
    i = 0
    j = 0
    while i < len(geno1.connectGenome) and j < len(geno2.connectGenome):   
        #if same gene
        if geno1.connectGenome[i].innovationNum == geno2.connectGenome[j].innovationNum:
            if random.choice((0,1)) == 0:
                newConnectGenome.append(geno1.connectGenome[i])
            else:
                newConnectGenome.append(geno2.connectGenome[j])
            
            i += 1
            j += 1
        else:
            if geno1.connectGenome[i].innovationNum < geno2.connectGenome[j].innovationNum:
                i += 1
                if fit1 >= fit2 and i < len(geno1.connectGenome):
                    newConnectGenome.append(geno1.connectGenome[i])
            else:
                j += 1
                if fit2 >= fit1 and j < len(geno2.connectGenome):
                    newConnectGenome.append(geno2.connectGenome[j])
    #Excess from 2
    if i == len(geno1.connectGenome) and j <len(geno2.connectGenome) and fit2 >= fit1:
        newConnectGenome += geno2.connectGenome[j:]
    #Excess from 1
    elif j == len(geno2.connectGenome) and i < len(geno1.connectGenome) and fit1 >= fit2:
        newConnectGenome += geno1.connectGenome[i:]
        
        
    return genotype.Genotype(newConnectGenome, newNodeGenome)