2005年07月18日

ミス修正

先日作った進化アルゴリズムのプログラムに効率が悪すぎるとのつっこみを貰い
それがきっかけでちゃんと確率と期待値の計算をやりなおして
どう考えても現在のプログラムが返す結果がおかしいことが判った。
そんなわけでプログラムの修正。 
 
 
全ての子は必ず一箇所の変異を持って生まれ、一世代当たり100の子が生まれるとすると
12文字全部がちゃんと変わるのに世代数の期待値は30程度に収まるはず。
5〜600世代かかったという結果は一桁おかしい。
これでは一世代当たり10の子で試行するか変異率0.1程度で計算する場合の期待値と同程度の結果と言うことになる。
プログラムを作るときに世代辺りの試行数を10にするか100にするか、変異率をどうするかなどで迷ったので、
ひょっとして設定を間違えたかと思い数時間かけてアルゴリズムを隅々までチェックしてみた。


結論からいうとアルゴリズム自体には特に問題はなかったのだが
ランダマイズステートメントの使い方に問題があった。
ランダム関数の初期化に時間を引数として使っていたんだが、処理速度が早いためランダム関数がちゃんとランダムな数値を返せていなかったようだ。


デバッグモードで逐次処理をすると理論通りの結果が出るのにコンパイルすると効率が落ちるので
一体何が原因かと途方に暮れるところだった。
ちゃんと結果がわかって良かった。
ランダム関数というのは気をつけて使わないとランダムな数値を返してくれないのだな。
いい勉強になった。

作り直したプログラム
evolution.zip
posted by 黒影 at 03:44 | Comment(2) | TrackBack(0) | 雑記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
  1. プログラムを見ないで言っちゃいますけど、ひょっとしてループの中でrandomizeしてます? この手の関数はプログラムの起動時に一度だけ呼ぶのが正しいやり方です。
  2. Posted by p at 2005年07月18日 04:41
  3. >pさん
    ええ、各世代ごとに乱数系の初期化が行われるようになっています。

    世代処理はサブプロシージャ化してあってランダム処理もその中で行っており
    Generalプロシージャには置けないのでRandomizeもそこに入れています。
    例えばRandomizeをメインのプロシージャに移したとして他のサブプロシージャ内にまでその影響は出ましたっけ?
  4. Posted by 黒影 at 2005年07月18日 14:54
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]


この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。