LoginSignup
26
23

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-20

参考書籍

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

実装

今回は簡単のため以下のクラスを用いて
適応システムの対象の基本構造(遺伝子の代替)を加速度を表す順列に
適応度を単純に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;
}

結果

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

sample_と_動画_-_YouTube_と_遺伝アルゴリズムを試してみた.png

2900回の世代交代で…

sample_と_動画_-_YouTube.png

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

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

突然変異確率を下げたものはこちら. 上記のような不安定さはありませんが
スコアの上昇も緩やかです.
sample2_と_遺伝アルゴリズムを試してみた_と_1_1_件アップロード済み_-_YouTube.png

終わりに

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

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

2016/04/20

26
23
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
26
23