Как правило, в любой данной итерации поиска шаблона, некоторые точки mesh могут совпасть с точками mesh в предыдущих итерациях. По умолчанию поиск шаблона повторно вычисляет целевую функцию при этих точках mesh даже при том, что это уже вычислило их значения и нашло, что они не оптимальны. Если вычисление целевой функции занимает много времени — говорят, несколько минут — это может заставить поиск шаблона запуститься значительно дольше.
Можно устранить эти избыточные вычисления при помощи кэша, то есть, путем хранения истории точек, что поиск шаблона уже посетил. Для этого установите Cache на On
в опциях Cache. На каждом опросе шаблон ищет проверки, чтобы видеть, является ли текущая точка mesh в заданном допуске, Tolerance, точки в кэше. Если так, поиск не вычисляет целевую функцию для той точки, но использует кэшируемое значение функции и шаги к следующему вопросу.
Когда Cache установлен в On
, шаблон поисковый сбой силы, чтобы идентифицировать точку в текущей mesh, которая улучшает целевую функцию, потому что это в заданном допуске точки в кэше. В результате шаблон поисковая сила, запущенная для большего количества итераций с набором Cache к On
, чем с набором Cache к Off
. Это обычно - хорошая идея сохранить значение Tolerance очень маленьким, специально для очень нелинейных целевых функций.
Например, настройте проблему, описанную в Линейно Ограниченной проблеме можно следующим образом:
Введите следующее в командной строке:
x0 = [2 1 0 9 1 0]; Aineq = [-8 7 3 -4 9 0]; bineq = 7; Aeq = [7 1 8 3 3 3; 5 0 -5 1 -5 8; -2 -6 7 1 1 9; 1 -1 2 -2 3 -3]; beq = [84 62 65 1];
Настройте свою проблему в приложении Оптимизации, чтобы совпадать со следующими фигурами.
Запустите оптимизацию.
После концов поиска шаблона графики появляются как показано в следующей фигуре.
Обратите внимание на то, что общее функциональное количество 758.
Теперь, установите Cache на On
и запустите пример снова. На этот раз графики появляются как показано в следующей фигуре.
На этот раз общее функциональное количество уменьшается до 735.
Запускать эту проблему в командной строке:
x0 = [2 1 0 9 1 0]; Aineq = [-8 7 3 -4 9 0]; bineq = 7; Aeq = [7 1 8 3 3 3; 5 0 -5 1 -5 8; -2 -6 7 1 1 9; 1 -1 2 -2 3 -3]; beq = [84 62 65 1]; opts = optimoptions('patternsearch','PollMethod','GSSPositiveBasis2N',... 'PlotFcn',{@psplotbestf,@psplotfuncount},'Display','none'); [x,fval,exitflag,output] = patternsearch(@lincontest7,x0,... Aineq,bineq,Aeq,beq,[],[],[],opts); opts.Cache = 'on'; [x2,fval2,exitflag2,output2] = patternsearch(@lincontest7,x0,... Aineq,bineq,Aeq,beq,[],[],[],opts); [output.funccount,output2.funccount]
ans = 758 735