def run_round(self, task): results = zip(self.stable, self.pool.map(task, self.stable)) if self.best: results.append(self.best) print "Ranking winners" ranked_results = sorted( results, key=lambda (n, r): self.fitness_function(r), reverse=True ) best_result = ranked_results[0] self.best = best_result bn, best = best_result wn, worst = ranked_results[-1] print "Best score was", best, bn.name print "Worst score was", worst, wn.name cream = ranked_results[:self.cream] cream = [n for n, s in cream] print "Selected", len(cream), "best networks" new_class = [] for _ in range(self.cream): new_blood = Network(*self.network_parameters) new_blood.initialise(self.rng) new_class.append(new_blood) while len(new_class) < self.class_size: new_network = Network(*self.network_parameters) new_network.cross(self.rng, *cream) new_class.append(new_network) self.stable = new_class print "Produced", len(self.stable), "new networks"
def test_crossing_networks(): network_params = (10, 7, 4) net1 = Network(*network_params) net2 = Network(*network_params) rng = Random("tests") net1.initialise(rng) net2.initialise(rng) net3 = Network(*network_params) net3.cross(rng, net1, net2)