Skip to content

Commit

Permalink
Add energy renew mechanism to EvoLife (#55)
Browse files Browse the repository at this point in the history
  • Loading branch information
a5kin committed May 21, 2019
1 parent 8b04521 commit 2d57971
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 8 deletions.
15 changes: 9 additions & 6 deletions examples/evolife.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,12 +83,6 @@ def absorb(self):
num_fit = core.IntegerVariable()
num_fit += xmath.max(*fitnesses)

# new energy value
self.main.energy = (self.main.energy - self.meta.death_speed) * \
(self.main.energy > self.meta.death_speed)
self.main.energy *= is_sustained
self.main.energy |= 255 * (num_fit > 0) * (self.main.energy == 0)

# neighbor's genomes crossover
genomes = []
for i in range(len(self.buffers)):
Expand All @@ -97,11 +91,20 @@ def absorb(self):
is_fit = self.neighbors[i].buffer.rule.is_born(num_fit)
genomes[i] += self.neighbors[i].buffer.rule * is_fit
num_genes = self.main.rule.bit_width
old_rule = core.IntegerVariable()
old_rule += self.main.rule
genomes.append(self.main.rule)
self.main.rule = genome_crossover(
self.main, num_genes, *genomes,
mutation_prob=self.meta.mutation_prob
)

# new energy value
self.main.energy = (self.main.energy - self.meta.death_speed) * \
(self.main.energy > self.meta.death_speed)
self.main.energy *= is_sustained | (num_fit > 0)
is_renew = (self.main.rule != old_rule) | (self.main.energy == 0)
self.main.energy |= 255 * (num_fit > 0) * is_renew
self.main.energy *= xmath.popc(self.main.rule) <= self.meta.max_genes

@color_effects.MovingAverage
Expand Down
4 changes: 2 additions & 2 deletions tests/core/test_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,13 +201,13 @@ def test_genetics_general(self):
model.step()
cells = model.gpu.arrays.cells.get()[:model.cells_num]
checksum = binascii.crc32(cells)
self.assertEqual(3142230500, checksum, "Wrong field checksum.")
self.assertEqual(3351683720, checksum, "Wrong field checksum.")
model = EvoLife(CrossbreedingExperiment2)
for _ in range(self.num_steps):
model.step()
cells = model.gpu.arrays.cells.get()[:model.cells_num]
checksum = binascii.crc32(cells)
self.assertEqual(2601589301, checksum, "Wrong field checksum.")
self.assertEqual(3791001013, checksum, "Wrong field checksum.")

def test_interactive(self):
"""Test CA with interactive parameter works correctly."""
Expand Down

0 comments on commit 2d57971

Please sign in to comment.