def _do(self, Hm, n_select, n_parents=1, **kwargs): algorithm = kwargs['algorithm'] n_pop = len(Hm) // 2 _, rank = NonDominatedSorting().do(Hm.get('F'), return_rank=True) Pc = (rank[:n_pop] == 0).sum() / len(Hm) Pd = (rank[n_pop:] == 0).sum() / len(Hm) PC = len(algorithm.opt) / n_pop # number of random individuals needed n_random = n_select * n_parents * self.pressure n_perms = math.ceil(n_random / n_pop) # get random permutations and reshape them P = random_permuations(n_perms, n_pop)[:n_random] P = np.reshape(P, (n_select * n_parents, self.pressure)) if Pc <= Pd: # Choose from DA P[::n_parents, :] += n_pop pf = np.random.random(n_select) P[1::2, 1][pf >= PC] += n_pop # compare using tournament function S = self.f_comp(Hm, P, **kwargs) return np.reshape(S, (n_select, n_parents))
def _do(self, pop, n_select, n_parents, **kwargs): # number of random individuals needed n_random = n_select * n_parents # number of permutations needed n_perms = math.ceil(n_random / len(pop)) # get random permutations and reshape them P = random_permuations(n_perms, len(pop))[:n_random] return np.reshape(P, (n_select, n_parents))
def _do(self, pop, n_select, n_parents=1, **kwargs): # number of random individuals needed n_random = n_select * n_parents * self.pressure # number of permutations needed n_perms = math.ceil(n_random / len(pop)) # get random permutations and reshape them P = random_permuations(n_perms, len(pop))[:n_random] P = np.reshape(P, (n_select * n_parents, self.pressure)) # compare using tournament function S = self.f_comp(pop, P, **kwargs) return np.reshape(S, (n_select, n_parents))