Ограничение модуля оптимизации Mathematica - PullRequest
9 голосов
/ 08 июля 2011

У меня вопрос по поводу возможности глобальной оптимизации 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

Вывод был

{0.0470026,{0.,{x->2.,y->2.}}}

Можно увидеть точки, посещенные процедурой оптимизации.

{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}}]]`

Convergence path of NMinimize

Теперь я подумал о решении той же проблемы в более высоком измерении.Для задач из пяти переменных 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

Вывод был не тем, что мы хотели бы видеть.Это заняло 49 секунд на моей машине core2duo, и все же это локальный минимум.

{48.5157750,{1.98992,{x$1->2.,x$2->2.,x$3->2.,x$4->2.99496,x$5->1.00504}}}

Затем попытался SimulatedAnealing с 100000 итераций.

NMinimize[{funList[vars],cons},vars,Method->"SimulatedAnnealing",MaxIterations->100000]//AbsoluteTiming

Вывод все еще не был приемлемым.

{111.0733530,{0.994959,{x$1->2.,x$2->2.99496,x$3->2.,x$4->2.,x$5->2.}}}

Теперь у 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

Вывод совершенно в порядке.

{5.3593065,{0,{x$1->2,x$2->2,x$3->2}}}

Но если изменить размер проблемы, то одиншаг вперед с n = 4, вы увидите результат.Решение долго не появлялось в моей записной книжке.

Теперь простой вопрос: кто-нибудь здесь думает, есть ли способ численно эффективно решить эту проблему в Mathematica для случаев с большими измерениями?Давайте поделимся нашими идеями и опытом.Однако следует помнить, что это эталонная нелинейная задача глобальной оптимизации.Большинство числовых алгоритмов поиска / минимизации корней обычно выполняет поиск локального минимума.

BR

P

Ответы [ 2 ]

4 голосов
/ 08 июля 2011

Увеличение начальных баллов позволяет мне достичь глобального минимума:

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]];

Это звонки.Время может быть не слишком эффективным, но при использовании рандомизированных алгоритмов необходимо иметь достаточно начальных выборок или хорошее представление о функции.

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.}}}
2 голосов
/ 08 июля 2011

Вы видели эту страницу документации? В нем рассматриваются методы, поддерживаемые NMinimize, с примерами для каждого. Одним из примеров SimulatedAnnealing является функция Растгрина (или очень похожая), и в документах указывается, что вам нужно увеличить размер возмущения, чтобы получить хорошие результаты.

...