def test_crossover(self): """ Should perform binary crossover on a subset of the population """ ind0 = np.random.rand(4) fit0 = np.arange(len(ind0)) pop = Population(individuals=ind0, fitness=fit0) # should change some values pop.crossover(p=1.) count = 0 for f0, f1 in zip(ind0, pop.individuals): if f0 != f1: count += 1 self.assertGreater(count, 0) # should set fitness for changed individuals to nan self.assertGreater(len(pop.inew), 0) # should handle > 1d ind0 = np.random.rand(50, 10) pop = Population(individuals=ind0, fitness=range(50)) pop.crossover(p=1.) self.assertGreater(len(pop.inew), 0) # should not change shape of individuals self.assertEqual(pop.individuals.shape, ind0.shape) # FIXME?? fails on np.log10(0) in power calc. in float2bin() ## should not produce NaNs ind0 = np.round(np.random.rand(100)) pop = Population(individuals=ind0) for p in [0.1, 0.5, 1.]: pop.crossover(p=p) self.assertEqual(len(np.nonzero(np.isnan(pop.individuals))[0]), 0)