def nominate_delegates(self): return [ x.v for x in list( paretofront_layers( self.individuals, lambda indv: self.driver. calculate_objectives(indv)))[0] ]
def test_paretofront_layers_moremore(self): """ Previous tests were not enough, some errors did show in e.g. kursawe. """ def mk_indiv(): return [random.uniform(a, b) for a, b in kursawe.dims] def eval_fits(indiv): return indiv, [f(indiv) for f in kursawe.fitnesses] random.seed() pop = [eval_fits(mk_indiv()) for _ in range(400)] layers = paretofront_layers(pop, operator.itemgetter(1)) for layA, layB in itertools.combinations(layers, 2): for indA_1, indA_2 in itertools.product(layA, repeat=2): try: self.assertEqual(0, domination_cmp(indA_1[1], indA_2[1])) except AssertionError as e: print("ERR!\n\nA = {0}\nB = {1}\nf(A) = {2}\nf(B) = {3}".format(indA_1[0], indA_2[0], indA_1[1], indA_2[1])) raise e for indA in layA: for indB in layB: try: self.assertFalse(dominates(indB[1], indA[1])) except AssertionError as e: print("ERR!\n\nA = {0}\nB = {1}\nf(A) = {2}\nf(B) = {3}".format(indA[0], indB[0], indA[1], indB[1])) raise e
def emigrate(self): logger = logging.getLogger(__name__) def fitfun_res(ind): return [f(ind) for f in self.outer.fitnesses] current_population = self.driver.population refugees = [] for _ in range(self.outer.migrants_number): pareto_layers = [ l for l in ea_utils.paretofront_layers(current_population, fitfun_res=fitfun_res) ] weights = [1 / (i + 1) for i in range(len(pareto_layers))] chosen_layer = weighted_choice(zip(pareto_layers, weights)) refugee = random.choice(chosen_layer) refugees.append(refugee) if refugee not in current_population: logger.error("DUPA WSZECHCZASÓW") current_population.remove(refugee) logger.debug("after emigrate: " + str(len(self.driver.population))) self.all_refugees.extend(refugees) return self.driver.message_adapter.emigrate(refugees)
def test_paretofront_layers_even_more(self): fitnesses = [lambda xs: (xs[0] - 2) ** 2, lambda xs: (xs[1] + 3) ** 2] def fits(xs): return [f(xs) for f in fitnesses] random.seed() mkd = lambda: random.choice([0, 1, 2, 3]) #noinspection PyUnusedLocal pop = [[mkd() for j in range(3)] for i in range(1000)] res = paretofront_layers(pop, fits) ind_a = [2, 3, 2] ind_b = [2, 2, 1] self.assertNotEqual(0, domination_cmp(fits(ind_a), fits(ind_b))) self.assertNotEqual(0, domination_cmp(fits(ind_b), fits(ind_a))) for layer in res: for ind_a, ind_b in itertools.combinations(layer, 2): fa, fb = fits(ind_a), fits(ind_b) self.assertEqual(0, domination_cmp(fa, fb)) self.assertEqual(0, domination_cmp(fa, fa)) self.assertEqual(0, domination_cmp(fb, fb)) self.assertFalse(dominates(fa, fb)) self.assertFalse(dominates(fa, fa)) self.assertFalse(dominates(fb, fb))
def test_paretofront_layers_moremore(self): """ Previous tests were not enough, some errors did show in e.g. kursawe. """ def mk_indiv(): return [random.uniform(a, b) for a, b in kursawe.dims] def eval_fits(indiv): return indiv, [f(indiv) for f in kursawe.fitnesses] random.seed() pop = [eval_fits(mk_indiv()) for _ in range(400)] layers = paretofront_layers(pop, operator.itemgetter(1)) for layA, layB in itertools.combinations(layers, 2): for indA_1, indA_2 in itertools.product(layA, repeat=2): try: self.assertEqual(0, domination_cmp(indA_1[1], indA_2[1])) except AssertionError as e: print("ERR!\n\nA = {0}\nB = {1}\nf(A) = {2}\nf(B) = {3}". format(indA_1[0], indA_2[0], indA_1[1], indA_2[1])) raise e for indA in layA: for indB in layB: try: self.assertFalse(dominates(indB[1], indA[1])) except AssertionError as e: print( "ERR!\n\nA = {0}\nB = {1}\nf(A) = {2}\nf(B) = {3}". format(indA[0], indB[0], indA[1], indB[1])) raise e
def rank(individuals: "Iterator Individual", calc_objective): """ :param individuals: Grupa indywiduów. :param calc_objective: Określa jak otrzymać wektor wyników. :return: Itertator: posortowane dane wejściowe od najlepszych do najgorszych. """ return iter(indiv for eqv_class in paretofront_layers(individuals, fitfun_res=calc_objective) for indiv in eqv_class)
def test_paretofront_layers(self): def identity(x): return [x] indvs = [[0, 0], [1, 1], [0, 1], [1, 0], [1, 1]] res = list(paretofront_layers(indvs, identity)) self.assertEqual(sum(len(layer) for layer in res), len(indvs)) self.assertListEqual(res[0], [[0, 0]]) self.assertTrue([0, 1] in res[1]) self.assertTrue([1, 0] in res[2]) self.assertListEqual(res[3], [[1, 1], [1, 1]])
def rank(individuals: 'Iterator Individual', calc_objective): """ :param individuals: Grupa indywiduów. :param calc_objective: Określa jak otrzymać wektor wyników. :return: Itertator: posortowane dane wejściowe od najlepszych do najgorszych. """ return iter(indiv for eqv_class in paretofront_layers(individuals, fitfun_res=calc_objective) for indiv in eqv_class )
def test_paretofront_layers_even_more(self): fitnesses = [lambda xs: (xs[0] - 2)**2, lambda xs: (xs[1] + 3)**2] def fits(xs): return [f(xs) for f in fitnesses] random.seed() mkd = lambda: random.choice([0, 1, 2, 3]) #noinspection PyUnusedLocal pop = [[mkd() for j in range(3)] for i in range(1000)] res = paretofront_layers(pop, fits) ind_a = [2, 3, 2] ind_b = [2, 2, 1] self.assertNotEqual(0, domination_cmp(fits(ind_a), fits(ind_b))) self.assertNotEqual(0, domination_cmp(fits(ind_b), fits(ind_a))) for layer in res: for ind_a, ind_b in itertools.combinations(layer, 2): fa, fb = fits(ind_a), fits(ind_b) self.assertEqual(0, domination_cmp(fa, fb)) self.assertEqual(0, domination_cmp(fa, fa)) self.assertEqual(0, domination_cmp(fb, fb)) self.assertFalse(dominates(fa, fb)) self.assertFalse(dominates(fa, fa)) self.assertFalse(dominates(fb, fb))
def nominate_delegates(self): return [x.v for x in list(paretofront_layers(self.individuals, lambda indv: self.driver.calculate_objectives(indv)))[ 0]]