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)
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
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)
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))
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 = []
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
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)
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
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)
def initial_population(self): # for each group (clones) for ng in range(self.n_groups): initial_genotype = genotype.Genotype() self.genotypes.append(initial_genotype)
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
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)