pyevolveの使い方メモ

ニコニコ動画にアップロードされている【人工知能】物理エンジンで人工生命つくって学習させたをみて、遺伝的アルゴリズムに興味を持ったので、python遺伝的アルゴリズムを利用することができるpyevolveを試してみました。ドキュメントは、こちらにあります。ここを見ながら、試した。

アルゴリズムは、wikipediaでお勉強した。

  • ダウンロードとかインストール

http://sourceforge.jp/projects/sfnet_pyevolve/releases/から、ダウンロードできるのが、最新版かと。

  • どんな値をどれだけも持つかをセット

値が0か1のとき

genome = G1DBinaryString.G1DBinaryString(10) # 数値は、遺伝子の数

数値だったり、文字だったり

genome = G1DList.G1DList(10)
genome.setParams(allele=setOfAlleles) # どんな値を持つかを設定しておく
genome.initializator.set(Initializators.G1DListInitializatorAllele)
    • genome.setParamsについて

それぞれが異なる場合

setOfAlleles = GAllele.GAlleles()
for i in xrange(10):
    a = GAllele.GAlleleRange(0, i)
    setOfAlleles.add(a)

共通の場合

setOfAlleles = GAllele.GAlleles(homogeneous=True)
choices = [1,2,3,4,5]
lst = GAllele.GAlleleList(choices)
setOfAlleles.add(lst)

一次元の場合の例を示したが、二次元でもできるよう。

  • 評価関数のセット
genome.evaluator.set(eval_func)

評価関数は、こんな感じに書いておいた

def eval_func(chromosome):
    return sum(chromosome)
  • 交叉の方法は、こんな風に
genome.crossover.set(Crossovers.G1DBinaryStringXSinglePoint) # 0,1を持つ遺伝子の一点交叉
genome.crossover.set(Crossovers.G1DBinaryStringXTwoPoint) # 0,1を持つ遺伝子の二点交叉
genome.crossover.set(Crossovers.G1DBinaryStringXUniform) # 0,1を持つ遺伝子の一様交叉
genome.crossover.set(Crossovers.G1DListCrossoverSinglePoint) # 0,1のみでない遺伝子の一点交叉
genome.crossover.set(Crossovers.G1DListCrossoverTwoPoint) # 0,1のみでない遺伝子の二点交叉
genome.crossover.set(Crossovers.G1DListCrossoverUniform) # 0,1のみでない遺伝子の一様交叉
  • シンプルGAの作成

プログラミングによっては、シンプルGA以外も使えます。

ga = GSimpleGA.GSimpleGA(genome)
  • GAの設定
GENERATION = 100 # 試行する世代数
POPULATION_SIZE = 50 # 1世代の数
CROSSOVER_RATE  = 1.0   # 交叉確立
MUTATION_RATE   = 0.10  # 突然変異の発生確率

ga.setGenerations(GENERATION)
ga.setPopulationSize(POPULATION_SIZE)
ga.setCrossoverRate(CROSSOVER_RATE)
ga.setMutationRate(MUTATION_RATE)
  • 選択方法の設定

ルーレット選択

ga.selector.set(Selectors.GRouletteWheel)

トーナメント選択

Consts.CDefTournamentPoolSize = 3 # トーナメントサイズ
ga.selector.set(Selectors.GTournamentSelector)

ランキング選択

ga.selector.set(Selectors.GRankSelector)
  • シミュレーションの開始
ga.evolve(freq_stats=10) # freq_stats=10にすると、10世代ごとに途中経過を表示する。
  • 結果の出力
print ga.bestIndividual()
print list(ga.bestIndividual()) # 最終結果の遺伝子の状態を出力


GAは、いろいろな応用例があるそう。重回帰分析をするときの変数選択に適用する論文を見つけた。最近では、遺伝的アルゴリズムより遺伝的プログラミングの方が活発に研究されているみたい。違いの一つとしては、遺伝的アルゴリズムは、データを配列として持つのに対して、遺伝的プログラミングは、木構造を利用している。