Ejemplo n.º 1
0
    def __init__(self):
        # パラメータ
        n_dim = 10
        pop_size = 200
        epoch = 200
        imax = 100  # 対象デブリ数

        # 問題
        problem = Problem(n_dim)
        initializer = Initializer(n_dim, imax)

        # 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))

        optimizer = NSGA2(pop_size, selection, crossover, mutation)
        optimizer.setup(problem)

        ### Additional setting ###
        Genome.set_weight([10, 3600] * n_dim)
        Individual.set_weight([1, -1])
        optimizer.initializer = initializer
        optimizer.n_cycle = pop_size // 2
        # optimizer.alternation = 'replace'
        ##########################

        self.optimizer = optimizer
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
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
Ejemplo n.º 5
0
    def __init__(self, method, popsize=100, **kwargs):
        method = method.lower()
        if 'nsga' in method:
            opt_cls = NSGA2
            ga_ops = {}
        elif 'moea' in method:
            opt_cls = MOEAD
            if kwargs['ksize']:
                ksize = kwargs['ksize']
            else:
                ksize = 5
            ga_ops = {'ksize': ksize}
        else:
            print('Unknown method name:', method)
            raise RuntimeError

        # 設計変数の次元数
        n_dim = 3

        # 設計範囲
        low_bounds = [0, 0, 0]
        upp_bounds = [1, 1, 1]

        # 最適化重み(正=>最小化, 負=>最大化)
        opt_weight = [1, 1]

        # 問題関数
        # problem = Problem()
        problem = get_obj_func()

        with Environment() as env:
            # 個体クラス
            indiv_pool = env.register(Individual)

            # 遺伝子初期化クラス
            initializer = UniformInitializer(n_dim)

            # GAオペレータ指定
            ga_ops = {
              'selection': TournamentSelection(ksize=2),
              'crossover': SimulatedBinaryCrossover(rate=0.9, eta=20),
              'mutation': PolynomialMutation(rate=0.1, eta=20),
              **ga_ops
            }

            # GAクラス
            optimizer = opt_cls(problem=problem, pool=indiv_pool, **ga_ops)

            ### Additional setting ###
            # 設計範囲設定
            indiv_pool.cls.set_bounds(low_bounds, upp_bounds) # (下限,上限)

            # 最適化重み付け(正=>最小化, 負=>最大化)
            indiv_pool.cls.set_weight(opt_weight)

            # 親個体選択時の初期化周期
            optimizer.n_cycle = popsize // 2
            ##########################

            # 個体生成器
            creator = Creator(initializer, indiv_pool)

            # 登録
            env.optimizer = optimizer
            env.creator = creator
            self.env = env