1

私は、DEAP を使用して最初の進化的アルゴリズムを作成しています。すべてが機能していますが、MultiFlipBit ミューテーション オペレーターです。ツリー (個別) を変更しようとすると、次のエラーが発生します。

File "Genetic_Programming.py", line 92, in main
    halloffame=hof, verbose=True)

    offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)
File "/Users/anaconda/lib/python2.7/site-packages/deap/algorithms.py", line 235, in varOr
    ind, = toolbox.mutate(ind)
File "/Users/anaconda/lib/python2.7/site-packages/deap/tools/mutation.py", line 132, in mutFlipBit
    individual[i] = type(individual[i])(not individual[i])
TypeError: __init__() takes exactly 4 arguments (2 given)

コードは次のとおりです。

pset = gp.PrimitiveSet("MAIN", 8)
pset.addPrimitive(operator.and_, 2)
pset.addPrimitive(operator.or_, 2)
pset.addPrimitive(operator.xor, 2)
pset.addPrimitive(operator.not_, 1)

creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMax)

toolbox = base.Toolbox()
toolbox.register("expr", gp.genGrow, pset=pset, min_=1, max_=8)
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.expr)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox.register("compile", gp.compile, pset=pset)

def evalSymbReg(individual):
    # Transform the tree expression in a callable function
    print individual
    ind = toolbox.compile(expr=individual)
    # Evaluate the mean squared error between the expression
    # and the real function : x**4 + x**3 + x**2 + x
    performance=Genetic_V0.genetic_backtest(ind)
    return performance,

toolbox.register("evaluate", evalSymbReg)
toolbox.register("select", tools.selTournament, tournsize=50)
toolbox.register("mate", gp.cxOnePoint)
#toolbox.register("expr_mut", gp.genGrow, min_=1, max_=4)
#toolbox.register("mutate", tools.mutFlipBit, expr=toolbox.expr_mut, pset=pset)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.95)

def main():
    nu=50 
    pop = toolbox.population(n=nu)
    hof = tools.HallOfFame(3)

    stats_fit = tools.Statistics(lambda ind: ind.fitness.values)
    stats_size = tools.Statistics(len)
    mstats = tools.MultiStatistics(fitness=stats_fit, size=stats_size)
    mstats.register("avg", numpy.mean)
    mstats.register("std", numpy.std)
    mstats.register("min", numpy.min)
    mstats.register("max", numpy.max)
    pop, log = algorithms.eaMuPlusLambda(pop, toolbox, nu/2, nu/2, 0.85, 0.15, 200,stats=mstats,
                                   halloffame=hof, verbose=True)

    # print log
    return pop, log, hof

if __name__ == "__main__":
    main()

助けてくれてありがとう。

Python バージョン: 2.7

EDITED:問題を解決する方法についての提案の後、何が起こっているのかをよりよく理解するために、DEAPミューテーションライブラリにいくつかの「印刷」を追加しました。元の質問と同じエラーですが、いくつかの追加情報があります。

individual is  not_(ARG7)
individual[i] is  <deap.gp.Primitive object at 0x10746c158>
(not individual[i]) is  False
type(individual[i]) is  <class 'deap.gp.Primitive'>
type(individual[i])(not individual[i]) is 
Traceback (most recent call last):
  File "Genetic_Programming.py", line 98, in <module>
    main()
  File "Genetic_Programming.py", line 92, in main
    halloffame=hof, verbose=True)
  File "/Users/giorgio/anaconda/lib/python2.7/site-packages/deap/algorithms.py", line 317, in eaMuPlusLambda
    offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)
  File "/Users/giorgio/anaconda/lib/python2.7/site-packages/deap/algorithms.py", line 235, in varOr
    ind, = toolbox.mutate(ind)
  File "/Users/giorgio/anaconda/lib/python2.7/site-packages/deap/tools/mutation.py", line 136, in mutFlipBit
    print "type(individual[i])(not individual[i]) is ", type(individual[i])(not individual[i])
TypeError: __init__() takes exactly 4 arguments (2 given)

貢献してくれてありがとう

4

1 に答える 1

1

このエラーは、deap.tools.mutFlipBit関数を のインスタンスである個体のミューテーターとして使用しようとしていることを訴えていますdeap.gp.PrimitiveTreemutFlipBitのドキュメントから:

個体はシーケンスであると予想され、属性の値は not 演算子が呼び出された後も有効なままになります

したがって、コードが の要素iを変更することを決定した場合individual、それは を評価しようとしていdeap.dp.Primitive(not ind[i])ます。そして、エラーは、渡された の代わりにのコンストラクターPrimitiveが 4 つの引数を取ることを訴えます。self, name, args, retself, (not ind[1])

エラーの原因は 2 つあります。

  1. mutBitFlipミューテーターは、期待されるブール値のリストではなく、「シンボリック値」と「演算子」の両方のリストで構成される個体に適用されます。そのため、コードは定義されていないandを反転するなど、演算子を否定しようとする可能性があります。Falseただし、オブジェクトはブール値のコンテキストで評価されるため、コードは生成され、ブール値である単一の引数からTrue新しいものを作成しようとすることになります。Primitive

  2. 関数が aと a をmutFlipBit区別でき、 sを否定しようとするだけであったとしても、 a の主な目的は値 (つまり定数) に相当する単一の式を見つけることではなく、式を見つけることであるため、シンボリックターミナルを使用します。関数と同等の引数付き。PrimitiveTerminalTerminaldeapPrimitiveTree

進化させようとしているもの、ブール方程式またはブール関数への引数のセットにマップされる式を再検討する必要があります。それに基づいて、コードを再設計します。

最初の答え:

行が表示されていないため、コードは完全ではありoffspring = varOr(population, toolbox, lambda_, cxpb, mutpb)ません。

ただし、問題は、変数内の個人のいずれかのタイプによって引き起こされますpopulation。コードは、個人がブール値のリストであると想定しているため、コードindividual[i] = type(individual[i])(not individual[i])は機能します。

x = True
print type(x)(not x)  # Equivalent of bool(True) => False

エラーは、3 つの引数を期待するクラスの初期type(individual[i])化を取得したことを示しています (例: + 他の 3 つの引数)。self

于 2015-12-04T05:09:33.440 に答える