WOLFRAM言語チュートリアル

大域的非線形数値最適化の例

複数の最適解を求める,メソッド1

これは複数の極小値を求めるひとつの方法である.異なる乱数の種でNMinimizeを複数回呼び出す.これにより異なる最適化のパスが取られる.

これで,一連の極小値を用いて関数を定義する.
In[1]:=
Click for copyable input
Out[2]=
異なる乱数の種を使うことで解の表を作成する.
In[3]:=
Click for copyable input
Out[3]=
次に解を点に変換し,関数の等高線プロット上にプロットする.
In[4]:=
Click for copyable input
Out[7]=

複数の最適解を求める,メソッド2

次は複数の極小値の別の求め方である.まず通過するすべての点のリストを作るように目的関数を書き,次に最終的な解に近い目的関数の値を持つ点を選ぶ.

以下で一連の極小値を持つ関数を定義する.
In[18]:=
Click for copyable input
Out[20]=
ReapNMinimizeの解とEvaluationMonitorで播かれた点を返す.
In[21]:=
Click for copyable input
Out[22]=
次は最終的な解に近い目的関数の値のすべての点である.これらを白く,最終解を黒くし,関数の等高線上にプロットする.
In[23]:=
Click for copyable input
Out[27]=

データの非線形フィットを求める

次は5つの乱数パラメータに基づくモデルを定義する.
In[28]:=
Click for copyable input
Out[30]=
ここで,このモデルとパラメータから関数を作成し,区間 におけるサンプル点を生成する.
In[31]:=
Click for copyable input
次にこの点とFindFitによる解をプロットする.三角関数であるため,解は極小値により捕えられる.
In[35]:=
Click for copyable input
Out[37]=
以下でデータから平方和を生成し,NMinimizeを使って最小値を求める.
In[38]:=
Click for copyable input
Out[39]=
その点とNMinimizeの解をプロットしたものである.
In[40]:=
Click for copyable input
Out[41]=

Solveの例

この連立方程式は非常に非代数的なので,Solveは使えない.
In[44]:=
Click for copyable input
Out[44]=
NMinimizeに一定の目的関数と,制約条件として解かれる方程式を与える.これで解が見付かる.
In[43]:=
Click for copyable input
Out[43]=

チェス盤上のクィーン

In[46]:=
Click for copyable input
を攻撃している場合にのみTrueとなる.
In[47]:=
Click for copyable input
countAttacks[vec]は実数のベクトルをクイーンの置換に変換し,攻撃回数を数える.
In[48]:=
Click for copyable input
次の式は,置換されると配置を示す.
In[49]:=
Click for copyable input
次ではどのクイーンも他のクイーンを攻撃しないようにチェス盤上の全クイーンに適用するようにDifferentialEvolutionを用いる.離散問題の性質上後処理は役に立つとは思えないので行わないようにしておく.
In[50]:=
Click for copyable input
Out[52]=
次が解である.
In[53]:=
Click for copyable input
Out[53]=