Как правило, при любой заданной итерации поиска шаблона некоторые точки mesh могут совпадать с точками сетки в предыдущих итерациях. По умолчанию поиск шаблона пересчитывает целевую функцию в этих точках mesh, хотя он уже вычислил их значения и обнаружил, что они не оптимальны. Если вычисление целевой функции занимает много времени, это может сделать поиск по шаблону запуска значительно длиннее.
Можно устранить эти избыточные расчеты с помощью кэша, то есть путем хранения истории точек, которые уже посетил поиск шаблона. Для этого установите Cache равным On
в Cache опциях. При каждом опросе поиск шаблона проверяет, находится ли текущая точка сетки в пределах заданного допуска, Tolerance, точки в кэше. Если это так, поиск не вычисляет целевую функцию для этой точки, но использует значение кэшированной функции и переходит к следующей точке.
Примечание
Когда Cache установлено на On
поиск шаблона может не идентифицировать точку в текущем mesh, которая улучшает целевую функцию, поскольку она находится в пределах заданного допуска точки в кэше. В результате поиск по шаблону может выполняться для большего количества итераций с Cache установленным значением On
чем с Cache установленным на Off
. Это, как правило, хорошая идея сохранить значение Tolerance очень маленьким, особенно для высоко нелинейных целевых функций.
Примечание
Cache
не работает, когда вы запускаете решатель параллельно.
Для примера настройте задачу, описанную в Ограниченной Минимизации Используя patternsearch и Задачу Оптимизации Live Editor следующим образом:
Введите в командной строке следующее:
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];
Создайте опции, чтобы построить график наилучшего значения функции и вычислений функции. Поскольку задача имеет линейные ограничения, используйте 'GSSPositiveBasis2N'
метод опроса. Отключите отображение.
opts = optimoptions('patternsearch','PollMethod','GSSPositiveBasis2N',... 'PlotFcn',{@psplotbestf,@psplotfuncount},'Display','none');
Запустите оптимизацию.
[x,fval,exitflag,output] = patternsearch(@lincontest7,x0,...
Aineq,bineq,Aeq,beq,[],[],[],opts);
После концов поиска шаблона графики появляются как показано на следующем рисунке.
Обратите внимание, что общее количество функций составляет 758.
Теперь установите Cache
опция для 'On'
и еще раз запустите пример.
opts.Cache = 'on'; [x2,fval2,exitflag2,output2] = patternsearch(@lincontest7,x0,... Aineq,bineq,Aeq,beq,[],[],[],opts);
Общее количество функций уменьшается до 735.
[output.funccount,output2.funccount]
ans = 758 735