def __init__(self, popsize=100, ksize=5): # パラメータ n_dim = 10 # popsize = 200 # epoch = 100 imax = 100 # 対象デブリ数 # ksize = 5 # 問題 problem = Problem(n_dim) with Environment() as env: # 個体クラス indiv_type = Individual # 初期個体生成クラス indiv_pool = env.register(indiv_type) # 遺伝子生成クラス initializer = Initializer(n_dim, imax) # GAオペレータ指定 # selection = TournamentSelection(ksize=2) selection = TournamentSelectionStrict(ksize=2) # selection = TournamentSelectionDCD() # crossover = BlendCrossover(alpha=0.5) crossover = Crossover(ix=OrderCrossover(rate=0.9), dx=SimulatedBinaryCrossover(rate=0.9, eta=20)) mutation = Mutation(im=SwapMutation(rate=0.1), dm=PolynomialMutation(rate=0.1, eta=20)) ga_ops = { 'selection': selection, 'crossover': crossover, 'mutation': mutation } # optimizer = NSGA2(problem=problem, pool=indiv_pool, **ga_ops) optimizer = MOEAD(problem=problem, pool=indiv_pool, ksize=5, **ga_ops) ### Additional setting ### Genome.set_weight([1, 3600] * n_dim) Individual.set_weight([1, -1]) # optimizer.initializer = initializer optimizer.n_cycle = popsize // 2 optimizer.alternation = 'all' ########################## # 個体生成器 creator = Creator(initializer, indiv_pool) # 登録 env.optimizer = optimizer env.creator = creator self.env = env
def main(model, out): n_dim = 10 popsize = 30 epoch = 100 * 5 problem = Problem() with Environment() as env: indiv_pool = env.register(Individual) indiv_pool.cls.set_weight([1, -1]) initializer = UniformInitializer(n_dim) creator = Creator(initializer, indiv_pool) crossover = SimulatedBinaryCrossover(rate=0.9, eta=100) if model == 'moead': ksize = 10 options = { "ksize": ksize, "normalization": True, "crossover": crossover } optimizer = MOEAD(problem=problem, pool=indiv_pool, **options) optimizer.weight_generator(nobj=4, divisions=50) popsize = int(popsize) epoch = epoch elif model == 'nsga2': optimizer = NSGA2(problem=problem, pool=indiv_pool, normalization=False) elif model == 'para': optimizer = NSGA2_para(problem=problem, pool=indiv_pool) else: raise Exception('Unexpected model name') population = optimizer.init_population(creator, popsize=popsize) history = [population] print("obj weight:", population[0].data.weight) for i in range(1, epoch + 1): if i % 50 == 0: print("epoch ", i) population = optimizer(population) history.append(population) if i == epoch: file = f'popsize{popsize}_epoch{epoch}_{ut.strnow("%Y%m%d_%H%M%S")}.pkl' file = os.path.join(out, file) if not os.path.exists(out): os.makedirs(out) print('save:', file) ut.save(file, (env, optimizer, history)) return env, optimizer, history
def local_main(): n_dim = 30 popsize = 100 problem = zdt1 with Environment() as env: # 個体クラス indiv_type = Individual # 初期個体生成クラス indiv_pool = env.register(indiv_type) # 遺伝子生成クラス initializer = UniformInitializer(n_dim) creator = Creator(initializer, indiv_pool) # # 適応度クラス # fit_type = Fitness # # 初期個体生成クラス # evaluator = env.register(fit_type) ### # optimizer = NSGA2(problem=problem, pool=indiv_pool) optimizer = MOEAD(problem=problem, pool=indiv_pool, ksize=5) # optimizer.set_initializer(Initializer(3)) # optimizer.setup(problem) ### Additional setting ### # optimizer.initializer = initializer # optimizer.n_cycle = None # optimizer.alternation = 'replace' ########################## # indivs = [creator() for _ in range(popsize)] # population = Population([ind.evaluate(problem) for ind in indivs]) # optimizer.calc_fitness(population) population = optimizer.init_population(creator, popsize=popsize) history = [population] # print(population[0].data.origin) # return for i in range(100): population = optimizer(population) plot(population) origin = population[0].data.origin.origin or [] # print([x.id for x in origin], '->', population[0].data.id) history.append(population) if i % 50 == 50 - 1: ut.save(f'result/temp{i}.pkl', history) plt.show() return env, optimizer, history
def ga_result1(out='result'): ''' アニメーション表示 ''' file = ut.fsort(glob.glob(os.path.join(out, f'epoch*.pickle')))[-1] optimizer = MOEAD.load(file=file) print('epoch:', len(optimizer)) elite = optimizer.get_elite() print('elite:', len(elite)) imax = len(optimizer) - 1 for epoch in range(0, imax, 20): print(epoch, end='\n') # plt.cla() population = optimizer[epoch] # population = optimizer.calc_rank(population) front = [x for x in population] x, y = np.array([x.data.value for x in front]).T plt.scatter(x, y, color='blue', alpha=epoch / imax, label=f'epoch{epoch}') # plt.legend() plt.xlim((0, 50)) # plt.ylim((0, 50)) plt.pause(0.2) plt.show()
def ga_main1(out='result'): file = ut.fsort(glob.glob(os.path.join(out, f'epoch*.pickle')))[-1] optimizer = MOEAD.load(file=file) elite = optimizer.get_elite() print('elite:', len(elite)) imax = len(optimizer) for epoch, population in enumerate(optimizer): print(epoch, end='\n') plt.cla() # print([fit.rank for fit in population]) # exit() # for i in range(1): # front = [x for x in population if x.rank == i] # if not front: # continue # x, y = np.array([x.data.value for x in front]).T # plt.scatter(x, y, label=f'{front[0][0]:.3f}') front = population x, y = np.array([x.data.value for x in front]).T plt.scatter(x, y, label=f'{front[0][0]:.3f}') # plt.legend() # if epoch >= 10: # plt.show() # return plt.pause(10 / imax) plt.show()
def main1(out='result', force=False, clear_directory=False): ''' 最適化実行(ミニマル) ''' ''' ======== 最適化パラメータの定義 ======== ''' problem = zdt1 n_dim = 30 popsize = 100 epoch = 200 with Environment() as env: ''' ======== 必要なオブジェクトの準備 ======== ''' # 個体管理クラス indiv_pool = env.register(Individual) # 遺伝子生成クラス initializer = UniformInitializer(n_dim) # 初期個体生成クラス creator = Creator(initializer, indiv_pool) # 最適化オペレータ op0 = NSGA2(problem=problem, pool=indiv_pool) op1 = MOEAD(problem=problem, pool=indiv_pool, ksize=5) optimizer = op0 ''' ======== 初期集団の作成 ======== ''' population = optimizer.init_population(creator, popsize=popsize) history = [population] ''' ======== 最適化 ======== ''' for i in range(epoch): print('epoch', i + 1) population = optimizer(population) history.append(population) if i % 50 == 50-1: ut.save(f'result/temp{i}.pkl', history) if i >= epoch // 2: optimizer = op1 ''' ======== 結果保存 ======== ''' data = env, optimizer, history ut.save(f'result/optimize_#{ut.snow}.pkl', data) return env, optimizer, history
def ga_main2(out='result'): file = ut.fsort(glob.glob(os.path.join(out, f'epoch*.pickle')))[-1] optimizer = MOEAD.load(file=file) population = optimizer[-1] front = [x for x in population if x.rank == 1] front.sort(key=attrgetter('data.value')) for ind in front: print(ind.value, ind.data.value) crowdings = [ind.value[1] for ind in front] fig, axes = plt.subplots(2) axes[0].plot(crowdings) x, y = np.array([x.data.value for x in front]).T im = axes[1].scatter(x, y, c=crowdings, cmap='jet') # plt.xlim((0, 1)) # plt.ylim((0, 1)) fig.colorbar(im) plt.show()
def __init__(self, problem): # パラメータ n_dim = 30 pop_size = 100 ksize = 5 # MOEA/D近傍サイズ # epoch = 250 # save_trigger = lambda i: i == 1 or i % 10 == 0 # 10 epochごと # save_trigger = lambda i: i == epoch # 最後だけ if problem == zdt4 or problem == zdt6: n_dim = 10 if problem == zdt4: Individual.set_bounds([0.0] + [-5.0] * (n_dim - 1), [1.0] + [5.0] * (n_dim - 1)) # Individual.set_bounds([0], [1]) # Individual.set_weight([1, 1]) # 問題 # problem = zdt4 initializer = UniformInitializer(n_dim) selection = RandomSelection() # selection = TournamentSelection(ksize=2) # selection = TournamentSelectionStrict(ksize=2) # selection = TournamentSelectionDCD() # crossover = BlendCrossover(alpha=0.5) crossover = SimulatedBinaryCrossover(rate=0.9, eta=20) mutation = PolynomialMutation(rate=1/n_dim, eta=20) optimizer = MOEAD(pop_size, selection, crossover, mutation, ksize) # optimizer.set_initializer(Initializer(3)) optimizer.setup(problem) ### Additional setting ### optimizer.initializer = initializer optimizer.n_cycle = None optimizer.alternation = 'all' ########################## self.optimizer = optimizer
def __init__(self, pop_size=100, ksize=5): # パラメータ n_dim = 10 # pop_size = 200 # epoch = 100 imax = 100 # 対象デブリ数 # ksize = 5 # 問題 problem = Problem(n_dim) initializer = Initializer(n_dim, imax) # selection = TournamentSelection(ksize=2) # selection = TournamentSelectionStrict(ksize=2) selection = RandomSelection() # selection = TournamentSelectionDCD() # crossover = BlendCrossover(alpha=0.5) crossover = Crossover(ix=OrderCrossover(rate=0.9), dx=SimulatedBinaryCrossover(rate=0.9, eta=20)) mutation = Mutation(im=SwapMutation(rate=0.1), dm=PolynomialMutation(rate=0.1, eta=20)) optimizer = MOEAD(pop_size, selection, crossover, mutation, ksize) optimizer.setup(problem) ### Additional setting ### Genome.set_weight([1, 7200] * n_dim) Individual.set_weight([1, -1]) optimizer.initializer = initializer optimizer.n_cycle = pop_size // 2 optimizer.alternation = 'new' ########################## self.optimizer = optimizer