遺伝的アルゴリズムで組み合わせ問題を解く評価式の改善案について

このQ&Aのポイント
  • 遺伝的アルゴリズムを用いて大規模組み合わせ問題を解く際に、現在使用している評価式が十分な効果を発揮していないため、改善案を求めています。
  • 具体的な問題として、合計が109となる組み合わせを見つける遺伝的アルゴリズムについて説明しました。
  • 現在使用している評価式では近似解に陥った場合、解を求めるのが遅くなってしまうため、改善案やアイデアを募集しています。
回答を見る
  • ベストアンサー

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

膨大な数の組み合わせから正解の組み合わせを求めるという大規模組み合わせ問題があったとします。 このような問題を遺伝的アルゴリズムを用いて解こうとしているのですが、今用いている評価式より良いアイデアが自分では考えつかなかったため質問します。 以下、問題や用いている遺伝的アルゴリズムに関する詳しい説明です。 例えば、仮に、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になる、つまり正解の組み合わせが見つかれば、遺伝的アルゴリズムは終了する。 この評価式で遺伝的アルゴリズムを回しているのですが、この簡単な評価式では近似解に陥ったとき、解を求めるのがどうしても遅くなってしまいます。 全体的に長く、わかりにくい説明で申し訳ないのですが、この評価式の改善案、またはこの遺伝的アルゴリズムの改善案などがあれば教えていただきたいです。 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.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

usamingosu
質問者

補足

mpro-gramさん 回答有難うございます。 すみません。説明するのを忘れていたのですが、 評価式で出た値をルーレット選択に利用しています。 つまり評価式f(x) = b/(b+|b-t|)の値が1(正解の組み合の値)に近いほどルーレット選択によって次世代の個体に残りやすくしています。 そして次世代の個体は、前の世代で評価値の高い個体を確率的に多く選択したものに、交叉や突然変異をして出来た個体になります。この処理を繰り返すことで答え(求める正解の組み合わせ)に近づきます。

関連するQ&A

  • 対話型遺伝的アルゴリズムについて。

    対話型遺伝的アルゴリズムについて。 現在,IGAを用いたアプリケーションを構築するための勉強をしている者です。 進化計算処理の一つ,「交叉」について2つ疑問があります。 <質問1>=============================== 例えば, 「ユーザに好きな色を評価してもらいながら最適な色(好みの色)を作り出してもらう」 「パラメータはRGB3原色の3つ」 とするとき,評価及び進化計算の過程でRGBの値が 親1 R=63 G=127 B=255 親2 R=50 G=240 B=0 の親があったとします. これを以下のように,10進数のまま交叉するというのではだめなのでしょうか。 親1 R=63 G=127 <交叉位置> B=255 親2 R=50 G=240 <交叉位置> B=0          ↓ 子1 R=63 G=127 B=0 子2 R=50 G=240 B=255 もちろんこれだと2進数化(コード化)した時とは違い,各原色はそっくりそのまま入れ換えることになります。 ただ,それでも最適解へ収束するということには変わらないと思います。 従来の2進数にコード化して行う明確な理由を教えて頂けないでしょうか。 <質問2>=============================== 上記のアルゴリズムであれば, 整数である「表現型」のままの交叉ということになるのでしょうか。 もしそうであれば,ここは従来の交叉は使えず「実数値GA」なるものを使わなければいけないのでしょうか。 ==================================== 以上2点です。 どちらか1つの回答でも結構です。 どうぞ,よろしくお願いします。

  • 遺伝的アルゴリズムのプログラミングについてですが・・・

    遺伝的アルゴリズムのプログラムの基本的な流れが↓のページ http://www.sist.ac.jp/~suganuma/kougi/other_lecture/SE/opt/GA/GA.htm に 【1.初期化 2.生物集団の評価 3.交叉 4.突然変異 5.各個体の評価 6.淘汰】と書かれてあるのですが、 f(x) = sin(3x) + 0.5sin(9x) + sin(15x + 50) [0.1]区間の最大値を求める↓のプログラム http://www.sist.ac.jp/~suganuma/cpp/3-bu/18-sho/genetic/C++/gene_f.txt  に当てはめるとどの部分がどこに当たるのでしょうか…(また、このプログラムはどこからどのように読んでいけばいいのでしょうか…)。一応コメントが書かれていますがよく分かりません><; わかる方がいらっしゃいましたらよろしくお願いしますm( _ _ )m また、遺伝的アルゴリズムのプログラミングをする際の注意点があれば教えてください。

  • 組み合わせ問題のアルゴリズム

    あらかじめ用意された整数を足して、その合計がある指定された整数と等しくなる組み合わせの数を調べるプログラムを書こうとしているのですが、苦労しています。 具体例がないと伝わりにくいかもしれないので例をあげると、 例えばあらかじめ用意された整数というのが 1・1・2・2・5・8 の4つで、 指定された整数が10である場合は、 8と2 8と1と1 5と2と2と1 という3通りの組み合わせがあるので、3を出力したいというわけです。 今まではもっと単純なアルゴリズムしか考えてこなかったので、こういった組み合わせのような問題が難しく感じられます。 こういう場合、アルゴリズムはどのようなものが考えられるでしょうか。 よろしくお願いします。

  • アルゴリズムの書き方について

    柔軟に引数を変えられる関数Fがあり、 その関数Fの引数となりえる集合A={a1,a2,a3} があるときに、 b1=F(a1) b2=F(a2) b3=F(a3) b4=F(a1,a2) b5=F(a1,a3) b6=F(a2,a3) b7=F(a1,a2,a3) という操作をして、集合B={b1,b2,b3,b4,b5,b6,b7} に各値を入力するような数式/アルゴリズムの記載方法を ご教授いただきたいです。 極力、表現する行数を少なくしたく、 イメージとしては、 B = F( Hoge-func(A)) のような記載で、上記を表現したいと思っています。 For文を使った表現でも構いません 宜しくお願い致します。

  • 遺伝子の問題

    エンドウの種子が丸(A)くて子葉が黄色(B)のものと、種子にしわ(a)があって子葉が緑色(b)のものとを両親として交雑したところ、F1はすべて「丸・黄色」であった。次の(1)~(4)に答えよ。 (1)F1の遺伝子型 (2)F1の配偶子の遺伝子の組み合わせとその割合(比) (3)F2の表現型とその分離比 (4)F2のうちホモ接合体の個数が占める割合 教えて下さい。

  • アルゴリズムについての質問です

    アルゴリズムについての質問です。 以下のようなプログラムを考えています。 プログラムの目的 ある建物で各部屋同士の机の移動を行うため、その労力を最小にする組み合わせを求める。 ※このシステムは他の人が使用することを考え、わかりやすいExcel(VBA)を使用しています。 画像に関して <図1>は「No(部屋)」の距離(数字が小さい方が労力が少ない)を表しています。 ※プログラムでこの表は出力されています <図2>のようにA群とB群があり、A群からB群に移動する(複数移動も含む)場合について考えます。 <図3>のような最小の組み合わせを探します。 正しい結果は出るのですが、1件増えるだけで何倍何十倍と時間がかかってしまいます。 多少結果は妥協して(最小に近い値)でも処理を早くしたいと思っていますが、そのアルゴリズムが思いつきません。 作成したプログラムを下記にありますので、アドバイスをお願いいたします。 作成したプログラムで処理を遅くしている原因があれば指摘もお願いします。 ---現在作成したプログラムです。(すべてのパターンを検証)----------------- Dim 重みtab As Variant Dim t01(100) As Integer '←A群が、「t01(1)」から順に入っています。 Dim t02(100) As Integer '←B群が、「t02(1)」から順に入っています。 Dim ttt(100) As Integer '←B群を並び替えた結果が入ります。 Sub 計算(移動数 As Integer) '「移動数」は「t01」「t02」の要素の数 Dim t03(100) As Integer Dim a As Integer 重みtab = Range("重み表") 'Range("重み表") は <図1>の「No」を含まないセル '仮の最小の計算-------- min = 0 For a = 1 To 移動数 min = min + 重みtab(t01(a), t02(a)) ttt(a) = a Next '---------------------- Call 再帰関数(移動数, t03, 1) 'Sheet2に出力---------- For a = 1 To 移動数 Sheets("Sheet2").Cells(a, 1) = t01(a) Sheets("Sheet2").Cells(a, 2) = t02(ttt(a)) Next '---------------------- End Sub Sub 再帰関数(移動数 As Integer, t03() As Integer, cnt1 As Integer) Dim cnt2 As Integer Dim flg As Boolean For a = 1 To 移動数 flg = True For b = 1 To cnt1 - 1 If t03(b) = a Then flg = False End If Next If flg Then t03(cnt1) = a If cnt1 < 移動数 Then cnt2 = cnt1 cnt1 = cnt1 + 1 Call 再帰関数(移動数, t03, cnt1) cnt1 = cnt2 Else Call 処理(移動数, t03) End If t03(cnt1) = 0 End If Next End Sub Sub 処理(移動数 As Integer, t03() As Integer)  ’最小であるか確認 Dim a As Integer Dim b As Integer For a = 1 To 移動数 b = b + 重みtab(t01(a), t02(t03(a))) Next If min > b Then min = b For a = 1 To 移動数 ttt(a) = t03(a) Next End If End Sub

  • アルゴリズムで

    今エクセルにて簡単なデータ処理をしているのですが、どうしても浮かばないアルゴリズムがあるので、教えて下さい。 Excel2003 VBAにおいて、 A列にアルファベットが並んでいます。 B列、C列には適当な数値が入っています。 Do~LoopにてA列の空白欄までループを回していて、その中で決めたアルファベットが来た時(例えばF)に、そこから次の指定したアルファベット(例えばS)が来るまでB列のセルの数字とC列のセルの数字を足したものをD列のセルに記入します。 決めたアルファベットには規則性はないのですが、一度使った全てのアルファベットが終わるまで来ません。 具体的に描かせてもらうと、A~LまでK~Zまでが分かれており、A~Lはランダムに順に並んでおり、次に順にK~Zまではランダムに並び。全てのアルファベットが終わったら、またらA~Lまでランダムに並び、次にK~Zまで並びます。 これが、何回も続いています。 先の例えに準じて書かせていただくと、Fが来たらそこからB列とC列の計算を始めて、Sが来たらその計算を終える。 また、次にFが来たら、B列とC列の計算を始めてSが来たらその計算を終える。 と言うものです。 これに関して、どうしてもアルゴリズムが浮かびません。 y=1 Do Until Cells(y,1).Value = "" If Cells(y,1).Value = "F" Then … End If y=y+1 Loop と考えたのですが、こうなるとFが来た時だけしか処理をしません。 ランダムに来るFからSの部分を計算するにはどうしたらよいでしょうか? お知恵を拝借させて下さい。 お願いします。

  • 生物の遺伝について

    高2生物についての質問です。 遺伝子の相互作用に詳しい方 お願いします。 ある植物において、花の色を赤色にする遺伝子A、 白色する遺伝子aが存在する。 Aとaは対立遺伝子であるが、 赤色の系統AAと白色の系統aaを交雑すると "F1はすべて桃色の形質が現れた。" また、A遺伝子が働くためにはB遺伝子が必要だということが分かっている。(Bの対立遺伝子bに対してBは優性) 問題(1) " "の中の文から、遺伝子Aのような遺伝を何と呼ぶか。 (2)赤、桃色、白色それぞらの表現型において生じる可能性のある遺伝子型をすべて示せ。 (3)白色系統のもの2つを交雑したところ、F1はすべて桃色となった。親である白色系統2つの遺伝子型、またF1の遺伝子型を答えよ。 (4)(3)で得られたF1を用いて自家受精を行った。F2の表現型とその分離比を求めよ。(ただし遺伝子A(a)、B(b)は独立の関係にある) (5)(ア)ある桃色形質のものと(イ)ある白色形質のものを交雑すると、次世代の分離比は赤色:桃色:白色=1:2:5であった。(ア)、(イ)の遺伝子型を答えよ。ただし遺伝子A(a),B(b)は独立の関係にある。 問題数が多くて大変かと思いますが よろしくお願いします(>_<)!

  • 高校で習う遺伝子の問題が分かりません

    エンドウの種子が丸(A)くて子葉が黄色(B)のものと、種子にしわ(a)があって子葉が緑色(b)のものとを両親として交雑したところ、F1はすべて「丸・黄色」であった。次の(1)~(4)に答えよ。 (1)F1の遺伝子型 (2)F1の配偶子の遺伝子の組み合わせとその割合(比) (3)F2の表現型とその分離比 (4)F2のうちホモ接合体の個数が占める割合 解説が無く、どう考えたらいいか分かりません。 テストも近いのでわかりやすく教えてください。

  • 生物 遺伝 73 <3>

    教えてくださいm(_ _)m 黄色にする遺伝子をY 白色にする遺伝子Yにたいして優性 しかしこのYのけいしつの発現を抑制する遺伝子Iがある 問 ホモ接合体の白と黄色をPとしてF1をつくりさらにF1同士のこうざつでF2をつくった F2の表現型の分離比が白たい黄色は1たい3になるPの組み合わせを遺伝子型で示せ です 詳しく丁寧にばかでもわかるように教えてくれるかた、お願いしますm(_ _)m

専門家に質問してみよう