• ベストアンサー

多変数関数の最小値を求めるプログラム

複雑な関数の最小値を求めるためのプログラムを製作しています。 4つの独立な変数からなる関数を最小にする変数を探し出したいのですが、 効率の良いプログラムがなかなか作れません。 これまで試してみたのは、まずある適当な変数の組み合わせを任意に決め、 それを基準にそこから変数を少しだけずらしたとき、 関数の値が元よりも小さくなったら、ずらした変数を新たな基準として より小さな関数値になる変数を探していく…… というものですが、どうも関数が複雑な曲線を描いているらしく、 極値を数多く持っているようで、この手法ではすぐ極値につかまってしまい、 最小値にたどりつけません。 結局、変数の取りうる組み合わせを全てしらみつぶしに調べる方法にしたのですが、 充分な精度をもたせるためには膨大な計算量が必要となってしまいまったく実用的でありません。 このような多変数関数の最小値を求めるために有効なアルゴリズムはありませんでしょうか?

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

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

最適化問題と呼ばれる話です。 最小化(または最大化)したい関数を「目的関数」といい、 目的関数の変数に対する拘束条件を表した式を「制約条件式」といいます。 目的関数、制約条件の性質によって解法が異なります。 典型的なものでは、 (a) 目的関数が線形で制約条件式も線形(これを線形計画問題といいます)なら「シンプレックス法」 http://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E8%A8%88%E7%94%BB%E6%B3%95 (b) 目的関数も制約条件式も非線形なら(これを非線形計画問題といいます)「ニュートン法」、「共役勾配法」など。 (c) 制約条件が離散値をとるなら(これを整数計画問題や組み合わせ最適化問題といいます)・・・解法がいろいろありすぎるほどあります(汗) 基本的な考え方はどれも同じで、 > まずある適当な変数の組み合わせを任意に決め、 > それを基準にそこから変数を少しだけずらしたとき、 > 関数の値が元よりも小さくなったら、ずらした変数を新たな基準として > より小さな関数値になる変数を探していく…… を数学的にちゃんとやってるだけのこと。 で、近年は計算機の力を使ってガラガラポンで答えを出してしまおうと言う手法がもてはやされて、 (d) 探索空間の中からランダムに変数の値をとって来て近似最適解を求めようとするモンテカルロ法や、 (e) 局所解に陥ったら乱数で適度に変数の値を微小に揺らして局所解から脱出する機会をあたえるシミュレーテッド・アニーリング法 (f) 変数の値の組み合わせ方を遺伝子の塩基配列に見立てて、ランダムに交差を行い、優秀な遺伝子(より最適解に近いもの)をのこすジェネティックアルゴリズム などの方法で組み合わせ問題をといてしまおうという考え方があります。 いずれにしても、問題の性質によって使うべき手法が決まります。(b)~(f)は必ず最適解が求まると言う保証がないのでお気をつけください。 力技でよければ、解空間を全探索すれば必ず最適解が求まりますが、これは現実的じゃないですからお勧めしません。

noname#23400
質問者

お礼

遅くなりましたがお礼申し上げます。 回答ありがとうございました。 モンテカルロ法は知っていましたが、なるほど、ランダムに計算するというのは 実はそれなりに効率の良い方法なんですね。 解空間の全探索は試したことがあるんですが、 一つの解を求めるのに数十時間かかってしまいました。 ある意味で信頼性は一番高いのですが、やっぱり現実的じゃないですね。

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

その他の回答 (3)

  • chirubou
  • ベストアンサー率37% (189/502)
回答No.4

このような場合、必ず最小値が求まるというアルゴリズムは見つかっていません。 GA(遺伝的アルゴリズム)とか「焼き鈍し(SA)法」とかありますが、これらは、単純な勾配法(質問者さんが試された方法よりもう少し高速な方法、基本は同じ)よりも極地にとらわれない(可能性がある)というだけで、最小値が必ず求まる方法ではありません。ただ、運がよければ見つかるかもしれない、というだけです。 救いは変数が4つ程度ということです。新たに GA や SA を勉強するのが面倒であれば、質問者さんのアルゴリズムで、初期値を複数にしてその結果の中から最小値を選ぶ、というのでもいいような気もします。ただ、変数の数がもっと多くなると探索空間が広くなるので、この方法では難しいでしょう。

noname#23400
質問者

お礼

遅くなりましたがお礼申し上げます。 回答ありがとうございました。 必勝のアルゴリズムはまだ発明されていないのですね。 なんだか意外な感じがします。 初期値を複数にして、というのは試してみたのですが、 どうも、求まる解は初期値に大きく依存しているようで、 充分な精度を達成するには結構な数の初期値を試す必要があって、 結局、全探索と同じようなことになってしまいました。 どんな解空間になっているのか、一度目で見てみたいものです。

noname#23400
質問者

補足

みなさん、情報ありがとうございます。 一通り、紹介していただいたアルゴリズムを調べて、 挑戦してみたいと思います。 取り急ぎご連絡まで。

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

その関数が連続関数で、かつとりうる変数の範囲に制約がない(-∞から∞までとれる)なら、 Differential Evolution (DE) というアルゴリズムがいいと思います。 遺伝的アルゴリズムの一種ですが、計算量の割にはかなり強力です。

noname#23400
質問者

お礼

遅くなりましたがお礼申し上げます。 回答ありがとうございました。 Differential Evolution, 日本語で言うと差分発展とか微分展開とかでしょうか? ちょっと検索して見つけたのが以下のサイトです。 http://www.icsi.berkeley.edu/~storn/code.html 今回、自分が考えていたものは、変数が有限の範囲の制約をもっていたので、 これについては詳しく調べませんでした。 せっかく教えてくださったのに、すみません。

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

遺伝的アルゴリズム(Genetic Algorithm)とかですと、こういった「だまし問題」に対しても、それなりの計算時間で、それなりの性能を発揮します。 アルゴリズム入門 : 第 5 章 知識情報処理入門 http://www.microsoft.com/japan/msdn/academic/Articles/Algorithm/05/

noname#23400
質問者

お礼

遅くなりましたが、お礼申し上げます。 回答ありがとうございました。 なるほど、遺伝的アルゴリズムというものがあるんですね。 自分はC言語をやっていますので、以下のサイトが参考になりました。 http://www6.plala.or.jp/mnagaku/cmag/ac19999/

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

関連するQ&A

  • 多変数関数の最大/最小問題の一般的解法

    多変数関数、例えば f(x,y,z) の最大値/最小値を求めるときに ∂f/∂x=0 ∂f/∂y=0 ∂f/∂z=0 の連立方程式を解く方法が、講義ではよくでてきますが 導関数が =0 であっても、極値をとるかどうかはわからないし 極値をとったとしても極大か極小かはわからないと思うのですが… こういう解法がとられる場合には、暗黙の了解として 明らかに極大(極小)となることを前提としているのでしょうか? もしそうなら、それは容易に判断できることなのでしょうか?

  • 2次関数の最小値をC言語とGAを用いて求めたいです

    私は機会系の大学生のものです。 今回は 2次関数の最小値をプログラムのC言語と遺伝的アルゴリズム(GA)を用いて求めたいのですが 私がC言語が素人のためプログラムを作れません...。例として教えていただけると幸いです。 よろしくお願い致します。

  • 最小二乗法について

    最小二乗法では二乗和の誤差 Σ[i=1~n]{Yi-(α+βXi )}^2 (iは添え字です) を最小化するα,βを推定することを考えますが、 これは単純にα,βで偏微分してそれを0とおいて 連立方程式を解くだけでよいのですか? といいますのも、2変数関数の極値を求める場合、 Hessianを計算して判別しますよね? ただ一階偏導関数が0になるからといって、 そこで極値をとるとは限らない気がしたので… それとも最小二乗法の場合は必ずとるようになっているのでしょうか? 手元の本には、 「この二乗和は非負値なので、αとβで偏微分したものを0とするα,βが上式を最小にする値である」 とあるのですが、一般に非負値だとこの ようなことが言えるのでしょうか?

  • 大学数学の最大値・最小値の問題です

    大学数学の極値の問題です。 関数f(x,y)=x^2+xy+y^2のD={(x,y) ∈ R^2 | x^2+y^2≤1}における最大値、最小値を求めよ。 という問題です。 ヒントとして「円の内部における極致(2変数関数の極値)と円周上での極値 (条件付き極値)を調べよ。)というのが与えられています。

  • プログラムの手法について

    プログラム初心者です。同僚の書いたVBAのプログラムを勉強のために見ていました。彼のプログラムは X=-1 関数1 ・・・・・関数の処理 X=1 関数1終 もしX=1じゃなければエラー処理へ。 もしX=1ならばプログラムは続く。 といった内容です。 関数直前で変数に値を持たして、関数脱出後にその変数が変わっていなければエラー処理へといった手法はよく使われるんでしょうか?自分はそんな処理の仕方をおもったことすらなかったので、そんな手法があるんだ。それって一般的なのかな?と思って質問させて頂きました。お願いいたします。

  • 確率変数の関数について

    確率初心者です。どうかご回答お願い致します。 異なる分布を持つ複数の確率変数が、互いに独立しているとき、 それらを使った関数の分布曲線をエクセルで数値的に求めたいです。 例えば下記のような感じです。 変数例 X:N(10,0.25) Y:N(15,0.25) Z:U(10,12) …正規分布or 一様分布 関数例 X+(Y^2+Z^2)^0.5、 X+Y*ATAN(Z) など…四則演算・べき乗・三角関数を含む   誤差伝播式を使えば、関数のσ、最大、最小値は求められることは分かったのですが、 どのような分布になっているかがわかりません。 モンテカルロ法では計算に時間がかかるため、他の方法があれば どなたかご教授お願い致します。

  • 最小公倍数をPHPで求めるには

    PHPで最小公倍数を求めるプログラムを作りたいのですが、 アルゴリズムをお教えください。 尚、PHPを実行するレンタルサーバーの関係で gmp関数群は使えません。

    • ベストアンサー
    • PHP
  • 高校数学において、関数f(x)があって、その最大値

    高校数学において、関数f(x)があって、その最大値や最小値を求めたい時の手法として ・微分して増減をしらべる ・変数が正ならば(または変数が正となるように置き直して)相加相乗 ・変数が整数ならば、差の符号を調べる、または商と1との大小を調べる などの手法が挙げられますが、他にどのようなものが思い浮かびますか? 他に思いついたものをお教えください、お願いします……

  • 不均一分散の回帰分析に適した変数変換とは?

    不均一分散する変数について回帰分析をする場合、加重最小2乗法や変数変換等があるという情報をウエブで見つけました。 手持ちのデータ(独立変数が大きくなるほど、残差のばらつきが大きくなっているデータ)で試しに従属変数の対数変換をして回帰したら、確かに元の結果よりかなり鮮明な傾向が認められ、また分散もほぼ一定となっている様に見受けられたのですが、その様になる理由は、簡単にイメージ的に説明すると何なのでしょうか。 また上記の様に“綺麗な結果”になる場合、そのまま対数変換の手法を採用して回帰してしまって差し支えないでしょうか。似た様な曲線形をとる関数に平方根(y=√x)等もあると思うので、ひょっとしたら「平方根変換」等も選択肢としてはあり得るとも思うのですが…何故対数変換なのでしょうか。 やはり実際に使う以上、直感的イメージだけでもその手法の仕組みを理解したいので、ご教示頂けると非常に助かります。

  • 関数表示がわかりません。

    経済学ではしばしばf(L,K)などとカッコを使用し、関数を表現しますが、基準がハッキリせずよく理解できておりません。外生変数、内生変数などは関係あるのでしょうか? 高校の教科書には「(y、xの式であれば)xが決まった時にyが唯一に決定されるものを関数」などと書いてあった気がいたしますがこの場合も同様でしょうか? 詳しくお答えできる方、申し訳御座いませんが、お教えください。 例を出すなら先日費用最小化問題で、友人が Q=bar(Q) min(rK+wL) を解いて費用最小化したコストは C_{min(Q,r,w)} だね。と即座に答えてましたが なぜそうなるのか分かりません。 L,Kはなぜ違うのでしょうか?r,wは外生変数ですよね?よく分かりません。 よろしくお願いいたします。