課題のために遺伝的アルゴリズムを使う必要があったので,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
参考