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()
こんな感じで使えます。
手軽だよねー。 考えるべきは評価関数の事だけになるから、とっても楽ちん。 ま、評価関数作るのがむつかしいんだけれどね、大抵。