課題のために遺伝的アルゴリズムを使う必要があったので,Pythonで遺伝的アルゴリズムを動かすことのできるライブラリPyevolveを試してみた.

始めの一歩

動かし方はとてもシンプルなので,公式ドキュメントのGet Startedをざっと見たあとにExampleでどういう使い方ができるのかを個別に見ていけばいいと思う.

日本語資料なら,自分が確認した限りでは以下のサイトが一番詳しい.

Pyevolveの基本的な使い方

ゲノムインスタンスの生成

ゲノムの構造はバイナリや1次元配列,2次元配列,木構造などを取ることができ,初期値が取りうる値の幅なども決めることができる.以下のコードでは,値が15個あって最小値0,最大値100というゲノムを作成している.

1
2
genome = G1DList.G1DList(15)
genome.setParams(rangemin=0, rangemax=100)

ゲノムの初期化,突然変異の設定

次に,ゲノムインスタンスを初期化して突然変異の分布などを指定する.最初に指定したゲノムの構造に従って指定する必要があるが,パラメータはだいたい読んだ通り.

1
2
genome.initializator.set(Initializators.G1DListInitializatorReal)
genome.mutator.set(Mutators.G1DListMutatorRealGaussian)

値が整数の場合は”G1DListInitializatorInteger”や”G1DListMutatorIntegerGaussian”が用意されている.

評価関数をセット

評価関数eval_funcを作って,ゲノムインスタンスに指定する.

1
2
3
def eval_func(chromosome):

[...]
1
genome.evaluator.set(eval_func)

GA Engineを作成する

1
ga = GSimpleGA.GSimpleGA(genome)

選択方式などのパラメータを指定する

デフォルトでGA Engineを動かした場合,世代数や集団数は以下のようになる.

  • 100 世代
  • 集団サイズ:80個体
  • ランキング選択

これらを変更するには,以下のようにパラメータをセットする.

1
2
3
4
ga.selector.set(Selectors.GRouletteWheel)
ga.setGenerations(5000)
ga.setMutationRate(0.1)
ga.setPopulationSize(100)

選択方法は,その他にもランキング方式やトーナメント方式などが用意されている.

GA Engineの実行

1
ga.evolve(freq_stats=250)

実行中はfreq_statsで指定した世代ごとに以下のようなログが出力される.

1
2
3
4
5
Gen. 1 (0.02%): Max/Min/Avg Fitness(Raw) [23104.07(27490.00)/15107.82(10386.00)/19253.39(19253.39)]
Gen. 250 (5.00%): Max/Min/Avg Fitness(Raw) [9486.89(15212.00)/6883.91(3184.00)/7905.74(7905.74)]
Gen. 500 (10.00%): Max/Min/Avg Fitness(Raw) [8749.57(15233.00)/6518.94(3085.00)/7291.31(7291.31)]
Gen. 750 (15.00%): Max/Min/Avg Fitness(Raw) [8259.84(14274.00)/6173.50(3073.00)/6883.20(6883.20)]
[]

pyevolve_graph.pyの使い方

Pyevolveには,イテレーションの変化を可視化する便利なスクリプトがある.

1. DBAdaptersをインポートする

1
from pyevolve import DBAdapters

2. 以下のスクリプトを追記する

挿入する場所はGSimpleGA.GSimpleGA() のすぐ後.

1
2
3
ga = GSimpleGA.GSimpleGA(genome)
sqlite_adapter = DBAdapters.DBSQLite(identify="ex1")
ga.setDBAdapter(sqlite_adapter)

これで,GAの実行後にpyevolve.dbというファイルが作成される.

3. pyevolve_graph.pyを実行する

あとはpyevolve_graph.pyを実行する.可視化するグラフのタイプなどが選べるようになっているので,その辺りのパラメータはマニュアルを参考.

例えば,以下のようなグラフを出力することができる.

1
$ pyevolve_graph.py -i ex1 -3 -g 1:500 -o pyevolve_graph

最後に:Pythonで遺伝的アルゴリズムをするなら

最後に残念なお知らせだが,Pyevolveは少なくとも2年前から開発が止まっている.Pyevolve安定版0.5で公式に対応しているPythonのVersionも2.6となっている(2.7では動いた.3.x系は不明).

どうやら現在ではDEAPというライブラリが精力的に開発されているようだ.まだオンラインの資料は少ないものの,3.x系などの対応を考えるならこちらを使うのも手だろう.

もし遺伝的アルゴリズムをPythonを使って自分で実装したい場合は,集合知プログラミング11章「進化する知性」がお薦めできる.基本的なアルゴリズムに加えて,交叉や突然変異の書き方であったり様々なデータタイプに対応したりと,実装も丁寧に解説されている.

動作環境

  • Mac OS X 10.8.5
  • Python 2.7.6
  • Pyevolve 0.5

参考