遺伝的アルゴリズムを使って関数の最大値を解くプログラミングについて

このQ&Aのポイント
  • 遺伝的アルゴリズム(GA)を使って関数の最大値を解く方法について説明します。
  • 乱数の初期値である12345について、プログラム内でどのように扱われるか分かりません。
  • また、巡回セールスマン問題についても説明します。
回答を見る
  • ベストアンサー

関数の最大値を遺伝的アルゴリズム(GA)を使って解くプログラミングについてですが

http://www.sist.ac.jp/~suganuma/cpp/3-bu/18-sho/18-sho.htm#e-18-10 こちらのページの真ん中やや下あたりで巡回セールスマン問題や関数の最大値を遺伝的アルゴリズムを使って求めるプログラミングが紹介されていますが、ここに乱数の初期値12345というのがあります。 この12345というものがプログラムの中でどこでどのように扱われているかがわかりません。乱数の初期値がseedで表されているのは分かるのですが… 詳しい方教えてください。お願いします。 関数の最大値を求めるプログラムhttp://www.sist.ac.jp/~suganuma/cpp/3-bu/18-sho/genetic/C++/gene_f.txt ( ケーススタディデータというところに書かれてある 12345 data\species.10 data\data10.tsp 123 data\species.10 data\data10.tsp 1 data\species.10 data\data10.tsp の12345 123 1の部分が乱数の初期値でこれがseedとなっているのは分かるのですがこの数値が適応度などにどう関係してくるのか分かりません>< ) 巡回セールスマン問題 http://www.sist.ac.jp/~suganuma/cpp/3-bu/18-sho/genetic/C++/gene.txt

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

  • ベストアンサー
回答No.1

コンピュータで乱数を発生させる場合、void srand(unsigned seed); をコールしないと本当の乱数を出力してくれません。 ここらへんに誤解があるのかな? 実際seedは現在時刻から求める場合が多いですが、デバッグ時には同じ乱数で動かしたいので、seedを固定にする仕掛けをプログラムに残すことが多いです。 見当違いの回答だったらごめんなさい。

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/srand.html

関連するQ&A

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

    遺伝的アルゴリズムのプログラムの基本的な流れが↓のページ 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 また、遺伝的アルゴリズムのプログラミングをする際の注意点があれば教えてください。

  • 台形則のプログラミング

    http://www.sist.ac.jp/~suganuma/cpp/2-bu/7-sho/C++/daikei.txt このサイトのプログラミングを参考にして、いろいろいじっているのですが、分割数、積分範囲の指定、積分する関数の変更 がよくわかりません。 具体的には、 分割数、範囲は改めて数を宣言するのか?それともこのプログラミングにある、x1、x2などにそのまま代入するのか? 関数は真ん中にあるreturn ~の部分だけ変更すればいいのか? ということがわかりません。 回答、アドバイス等ありましたらお願いします!

  • GA(遺伝的アルゴリズム)を教えてください!

    はじめまして。 先日、大学でGA(遺伝的アルゴリズム)を使って 簡単な掛け算の(例えば、3×○=12で○の中に当てはまる 数字を導き出す)問題を解いてくるようにと課題がありました。 しかし、GAに関しては基本的な用語(交叉や突然変異など)を 教わったのみでプログラムが全然分かりません。 自分でも色々調べてみたのですが、全く参考になりそうなものが 見つかりませんでした。 そこで、もしご存知の方がいらっしゃるなら教えていただけないでしょうか? プログラムを組む場合にはC言語(C自体も使ったことがありません・・・。) を使うことになるのですが、できればMATLABを使いたいと思っています。 もちろんC言語でも構いませんので、よろしくお願いします!

  • GA(遺伝アルゴリズム)について

    評価関数の係数の決定(変数とは違います)にGAを使いたいんですが、どのような種類の交叉オペレータを用いたらいいのですか? GA初心者なんですがよろしくおねがいします。

  • 遺伝的アルゴリズム(GA)について

    今(独学)C言語でGAの手法を勉強しています。まずはじめに、y=3x^3+2x^2+5x という関数で最小値探索を行うプログラムを作成しようとしているのですが、一点交叉など難しくて書けません。いろいろ図書館などへ行って調べているのですが、参考になるサンプルプログラムが無く、どうしたらよいのか解らないので教えてください。よろしくお願いします。

  • 配列 x に入っているデータの最大値、最小値を求めるサブルーチンとそのヒストグラムの作り方

    配列 x に入っているデータの最大値、最小値を求めるサブルーチン maxmin(x,n,xmax,xmin) を作り方を教えてください。 n はデータ数。 最大値、最小値はそれぞれ xmin, xmax に代入する。 次に、そのサブルーチンを用い、x に入っているデータのヒストグラムを作成するプログラムを作り方も教えてください。 (途中までしか分かりません) implicit real*8(a-h,o-z) real*8 x(10000) integer count(100) ndiv = 40 分割数は 40 にする n = 10000 データ数は 10000 dummy = rand(13) 乱数の初期化 do 10 i=1, n sum = 0.0d0 do 20 j=1,5 sum = sum + rand(0) 5個の乱数の和 20 continue x(i) = sum 10 continue call maxmin(x,n,xmax,xmin) 最大・最小値を求める dx = (xmax - xmin)/ndiv 分割幅 !!count をゼロで初期化する do ループを追加!!(よく分かりません) !!ヒストグラムを作成する do ループを追加!!(よく分かりません) do 100 k=1, ndiv write(6,*) xmin+(k-0.5d0)*dx, count(k) データの中心値と個数を出力 100 continue stop end subroutine maxmin(x,n,xmax,xmin) implicit real*8(a-h,o-z) real*8 x(*) !!この部分を作成してサブルーチンの完成のさせ方が分かりません!! return end ところどころが分かりません。 とても困っていますし、急いでいます。 だれか教えてください。 よろしくお願いします。

  • 遺伝的アルゴリズムの遺伝的って?

    ふと疑問。 遺伝的アルゴリズムの遺伝的ってどういう意味でしょうか? 遺伝と言うと継承されていくような感じがします。 ふとした疑問なので大雑把で結構です。 よろしくお願いします。

  • 遺伝的アルゴリズムの遺伝子の長さについて

    今、グラフ理論と遺伝的アルゴリズム(以下GA)の勉強をしています。 グラフ理論の最小全域木問題をGAを使って解こうと考えています。そこで、個体の遺伝子の長さをそのグラフの点の数Nにすればよいのではないかと考えました。 しかし、グラフが大きく、点の数Nが100や1000になった場合は、遺伝子の長さも非常に長くなってしまいます。これはGAとして問題があるかないかについて教えてください。 よろしくお願いします。

  • 遺伝的アルゴリズム

    遺伝的アルゴリズムの利点と欠点を教えて下さい。初心者なので出来るだけ詳しくお願いします。

  • 遺伝的アルゴリズム

    遺伝的アルゴリズムのプログラムを作っているのですがサンプルソースの下の関数のやってこるこがよく意味がわかりません。よかったら解説 お願いします。 // 一点交叉 void one_point_crossover(struct genotype *ind) { int i, ia, ib; // 個体インデックス int j; // 遺伝子座インデックス int c; // 交叉点 int test[M]; // 個体の利用フラグ int temp[N]; // 遺伝子を入れ替えるための仮変数 // 4/24修正 int r; // 乱数値 for(i=0; i<M; i++) test[i] = 0; ia = ib = 0; for(i=0; i<M/2; i++) { // 個体をランダムにペアリング for(; test[ia]==1; ia=(ia+1)%M); test[ia] = 1; r = random() % (M-2*i) + 1; while(r>0) { ib=(ib+1)%M; for(; test[ib]==1; ib=(ib+1)%M); r--; } test[ib] = 1; // 個体iaとibを交叉 if(flip(Pc)) { c = random() % N; for(j=0; j<c; j++) { temp[j] = ind[ia].gene[j]; ind[ia].gene[j] = ind[ib].gene[j]; ind[ib].gene[j] = temp[j]; } } } } // End of one_point_crossover()