忍者ブログ
たまにロボットを考えるブログ・・・。

先日から、やっておりました。遺伝的アルゴリズムてきなものです。
授業の課題だったのですが、先日発表が終わったので掲載してみます。
いわゆる「斜方投射」ってやつです。

大まかな流れは
①0~90°でランダムに角度を生成。
②それぞれの飛距離を計算。
③飛距離の大きいものが全体数から、半分選出。
④角度の何桁目、何桁目を遺伝情報として交換。
⑤遺伝情報をもとに、2個体から4個体を生成。
⑥50パーセントの確率で、2個体だけ遺伝情報(角度値)の小数点以下がランダム値で増減。
⑦ループになる⇒②

問題なのは、収束の判定をどうするのか。
最適解でなくても収束するので、どうしたものか?

と思いながら作っていたが割とそうでもなかった。

でプログラムが得意でない僕は、上位の選出が一番難しかった。
なので、こんな感じのプログラムになった。

void touta(double *distance)
{
    int i=0,j=0,k=0;
    double eps=EPS,dis[NUM];
    char lost_f=0;
    for(i=0;i<NUM;i++)
    {
        dis[i] = distance[i];
    }

    i=0;
    j=0;
    while(i!=NUM/2)
    {
        if(dis[j]<eps)
        {
            g_lost_num[i]=j;
            dis[j]+=100;
            i++;
        }
        j++;
        if(j>=NUM)
        {
            j=0;
            eps += EPS;
        }
    }
    /*selection*/
    j=0;
    for(i=0;i<NUM;i++)
    {
        /*i_num is lost or not*/
        k=0;
        lost_f=0;
        for(k=0;k<(NUM/2);k++)
        {
            if(g_lost_num[k]==i)lost_f=1;
        }
       
        /*not, surv*/
        if(lost_f==0)
        {
            g_surv_theta[j] = g_theta[i];
            j++;
        }
    }

}


小さい値をですね、少しずつ足していきます。
足すたびに、すべての個体と比較します。
で、より低かった個体の配列番号を記録します。

ナンバーが50個選ばれます。

で、選ばれなかったナンバーの値だけ、別の配列に入れます。


というような感じになります。
この小さい値というのがネックです。
一桁減らすだけで、計算量が飛躍的に増えるので、重いです。
ですが、ここが重要なんでして。角度の精度が出るかでないかのメインポイントです。

ここが大きいと、低いほうの精度が重要に成るほうの遺伝情報が、抹殺されてしまうので・・・。


でもまあ、うまくいったからいいか。

拍手[0回]

PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
プロフィール
HN:
Adel
年齢:
27
性別:
男性
誕生日:
1989/09/17
職業:
会社員
趣味:
モチベーション探し
自己紹介:
ロボットつくるのが夢
ブログ内検索
カウンター
君は何人目かな
カレンダー
07 2017/08 09
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
最新コメント
[06/22 fake serpenti watch bvlgari]
[06/22 where to buy hermes clic clac bracelet faux]
[04/09 blacklab]
[02/16 オイルマン]
[09/11 M.A(CIT)]
最新トラックバック
コガネモチ
忍者AdMax
アクセス解析
忍者ブログ [PR]