2016-11-09 26 views
1

私は現在、Pythonの遺伝的アルゴリズムにDEAPを使用しています。長さがno_sensorsの個体の初期集団を作りたいと思います。私の問題は、random.choice(nodes)の機能のために、いくつかのノードは同じになり、最初の長さはno_sensorsよりも小さくなります。この問題を解決する方法はありますかと思いまして:DEAP遺伝的アルゴリズム

creator.create("FitnessMax", base.Fitness, weights=(2.0, -1.0)) 
creator.create("Individual", set, fitness=creator.FitnessMax) 

toolbox = base.Toolbox() 
toolbox.register("attr_item", random.choice, nodes) 
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_item, n=no_sensors) 
toolbox.register("population", tools.initRepeat, list, toolbox.individual) 

基本的に、私はリストnodesからユニークなアイテムの固定長を必要としています。 random.sample(nodes, no_sensors)を使用することを考えていましたが、エラーを発生させることなくコードに組み込むことができません。

他の例hereをチェックアウトできます。

答えて

0

いくつかの考えた後、私はこの回避策を思い付いた:

creator.create("FitnessMax", base.Fitness, weights=(2.0, -1.0)) 
creator.create("Individual", list, fitness=creator.FitnessMax) 

toolbox = base.Toolbox() 
toolbox.register("attr_item", random.sample, nodes, no_sensors) 
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_item, n=1) 
toolbox.register("population", tools.initRepeat, list, toolbox.individual) 

毎回あなたがコンテンツにアクセスしたいので、それは、しかし少し醜いですリストindividualのタイプがIndividualの場合は、individual[0]に電話し、individual[0]のコンテンツを繰り返し処理する必要があります。

0

あなたがfunctools.partialrandom.sampleを使用することができます。

from functools import partial 
import random 
no_sensors = 5 
mysample = partial(random.sample,k=no_sensors) 
toolbox.register("attr_item", mysample, nodes) 
+0

しかし、問題は、random.choiceが同じ値を2回選択した場合、1つとして数えたいと思うことです。基本的には、リストから固定長の固有の項目が必要です。私はrandom.sample(nodes、no_sensors)を使用することを考えていましたが、エラーを発生させることなくコードに組み込むことはできません。 – meraxes

+0

セットは変更可能であり、ハッシュ可能ではないのでリストを含めることはできません.'set([[1,2,3]、3]) TypeError:unhashable type: 'list'' –

+0

ああ、そうです!私はIndividualの基盤をリストに変更しました。それでも、リスト内のリストは冗長に見えます。 – meraxes

関連する問題