LoginSignup
4
7

More than 5 years have passed since last update.

GeneticSharp使い始めまとめ

Posted at

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世代のみの計算が行われるのであまり意味がないと思われる。

今後

今後は簡単なナップザック問題でも作りながら、それぞれについてもう少し掘り下げてみたい。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7