Pla*_*iac 9 numerical wolfram-mathematica mathematical-optimization
我对Mathematica的全局优化能力有疑问.我偶然发现了与NAG工具箱相关的文本(白皮书).
现在我试图从论文中解决测试用例.正如预期的那样,Mathematica解决它的速度非常快.
n=2;
fun[x_,y_]:=10 n+(x-2)^2-10Cos[2 Pi(x-2)]+(y-2)^2-10 Cos[2 Pi(y-2)];
NMinimize[{fun[x,y],-5<= x<= 5&&-5<= y<= 5},{x,y},Method->{"RandomSearch","SearchPoints"->13}]//AbsoluteTiming
Run Code Online (Sandbox Code Playgroud)
输出是
{0.0470026,{0.,{x->2.,y->2.}}}
Run Code Online (Sandbox Code Playgroud)
可以看到优化例程访问的点.
{sol, pts}=Reap[NMinimize[{fun[x,y],-5<= x<= 5&&-5<= y<= 5},{x,y},Method->`{"RandomSearch","SearchPoints"->13},EvaluationMonitor:>Sow[{x,y}]]];Show[ContourPlot[fun[x,y],{x,-5.5,5.5},{y,-5.5,5.5},ColorFunction->"TemperatureMap",Contours->Function[{min,max},Range[min,max,5]],ContourLines->True,PlotRange-> All],ListPlot[pts,Frame-> True,Axes-> False,PlotRange-> All,PlotStyle-> Directive[Red,Opacity[.5],PointSize[Large]]],Graphics[Map[{Black,Opacity[.7],Arrowheads[.026],Arrow[#]}&,Partition[pts//First,2,1]],PlotRange-> {{-5.5,5.5},{-5.5,5.5}}]]`
Run Code Online (Sandbox Code Playgroud)

现在我想到在更高维度上解决同样的问题.对于五个变量的问题,即使允许大量搜索点,mathematica也开始陷入局部最小陷阱.
n=5;funList[x_?ListQ]:=Block[{i,symval,rule},
i=Table[ToExpression["x$"<>ToString[j]],{j,1,n}];symval=10 n+Sum[(i[[k]]-2)^2-10Cos[2Pi(i[[k]]-2)],{k,1,n}];rule=MapThread[(#1-> #2)&,{i,x}];symval/.rule]val=Table[RandomReal[{-5,5}],{i,1,n}];vars=Table[ToExpression["x$"<>ToString[j]],{j,1,n}];cons=Table[-5<=ToExpression["x$"<>ToString[j]]<= 5,{j,1,n}]/.List-> And;NMinimize[{funList[vars],cons},vars,Method->{"RandomSearch","SearchPoints"->4013}]//AbsoluteTiming
Run Code Online (Sandbox Code Playgroud)
输出不是我们想要看到的.在我的core2duo机器上花了49秒,仍然是当地的最低限度.
{48.5157750,{1.98992,{x$1->2.,x$2->2.,x$3->2.,x$4->2.99496,x$5->1.00504}}}
Run Code Online (Sandbox Code Playgroud)
然后尝试了SimulatedAnealing 100000次迭代.
NMinimize[{funList[vars],cons},vars,Method->"SimulatedAnnealing",MaxIterations->100000]//AbsoluteTiming
Run Code Online (Sandbox Code Playgroud)
产量仍然不合适.
{111.0733530,{0.994959,{x$1->2.,x$2->2.99496,x$3->2.,x$4->2.,x$5->2.}}}
Run Code Online (Sandbox Code Playgroud)
现在,Mathematica有一个名为Minimize的精确优化算法.正如预期的那样,必须在实用性方面失败,但随着问题规模的增加,它会很快失败.
n=3;funList[x_?ListQ]:=Block[{i,symval,rule},i=Table[ToExpression["x$"<>ToString[j]],{j,1,n}];symval=10 n+Sum[(i[[k]]-2)^2-10Cos[2 Pi(i[[k]]-2)],{k,1,n}];rule=MapThread[(#1-> #2)&,{i,x}];symval/.rule]val=Table[RandomReal[{-5,5}],{i,1,n}];vars=Table[ToExpression["x$"<>ToString[j]],{j,1,n}];cons=Table[-5<=ToExpression["x$"<>ToString[j]]<= 5,{j,1,n}]/.List-> And;Minimize[{funList[vars],cons},vars]//AbsoluteTiming
Run Code Online (Sandbox Code Playgroud)
输出完全没问题.
{5.3593065,{0,{x$1->2,x$2->2,x$3->2}}}
Run Code Online (Sandbox Code Playgroud)
但是如果用n = 4进一步改变问题大小,你会看到结果.解决方案在我的笔记本中不会出现很长时间.
现在问题很简单,这里的任何人都认为有一种方法可以在Mathematica中有效地数值解决这个问题以获得更高维度的案例吗?让我们分享我们的想法和经验.但是应该记住,它是一个基准的非线性全局优化问题.大多数数字根寻找/最小化算法通常搜索局部最小值.
BR
P
增加初始点可以让我达到全局最小值:
n = 5;
funList[x_?ListQ] := Total[10 + (x - 2)^2 - 10 Cos[2 Pi (x - 2)]]
val = Table[RandomReal[{-5, 5}], {i, 1, n}];
vars = Array[Symbol["x$" <> ToString[#]] &, n];
cons = Apply[And, Thread[-5 <= vars <= 5]];
Run Code Online (Sandbox Code Playgroud)
这些是电话。虽然计时可能不太有效,但对于随机算法,必须有足够的初始样本,或者对函数有良好的感觉。
In[27]:= NMinimize[{funList[vars], cons}, vars,
Method -> {"DifferentialEvolution",
"SearchPoints" -> 5^5}] // AbsoluteTiming
Out[27]= {177.7857768, {0., {x$1 -> 2., x$2 -> 2., x$3 -> 2.,
x$4 -> 2., x$5 -> 2.}}}
In[29]:= NMinimize[{funList[vars], cons}, vars,
Method -> {"RandomSearch", "SearchPoints" -> 7^5}] // AbsoluteTiming
Out[29]= {609.3419281, {0., {x$1 -> 2., x$2 -> 2., x$3 -> 2.,
x$4 -> 2., x$5 -> 2.}}}
Run Code Online (Sandbox Code Playgroud)