C#で遺伝的アルゴリズムを使いたい機会があったので、GeneticSharpを使ってみようと思ったところあまり日本語の情報が様子なのでメモ程度に書き残しておきます。
ソースコードやサンプルコードは以下から入手
https://github.com/giacomelli/GeneticSharp
Visual Studioで使う場合はNuGetで取得できるのでわざわざ自前でコンパイルする必要はなさそう。
#必ず指定するもの
GeneticAlgorithmクラスのコンストラクタには以下の5つをわたす必要がある
- Population
- Fitness
- Selection
- Crossovers
- Mutations
このうちPopulationのコンストラクタに以下を渡す必要がある
- Chromosomes
Chromosomes
直訳すると「遺伝子」。
解こうとしている問題に応じてIChromosome / IBinaryChromosome インタフェースの実装、もしくはChromosomeBase / BinaryChromosomeBase クラスの継承を行う。
Populations
集団
Chromosomesを格納するためのListのようなもの。
Fitness
適合度の算出方法を定義する。
IFitness インタフェースを実装することで、問題に応じた適合度を算出する。
IFitness インタフェースで実装すべきメソッドはEvaluateのみで、先のChromosomesを受け取って適合度を返す必要がある。
Selections
適合度に応じてどのChromosomesを残すかを決める部分。
単純に適合度が高いN個を残すのであれば、Eliteを使う。
適合度が高いものほど選ばれやすくなるような確率を決めて、Chromosomesを選択するのであればRoulette Wheelを使う。
Crossovers
N世代目で残ったChromosomesから、N+1世代目のChromosomesを生成する際の交叉のアルゴリズムを決める。
解こうとしている問題によっては不適切なものもあるので慎重に選ぶ必要がある。
Mutations
突然変異を指定するクラス
#必要に応じて指定するもの
Reinsertions
N世代目からN+1世代目で用いるChromosomesを決めた後、N世代目のChromosomesから一部をN+1世代目に残すようにするアルゴリズム
GeneticAlgorithmクラスのコンストラクタ内でElitistReinsertionを使うようになっているので、こだわりがなければ指定する必要はない。
Terminations
終了条件を決める部分
指定しない場合、GenerationNumberによって1世代のみの計算が行われるのであまり意味がないと思われる。
今後
今後は簡単なナップザック問題でも作りながら、それぞれについてもう少し掘り下げてみたい。