- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:遺伝的アルゴリズムの評価式に関する質問です。)
遺伝的アルゴリズムで組み合わせ問題を解く評価式の改善案について
このQ&Aのポイント
- 遺伝的アルゴリズムを用いて大規模組み合わせ問題を解く際に、現在使用している評価式が十分な効果を発揮していないため、改善案を求めています。
- 具体的な問題として、合計が109となる組み合わせを見つける遺伝的アルゴリズムについて説明しました。
- 現在使用している評価式では近似解に陥った場合、解を求めるのが遅くなってしまうため、改善案やアイデアを募集しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
どんなプログラムになってるのか解りにくいのですが、終了判定時に、floatデータと 1 とを == で比較してて、float 側の誤差のせいで、無限ループに陥ってるのかな?と思ったのだけれど、 評価式結果が0.0 から 1.0 までのfloatである必要があるなら、終了判定方法側を問題とすべきかと思います。 http://ipr20.cs.ehime-u.ac.jp/column/ga/chapter4.html このサイトを参考に、ナップサック問題でプログラムしてみたけど、かなり近似までいってるものに、交叉や突然変異をかけると、おおむね遠ざかってしまうので、もっとも近い物は除外して交叉するとか、10世代いっても解が得られないなら、初期の組み合わせからやり直すなど、f(x)以外の部分のアルゴリズムもよく練らないと、常に素早くとはいかないようですね。 途中経過データを出力するなどして、ループ原因を探るのがよいでしょう。
その他の回答 (1)
- mpro-gram
- ベストアンサー率74% (170/228)
回答No.1
現象として「整数しか扱わないはずなのに、評価式にわり算が入ってるせいで、循環小数やら、無限小数が割り込んできて計算精度を下げている」だろうことは予想が付く。 わり算を使わないで、どう解くかを考えればよいのでは? 割って1かどうかならわり算しないで、分母と分子を直接等号比較しちゃえば、分母に0 が紛れ込んでも問題ない。そのわり算後の結果データを使ってさらなる計算しているわけでもなさそうだし というか比較部分の問題だけなら、その式なら b==t なら真 true 値を返し、それ以外は偽 false を返す関数とすればよいような? f(t) = b / (b+ |b-t|) → f(t) = (b==t)?true:false
補足
mpro-gramさん 回答有難うございます。 すみません。説明するのを忘れていたのですが、 評価式で出た値をルーレット選択に利用しています。 つまり評価式f(x) = b/(b+|b-t|)の値が1(正解の組み合の値)に近いほどルーレット選択によって次世代の個体に残りやすくしています。 そして次世代の個体は、前の世代で評価値の高い個体を確率的に多く選択したものに、交叉や突然変異をして出来た個体になります。この処理を繰り返すことで答え(求める正解の組み合わせ)に近づきます。