遺伝アルゴリズムを試してみた


参考書籍

この本を読んだので簡単なサンプルを実装してみました
結構古い書籍ですが
「遺伝アルゴリズムの理論-自然・人口システムにおける適応-」

実装

今回は簡単のため以下のクラスを用いて
適応システムの対象の基本構造(遺伝子の代替)を加速度を表す順列に
適応度を単純に300フレーム後のx座標の進度
オペレータは単純交差、単純逆位、突然変異の三つのオペレータを
合成した単一のオペレータとしました
集団サイズは20,遺伝子長は50
また一回の世代交代で1個のみの子孫が既存のものと置き換わるようにしてあります

Agent.h

#define PATTERN_NUM 50

class Agent {
public:
    ofVec2f speed;
    ofVec2f pos;

    unsigned int accePattern[PATTERN_NUM];
    unsigned int index;


    Agent();
    void update();
    void init();
};

Agent.cpp
#include "Agent.hpp"

Agent::Agent(){
    for(int i = 0; i < PATTERN_NUM; i++){
        accePattern[i] = int(ofRandom(0, 9));
    }
    index = 0;
}

void Agent::init(){
    pos = ofVec2f(0,0);
    speed = ofVec2f(0,0);
    index = 0;
}

void Agent::update(){
    speed += ofVec2f(cos(float(accePattern[index]) * PI / 4.0 ),
                     sin(float(accePattern[index]) * PI / 4.0 ));
    pos += speed;
    index = (index + 1) % PATTERN_NUM;
}

結果

最初はこんな感じだったのが…

2900回の世代交代で…

こんな感じに
ちなみにバックのグラフは20個体の平均のスコアの推移です

この画像では交差確率 0.3, 逆位確率 0.01, 突然変異確率0.01で行いました
シミュレーション動画は以下
https://youtu.be/l2ivFB97yD4

突然変異確率を下げたものはこちら. 上記のような不安定さはありませんが
スコアの上昇も緩やかです.

終わりに

最初の参考書籍、そこまで読むのに時間かからない上、
基本的な数学の知識さえあれば理解できるのでオススメです
最適配分や遺伝プランのロバスト性、スキーマ、散布言語についても書いてあります

今回は内容の理解のために単純化して実装してみましたって趣旨なので
全体のコードは載せてませんが要望あれば整理してからかもう少しちゃんとしてから
どこかに載せるかもです

2016/04/20