コード例 #1
0
ファイル: orbit_model.py プロジェクト: chbicibi/adr
    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
コード例 #2
0
ファイル: test_run.py プロジェクト: Nomurad/eclib
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
コード例 #3
0
    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
コード例 #4
0
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()
コード例 #5
0
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()
コード例 #6
0
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
コード例 #7
0
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()
コード例 #8
0
    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
コード例 #9
0
    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