- ベストアンサー
実践的な遺伝子的アルゴリズムの作成法
- 実践的な遺伝子的アルゴリズムの作成法について解説します。
- 遺伝子的アルゴリズムの最適化の対象のコーディングや交叉点の設定において、問題が発生することがあります。
- 遺伝子的アルゴリズムを学ぶための実例や学習機関、プログラミング言語の選択についても考える必要があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
実は私も素人ですが・・・・ >1)最適化の対象を如何にコーディングするか? >2)交叉点を如何に設けるか? いわゆるモデリング(コーディング)手法ですね。 ここは、誰もが必ずぶつかるところだと思います。 もっとも根本的なことでありながら、きちんと(論理的に)説明されている書籍・論文、あるいは、きちんと整理できている人・技術者・学者先生に、お目にかかったことがありません。 ある大学教授にいたっては、堂々と「GAのコーディングは、カンと経験」と明言しておられます。 #私の考えでは決してそれに賛成していませんが・・・私自身、整理して説明ができるわけではないので、表立って反論はできません。 #ただ、「根本的にできないこと」ではなく、「まだ、やり方が整っていない」だけだと思っています。 前置きはこれくらいにして・・・ >1)・・(略)・・・以外に、実例を調べる手段? コーディングに関しては、3~4年前のシステム制御関係の学会誌、あるいは、Cマガジンはじめ、ちょいと硬派なプログラマ向け雑誌などで解説を見つけることができます。 巡回セールスマンとか、パズルに関しては、おっしゃるような「技術系書籍」がいいと思います。 (確か、北先生のがわかりやすかったと思います) ただ、「実例」となると、企業での利用が多いでしょうから、具体的内容を詳しく知るのは難しいかも・・・・ また、逆に、「あ~、これとこれで、こうやっているのね」と容易に推定できるものもあります。 たとえば、離散系シミュレータの「Witness」というソフトの求解に使われていますが、カタログに出ている画面イメージからでもおよそのコーディングと組み込まれ方が想像つきます。 ただ、「こうなんですね」と聞いても、正確に答えてくれる人はいないようです。 >2)社会人が・・・(略)・・・・学べる場所? おそらくお仕事で利用しようとされているかと思いますので、学求的に高度な(実践的でないような)ことではないですね。 数年前から比べるとずいぶん聞かなくなったような気がします。(いい意味で定着したのか、絶滅したのか) あまり、詳しくないので推測ですが、大阪の場合、産業技術研究所でかなり以前やっていたと思います。 公的機関なので、無料で開催されたりするようですし、関係の学会などで、先生とお友達になって、(個人的に)講義に混ぜてもらうという手もあるかもしれません。 >3)・・・・・C++などの汎用プログラム言語と、SchemaやLISPなどの知能プログラミング言語とでは、どちらが便利なのでしょうか? > これらの人工知能プログラム言語には、コーディングや交叉のための専用のコマンドが提供されているのでしょうか? 私としては、遺伝アルゴリズム自体を研究するのでなく、利用する立場でしたので、C言語がよいと思います。 Schemaは知りませんし、LISPもここ10年くらい遠ざかってます。 処理系の入手性の問題、参考書・解説書(時にはサンプルプログラム)の多さからして、C、C++、VB、Javaでしょう。 また、LISPには、専用コマンドというわけではありませんが、遺伝子をインプリメントしやすい線形リストが言語仕様のベースですし、リストをあれこれいじりまわす命令は充実していますので、その部分に限っては便利と思います。 #リストがベースだから”LISP”、ってのはご存知のとおり。 が、しか~し、Cでもリスト構造は比較的簡単に実現できますし、特に遺伝子を配列で表現してもいいわけなので、その点はそんなに重要ではありません。 実践で利用するなら、入出力やコンパイラ自体の扱いやすさ、入手性、メンテ性、周辺システムとのインターフェースで、通常のプログラム言語のほうが、(あなた自身が使い慣れているもののほうが)格段に勝ります。LISPなどには、ガベジコレクションやメモリ消費などの問題もありますね。 >これらは組合せの対象の要素間に何らかの曖昧な複数の相関関係がある場合に難しくなります。 冒頭に書いたとおり、私は素人ですが、遺伝子コーディングするときは、「曖昧な複数の相関関係」など悩まずに、素直に(何も考えずに)やって、進化過程で、制約として淘汰して殺すという方法でも、まずまず準最適結果(らしきもの)が得られています。 ↑こんな考え方は、アルゴリズムをギンギンにチューニングして、限界最適値を超高速で求めようという場合には、ダメなんでしょうが、結果を程よく収束できればいいや、くらいでは、十分です。 実際の問題をインプリメントすると、ほんの数100行になったりします。そのプログラムがそれらしい結果を出してくれると、なんか神がかりのような気分を味わえます。 「なんで、これで解が出るんだ~!!」って感じ。 がんばってくださひ。 では・・
お礼
悩んでいることに対して、的確にアドバイスしていただき有難う御座います。書店での情報収集やネットサーフィンでは指針が立てられず、何方かのアドバイスをお待ちしておりました。 自分は電子系のエンジニアで、技術の空洞化の時勢に逆らって、何とか欧米の技術力に追従しようと、ある分野の最適化設計に努力してきましたが、先日、欧米製の遺伝子的アルゴリズムを使用した商品を紹介され、技術力向上の限界を感じました。下手をすると、日々の設計の試行錯誤の過程を、遺伝子的アルゴリズムに取って代わられてしまうようにも思いました。 このお返事の中は、プログラム開発の実情がみえたように思います。普段使いなれているC言語を使って、あまり神経質にならずにコーディングしても結果が出るという力強いアドバイスもありましたし、チャレンジしてみたいと思います。これをやらないと、自分の会社の技術の空洞化が決定的なものになってしまいます。 それにしても、良い最適化設計の特徴(良い遺伝子配列の特徴)を見つけるのっ難しそうですね! 本日いただいたお返事は、一字一句大切にしたいと思います。有難う御座いました。