Blanktar

  1. top
  2. blog
  3. 2013
  4. 04

pythonのpyevolveで遺伝的アルゴリズム。

前回の予告通り、今回は遺伝的アルゴリズムを実装してみるよ。

pyevolveっていうライブラリを使います。 portageには無いのよね。残念。

import random
from pyevolve import G1DList
from pyevolve import GSimpleGA

# まずは答えを作る。
# この答えに似てる程いい、って評価にしてみる。
answer = [random.randint(0, 9) for x in range(64)]

# 遺伝子を評価するための関数。
# 今回は1次元配列を使うので、chromesomeはそのまんま一次元の配列。
def EvalFunc(chromesome):
    score = 0.0
    for a, b in zip(answer, chromesome):
        if c == b:
            score += 1
    return score / len(answer)

# ゲノム(つまり遺伝子?)を作る。
genome = G1DList.G1DList(len(answer))

# 一つの要素が取る値の範囲を指定。
#  しなくてもおっけー。
genome.setParms(rangemin=0, rangemax=9)

# 評価関数を指定。
genome.evaluator.set(EvalFunc)

# 環境(シミュレーションを実行する単位)を作る。
ga = GSimpleGA.GSimpleGA(genome)

# 一世代の数を指定。
#  指定しないでもおっけー。デフォルト値は知らん。
ga.setGenerations(500)

# 計算を実行する。
#  freq_statusを指定しておくと、計算の経過を表示してくれる。
#  今回は10を指定してあるので、10世代ごとに表示される。
ga.evolve(freq_status=10)

# 一番良かった計算結果を取得
best = ga.bestIndividual()

# 結果を詳細に表示する
print best

# 出てきた答えと、そのスコアだけを表示する
print 'genome :', best.genomeList
print 'score :', best.getRawScore()

こんな感じで使えます。

手軽だよねー。 考えるべきは評価関数の事だけになるから、とっても楽ちん。 ま、評価関数作るのがむつかしいんだけれどね、大抵。