def __init__(self, box=(100,100), pos=(0,0), schema=(4,4), brain=None, track=None): self.box = box self.pos = pos if brain and isinstance(brain, Brain): self.brain = brain else: self.brain = Brain(schema=schema) self.distance = 0.0 self.t_inicial = self.t self.fail_counter = 0 self.track = track
def evolve(): darwin = [] for ix, c in enumerate(sq.Fauna.zoo): # if c.movable: c.mov.final(kill=True) print(c.name) darwin.append((c.mov.register, ix)) print(' {:12.4f} d={:8.3f} t={:6.3f}'.format(*c.mov.register)) darwin.sort(reverse=True) data = [reg[0][0] for reg in darwin] print( f'| | | | Max loss = {data[0]} for {sq.Fauna.zoo[darwin[0][1]].name}, average = {np.average(data)}' ) # Reproduction time! R, P, root = reproductions, population, sq.Fauna.root for dad, son in zip(darwin[:R], darwin[R:2 * R]): # dad, son = dad[1], son[1] print( f'dad {sq.Fauna.zoo[dad[1]].name}, son {sq.Fauna.zoo[son[1]].name}' ) sq.Fauna.zoo[dad[1]].color = dad_color sq.Fauna.zoo[son[1]] = DiyingCreature( size=(creature_size, creature_size), color=son_color, movement=RegisteredMov( pos=launch, box=Window, brain=Brain(schema=schema, layers=sq.Fauna.zoo[dad[1]].mov.brain.layers), track=track)) sq.Fauna.zoo[son[1]].mov.brain.mutate() sq.Fauna.zoo[dad[1]].mov.reset() for cre in darwin[2 * R:P]: cre = cre[1] # First, remove dead creatures from root widget # root.remove_widget(sq.Fauna.zoo[cre]) sq.Fauna.zoo[cre] = DiyingCreature(color=new_color, size=(creature_size, creature_size), movement=RegisteredMov( pos=launch, box=Window, brain=Brain(schema=schema), track=track)) # print(f'{ix:4d}: {creature.name} is{"" if creature.parent == root else " NOT"} in Eden in position {creature.pos}') print(f'restaurando población. valor previo: {RegisteredMov.livings}') RegisteredMov.livings = population sq.Fauna.Darwin = []
class Movement(object): box=None t = 0 @classmethod def inc_t(cls, dt): cls.t += dt def __init__(self, box=(100,100), pos=(0,0), schema=(4,4), brain=None, track=None): self.box = box self.pos = pos if brain and isinstance(brain, Brain): self.brain = brain else: self.brain = Brain(schema=schema) self.distance = 0.0 self.t_inicial = self.t self.fail_counter = 0 self.track = track def __call__(self, dt=1.): if self.track: # self.perception() # self.response() return self.pos else: input_ = np.array((self.pos[0], self.pos[1], self.box.width - self.pos[0], self.box.height - self.pos[1] )).clip(0,100) out_ = self.brain.think(input_) # print('out: ', *out_) delta = (float(out_[0] - out_[1]), float(out_[2] - out_[3])) self.distance += (delta[0]*delta[0]*dt*dt + delta[1]*delta[1]*dt*dt)**.5 self.pos[0] += delta[0]*dt self.pos[1] += delta[1]*dt margin = 50 if self.pos[0] < margin: # print('{:8.4f} Falla {:4d}: distance={:8.5f}, time={:8.5f}'.format(self.t, *self.final())) self.final() self.pos[0] = self.box.width - margin if self.pos[1] < margin: # print('{:8.4f} Falla {:4d}: distance={:8.5f}, time={:8.5f}'.format(self.t, *self.final())) self.final() self.pos[1] = self.box.height - margin if self.pos[0] > self.box.width - margin: # print('{:8.4f} Falla {:4d}: distance={:8.5f}, time={:8.5f}'.format(self.t, *self.final())) self.final() self.pos[0] = margin if self.pos[1] > self.box.height - margin: # print('{:8.4f} Falla {:4d}: distance={:8.5f}, time={:8.5f}'.format(self.t, *self.final())) self.final() self.pos[1] = margin # print('pos: ', *self.pos) return self.pos def final(self): t, distance = self.t-self.t_inicial, self.distance self.t_inicial, self.distance = self.t, 0.0 self.fail_counter += 1 return self.fail_counter, distance, t
if kill or not self.track.is_in_track(self.pos): RegisteredMov.livings -= 1 achive = (self.distance, self.t-self.t_inicial, 0) #min(self.input_)) self.t_inicial, self.distance = self.t, 0.0 self.fail_counter += 1 self.register = ((self.loss(achive), self.fail_counter) + achive) self.alive = False return True return False def loss(self, reg): r = np.array(reg) return (self.loss_factor*(r*r)).sum() # reg[0]*reg[0]+reg[1]*reg[1]*self.time_factor*self.time_factor def reset(self): self.alive = True sq.Fauna.genes = [ Brain(schema=schema) for _ in range(population) ] sq.Fauna.zoo = [ DiyingCreature( color=new_color, size=(20, 20), movement=RegisteredMov( pos=launch, box=Window, brain=b, track=track) ) for b in sq.Fauna.genes ] park = Eden() park.add_widget(Discus(radius=track.out_radius, color=(1., 1., 1.))) park.add_widget(Discus(radius=track.in_radius, color=(.0, .0, .0))) for c in sq.Fauna.zoo: park.add_widget(c)
dt *= self.dt/self.df # print(f'Times: given_dt={old_dt}, sim_dt={self.dt}, frame_dt={self.df}, actual_dt={dt}') dt = min((dt, self.dt)) # Limits the time step so nothing blows if dt is too large Movement.inc_t(dt) self.watch.text = f'{Movement.t:10.2f} s' # print(self.watch.text) for ch in Fauna.zoo: # if ch.mov.alive: ch.move(dt) self.new_era(dt) def new_era(self, dt): # print('new era') pass class Fauna(object): # root = Widget() zoo = [] class ParkApp(App): park = None def build(self): self.park = Park() for c in Fauna.zoo: self.park.add_widget(c) return self.park if __name__ == "__main__": Fauna.zoo = (Creature(color=(.2, .8, .1, .5), brain=Brain(schema=(4,6,4))), Creature(brain=Brain(schema=(4,6,4)))) Fauna.zoo[1].color = (.2, .8, .9, .5) ParkApp().run()