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
Exemple #4
0
            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()