def __init__(self, space_width, space_height, animal_count, pred_count, genomes): self.pool = Pool() self.manager = Manager() self.width = space_width self.height = space_height self.genomes = genomes self.predators = [ Predator(random.randrange(0, self.width, 1), random.randrange(0, self.height, 1)) for _ in range(pred_count) ] self.animals = [ Animal(random.choice(genomes), PHEROMONES) for _ in range(animal_count) ] self.objects = [ Food(random.randrange(0, self.width, 1), random.randrange(0, self.height, 1), 10) for _ in range(animal_count) ] for a in self.animals: a.teleport(random.randrange(0, self.width, 1), random.randrange(0, self.height, 1), random.uniform(0, 6.28)) self.next_food = random.expovariate(1.0 / FOOD_PERIOD) self.next_poison = random.expovariate(1.0 / POISON_PERIOD) self.pheromones = self.manager.list([]) self.next_breed = random.expovariate(1.0 / BREEDING_PERIOD) self.new_genomes = []
def insert_animal(self, genome): a = Animal(genome, PHEROMONES) a.teleport(random.randrange(0, self.width, 1), random.randrange(0, self.height, 1), random.uniform(0, 6.28)) self.animals.append(a) self.objects.append( Food(random.randrange(0, self.width, 1), random.randrange(0, self.height, 1), 10))
def update(self, timestep): self.next_food -= timestep if self.next_food <= 0.0: self.next_food = random.expovariate(1.0 / FOOD_PERIOD) self.objects.append( Food(random.randrange(0, self.width, 1), random.randrange(0, self.height, 1), 10)) self.next_poison -= timestep if self.next_poison <= 0.0: self.next_poison = random.expovariate(1.0 / POISON_PERIOD) self.objects.append( Poison(random.randrange(0, self.width, 1), random.randrange(0, self.height, 1), 10)) self.next_breed -= timestep if self.next_breed <= 0.0: self.next_breed = random.expovariate(1.0 / BREEDING_PERIOD) self.animals.sort(key=lambda a: a.energy, reverse=True) # choose parents parentA = 0 while random.uniform(0, 1) >= BREEDING_FITNESS: parentA += 1 if parentA >= len(self.animals): parentA = len(self.animals) - 1 parentB = 0 while random.uniform(0, 1) >= BREEDING_FITNESS: parentB += 1 if parentB >= len(self.animals): parentB = len(self.animals) - 1 # breed self.new_genomes.append( self.pool.apply_async(breed, (self.animals[parentA].brain.genome, self.animals[parentB].brain.genome))) if len(self.new_genomes) > 0 and self.new_genomes[0].ready(): new_genome = self.new_genomes.pop(0) child = Animal(new_genome.get(), PHEROMONES) child.teleport(random.randrange(0, self.width, 1), random.randrange(0, self.height, 1), random.uniform(0, 6.28)) self.animals.append(child) result = list( zip(*(a for a in self.pool.starmap(update_animal, ( (a, self.pheromones, timestep, self.width, self.height) for a in self.animals))))) self.animals = [a for a in result[0] if a.energy > 0] for fl in result[1]: self.pheromones.extend(fl) for f in self.objects: f.update(self.animals, self.pheromones, timestep) for p in self.predators: p.update(self.animals, self.pheromones, timestep, self.width, self.height) for f in self.pheromones: f.tick(timestep) # remove finished foods self.objects = [f for f in self.objects if f.amount > 0.0] # remove vanished pheromones self.pheromones = [f for f in self.pheromones if f.power() > 0.1]