• 締切済み

遺伝的プログラム 制約

遺伝的プログラミングで教えてください。 下記のような課題を考えています。 三個の正の整数 A,B,Cが有ります。A+B+C の合計は 5000 下記のF1 + F2 + F3 の合計を最小となる様な A,B,C を導きたい。 F1=(1/25000 x (A-500)^2+100) x A F2=(1/25000 x (B-1500)^2+75) x B F3=(1/25000 x (C-3000)^2+50) x C AとBとCは16bitの2進数にして、48bitの固まりにして、1 点交叉法 で48bitの途中で入れ替え様と思っています。 A,B,Cの合計が常に5000となるようにした場合、1点交叉法 だと5000とならなくなるので、AとBの合計から5000を引いてCを導こうと思っていますが、その場合でも 交差後に5000を超える場合は、交叉やり直せば良いのでしょうか。 また1点交叉法以外にお勧めが有りましたら、教えていただけないでしょうか。

みんなの回答

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.3

>変数が20、関数が20の場合でも~ 質問の問題は#2さんも指摘されてますが、最適値がほぼ自明という、ものすごく簡単な問題なので、正直、どんなにアホな遺伝子の取り方ヲしても「うまく行ってしまう」でしょう。 もし、変数が増えたり、関数が複雑になったりすれば、全くそうは行きません。おそらく一点交叉ではうまく行かないでしょう。 個人的には(オリジナルの)遺伝的アルゴリズムは、あんまり性能の良い最適化アルゴリズムとは思わないので(特に連続変数の最適化では)、もし、遺伝的アルゴリズムを使うこと自体が目的ではなくて、最適化することが目的であるなら別のアルゴリズムを試してみることをおすすめします。 個人的には、連続変数の最適化(とくに制約が緩いor簡単に無制約に帰着できる場合)では、 Differentilal Evolution というアルゴリズム(広い意味では遺伝的アルゴリズムの一種です)が良いと思います。単純なアルゴリズムですが、各種のベンチマークなんかでは相当に優秀な結果がでています。

全文を見る
すると、全ての回答が全文表示されます。
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.2

 式を一目見れば、コタエはA=4998, B=C=1、って分かっちゃうでしょ。  たとえ、わざと探索で解いてみせるデモンストレーションなのだとしても、評価関数F=F1+F2+F3はA, B, Cで簡単に偏微分できるのだし、整数だという事以外の制約条件 (A≧1, B≧1, C≧1, A+B+C = 5000) はラグランジュの未定乗数法に素直に乗る。だから、最低の手抜きでも最急降下法を使わない理由がない。しかも、この問題には局所最適解なんかないので、どこからスタートしても確実に最適解に行き着く。  という訳で、この問題を解くのに遺伝的アルゴリズムを使おうというセンスがおかしい。あるいは、これが遺伝的アルゴリズムの演習だとするなら、出題のセンスがおかしい。いずれにしても、やればやるほどセンスやイロイロが鈍くなっちゃいそうな、とても悪趣味な話です。  悪趣味を承知で遺伝的アルゴリズムを使うにしたって、局所最適解がないんだから、多数の個体を維持する必要はなく、優勝者だけから次世代を生成すれば宜しい。つまり交叉には意味がなくて、単に優勝者のゲノムに点突然変異をひとつ加えたものを全種類作って(種類がbit数のぶんだけしかないから、全部作らない理由がない)、次の優勝者を選ぶ、ということを繰り返すだけで良い。  こんな問題に使っても、遺伝的アルゴリズムならではの特長というものが全く現れない。やっぱり悪趣味。  なお、制約条件については、A+B+Cが5000になるように規格化すればよろしい。A, B, Cの大きさを指定する遺伝子をそれぞれa, b, cとして、   A = 5000 a / (a+b+c)の四捨五入   B = 5000 b / (a+b+c)の四捨五入   C = 5000 - A - B として競争させるんでもいいが、これだとa, b, cが際限なく大きくなってオーバーフローすることもありうる。そこでもう一工夫するなら、(ま、要するに効率よくいろいろぐちゃぐちゃいじる、ということさえやればいいんだから、多少手を加えたって構わない)新しいゲノムを作る作業の最後の仕上げとしてこの式を使って、a, b, cを規格化された値A, B, Cに書き換えてしまえばいいでしょ。そうすれば、全てのゲノムは常にA+B+Cが5000になっているから。また、A, B, Cのどれかが0になった奴は即座に殺しとけ。    ともあれ酷い話だな。

全文を見る
すると、全ての回答が全文表示されます。
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

制約付きの最適化で、制約をどのように入れるのがよいかを考えることは、それ自体がものすごく困難な問題です。 また、遺伝的アルゴリズムは、交叉のさせ方に性能の良し悪しが決まって今います。 どんな、方法がよいかは問題毎に異なっていて、汎用的に有効な方法はないです。 ただ、質問の問題について言えば、目的関数や制約がかなり簡単なので、おそらく、どんな方法でやってもそれなりにうまくいく(うまくいってしまう)と思います。

yamamoto2000
質問者

補足

変数が20、関数が20の場合でも1 点交叉法で大丈夫でしょうか。 変数は正の整数で24bit程度に拡張する可能性があります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 生物学の遺伝計算の問題を教えてください。

    生物学の遺伝計算の問題を教えてください。 いかに挙げる問題の解答と出来れば詳しい解説をお願いします。 問 (A)から(D)に適切な数字を入れ、下記の問に答えよ。 劣性遺伝する形質の遺伝子Xとその対立遺伝子xがある。 親世代の遺伝子型がXxとxxであった場合、F1でこの形質があらわれる確率は、(A)%、F2であらわれる確率は、(B)%であると予想される。 (もし、この形質が優性遺伝であったら、F1でこの形質があらわれる確率は、(C)%、F2であらわれる確率は、(D)%である。)実際に、F2の遺伝子型を解析したどころ、Xxとxxが予想より極めて高率に存在することが判明した。これには、どのような理由が考えられるか述べよ。 申し訳ありませんが、よろしくお願いします。

  • 遺伝的アルゴリズムのプログラム

    はじめての投稿になります.これからよろしくお願いします. 先日、大学でGAを使って あるxの関数(例えば,f(x)=x^2-2=0のxにあてはまる解を導き出す)を解いてくるようにと課題がありました。 しかし、GAに関しては交叉や突然変異など基本的な用語を 教わったのみでプログラムが全然分かりません。 自分でも色々調べてみたのですが、全く参考になりそうなものが 見つかりませんでした。 そこで、もしご存知の方がいらっしゃるなら教えていただけないでしょうか? プログラムを組む場合にはC言語を使うことになるのですが、どなたかC言語でよろしくお願いいたします!

  • 遺伝的アルゴリズムの評価式に関する質問です。

    膨大な数の組み合わせから正解の組み合わせを求めるという大規模組み合わせ問題があったとします。 このような問題を遺伝的アルゴリズムを用いて解こうとしているのですが、今用いている評価式より良いアイデアが自分では考えつかなかったため質問します。 以下、問題や用いている遺伝的アルゴリズムに関する詳しい説明です。 例えば、仮に、23, 21, 65, 78, 43, 78, 83, 56, 78 ,89 の10個の数の組み合わせがあるとき、 合計して109になる組み合わせ(23,21,65)を見つけたいという問題です。(正解の組み合わせは複数個あっても、一個見つかれば良い。また正解の組み合わせは必ずあるものとする。) この問題を遺伝的アルゴリズム(GA)を使って解くとします。 以下、簡単なGAの説明です。 表現型に2進数ビット列を用いる。 個体数は200とし、初期個体はランダムで生成する。 評価式はf(x) = b/(b+|b-t|)(bは正解の組み合わせの合計値で、tは2進数ビット列で1を立てた場所の数の合計値である。)。終了条件はこの評価値がf(x)=1になることである。 交叉は一様交叉で突然変異も行う。 表現型について詳しく説明すると、 コード化に 0と 1の並びである2進数ビット列を用いて、 その場所に対応する数を加算する場合は1を, 逆に加算しない場合は0を遺伝子の表現型に立てビット列を生成しました。 例えば今回の正解の組み合わせ(109)を2進数ビットで表すと下のようになる。 23, 21, 65, 78, 43, 78, 83, 56, 78 ,89 1 1 1 0 0 0 0 0 0 0 ←2進数ビットを用いた表現型。 (1が立っている場所の数が加算されて合計で109となり、これが正解の組み合わせであることがわかる。) そして、この遺伝的アルゴリズムの評価式を f(x) = b/(b+|b-t|) とします。(bは正解の組み合わせの合計値で、tはビット列で1を立てた場所に対応する数の合計値である。) 評価式f(x)=1になる、つまり正解の組み合わせが見つかれば、遺伝的アルゴリズムは終了する。 この評価式で遺伝的アルゴリズムを回しているのですが、この簡単な評価式では近似解に陥ったとき、解を求めるのがどうしても遅くなってしまいます。 全体的に長く、わかりにくい説明で申し訳ないのですが、この評価式の改善案、またはこの遺伝的アルゴリズムの改善案などがあれば教えていただきたいです。 以上、よろしくお願いします。

  • 遺伝の問題です。どうしても分からないので教えてください。

    遺伝の問題です。どうしても分からないので教えてください。 キイロショウジョウバエの紫眼(a),黒体色(b),痕跡翅(c)を示す遺伝子、野生型の赤眼(A),正常体色(B),正常翅(C)を示す遺伝子はともに同一染色体上に連鎖している。Aはaに、Bはbに、Cはcに対し優性であり、雄では組み換え(交さ)は起こらない。三重劣性のホモの個体と野生型の個体を交配してF1を得た。そのF1の雌を検定交雑すると、表の結果が得られた。 (表) (ア) 赤眼・正常体色・正常翅 409 (イ) 赤眼・黒体色・正常翅 27 (ウ) 赤眼・正常体色・痕跡翅 63 (エ) 赤眼・黒体色・痕跡翅 2 (オ) 紫眼・正常体色・正常翅 2 (カ) 紫眼・黒体色・正常翅 57 (キ) 紫眼・正常体色・痕跡翅 28 (ク) 紫眼・黒体色・痕跡翅 412 計 1000 (1)F1の遺伝子型を示せ 答:AaBbCc (2)F1の雌を検定交雑するのに用いられた雄の遺伝子を示せ。 答:aabbcc (3)組み換えが起こらなかったとすれば、F2ではどの表現型がどのような比率で現れるか。表現型は(ア)~(ク)の記号で答えよ。 (3)が分からないので解説とともに答えを教えてください。 よろしくお願いします。

  • F(x)は実数を係数とするxの多項式。

    F(x)は実数を係数とするxの多項式。 すべての整数kについて、f(k)が整数であるための必要十分条件は、 f(0)が整数で、すべての整数kについてf(k)-f(k-1)が整数となる。 このとき、f(x)=ax^2+bx+cについて、すべての整数kについて、f(k)が整数 となるために、係数a,b,cがみたすべき必要十分条件をもとめよ。 次のように考えましたが、最後の詰めができません。 aとbの条件はどうなるのか、よろしく、おねがいします。 f(0)=cより、cは整数。 f(k)-f(k-1)=(2k-1)a+bより、任意のkについて(2k-1)a+bは整数。 これで、k=1のときより、a+bは整数...(1)。 k=2のときより、3a+bは整数...(2)。  (2)-(1)より、2aは整数。(1)×3-(2)より、2bは整数。 ここで、行き詰まりました。このあとどう処理すれば、a,bの条件をもとめられるか よろしくおねがいします。

  • 遺伝子アルゴリズムの2点交叉について教えてください

    下記のプログラムを改良して2点交叉にしたいのですが、遺伝子アルゴリズムもC++も初心者なので、よくわかりません。どなたかお知恵を貸してください。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include "come.h" int kousa() { unsigned int max=100; unsigned int max2=17; int a,b,c,d; int i,v,w,y,n,o,k,p,f; char kari[1][17]; w=0;//カウンタ n=0; srand((unsigned)time(NULL)); for(v=0;v<100;v++) { for(i=0;i<17;i++) { get[v][i]=next[v][i]; //next[175][17]からget[100][17]へコピーする(親) } } for(o=0;o<100;o++) { for(k=0;k<17;k++) { take[o][k]=next[v][k]; //next[175][17]からtake[100][17]へコピーする(子) } } for(d=0;d<50;d++) { a=(rand()%max); //1つ目の交叉する列を見つける b=(rand()%max); //2つ目の交叉する列を見つける c=(rand()%max2); //交叉ポイント見つける for(;c<17;c++) //1点交叉 { kari[n][c]=get[a][c]; get[a][c]=get[b][c]; get[b][c]=get[n][c]; } for(y=0;y<17;y++) { take[w][y]=get[a][y]; //get[100][17]からtake[50][17]へコピー take[w+1][y]=get[b][y]; } w=w+2; } for(p=0;p<100;p++) { for(f=0;f<17;f++) { next[nextpop][f]=take[p][f]; } nextpop++; } return 0; }

  • 遺伝子

    遺伝関係の分野がが苦手でよくわかりません。 下記の問題教えて頂けたら嬉しいです。 1モルモットの巻毛と直毛、黒毛と白毛はそれぞれ対立形質で、巻毛および黒毛が優性である。巻毛・白毛の純系の雄と直毛・黒毛の純系の雌を両親とし、F1を得た。その後、F1どうしを交雑してF2を得た。下の問いに答えよ。遺伝子記号は巻毛(A)、直毛(a)、黒毛(B)、白毛(b)とする。 またA(a)とB(b)は、別々の染色体上に存在することとする。 (1)両親およびF1の遺伝子型、F2の表現型の分離比を求めよ。 (2)下図のように交雑を行い次世代を得た。1~6の遺伝子型を求めよ。 これらの問題なのですがほんとによくわからなくて… 細かく解説も付けてくれたらありがたいです 2上の問題の(1)なんですがF2の表現型の方で答えは  [AB]:[Ab]:[aB]:[ab]=9:3:3:1となっています。  この問題では巻毛・白毛の純系の雄と直毛・黒毛の純系の雌を両親とし、F1を得ていますが  もし巻毛・黒色の純系の雄と直毛・白毛の純系の雌を両親としてF1を得た場合も  同じ答えになるのでしょうか?   長い質問に付き合っていただきありがとうございました。

  • 生物I 遺伝 伴性遺伝

    生物I 遺伝 伴性遺伝 キイロショウジョウバエの赤眼の遺伝子Wは、白眼遺伝子wに対して優性であり、 これらの遺伝子はともにX染色体にある。 いま、赤眼のメスと白眼のオスを両親として交雑したところ、 F1はすべて赤眼であった。 次の問に答えよ。 という問題文で 問1両親の雌雄の性染色体と遺伝子の組み合わせを下のA~Eから答えよ A XWXW B XWXw C XwXw D XWY E XwY  問2F1雌雄の性染色体と遺伝子の組み合わせをA~Eの中から答えよ 問3にF2では赤眼と白眼がどのような割合で生じるか、雌雄別々に答えよ。 とあるのですが問3が分かりません。 自家受精やF1どうしをかけて などどうやってF2をだすか書いていないので わからないのですが分かる方いますか? ちなみに答えは 問1雌ーA雄ーE 問2雌ーB雄ーD 問3雌ーすべて赤雄ー赤:白=1:1です

  • C言語 二分法 プログラム

    C言語での二分法の解法になやんでいます。 f(x)=X2乗-2でf(x)=0の解を2分法により求める場合のプログラムを教えて下さい。 収束条件|ak-bk|<10^-6と|f(ck+1)|<10^-6のいずれかを満足。また、解を求める過程として、k,ak,bk,|ak-bk|, ck+1, f(ck+1) (k=0,1,2,3...)も示してくれないでしょうか。よろしくお願いします。 注: a,b,cに付属するk,k+1はa,b,cの下側に付く小文字です。(a1,a2... ak, ak+1. b1 b2... bk, bk+1)

  • 遺伝子の問題について

    この問題を教えてください。 2対の対立遺伝子があり、AとB(aとb)が連鎖している。AとBがそれぞれ優性遺伝子であり、両親の遺伝子型がAABB、aabbのとき、雑種第一代(F1)同士を交雑したときの雑種第二代(F2) の表現型の分離比[AB]:[Ab]:[aB]:[ab]はどのようになるか。ただし、表現型として発現しない場合は、0とする。