Этот пример показывает, как использовать гибридную схему оптимизировать функцию с помощью Генетического алгоритма и другого метода оптимизации. ga
может достигнуть области около оптимальной точки относительно быстро, но может потребоваться много функциональных оценок, чтобы достигнуть сходимости. Обычно используемый метод должен запустить ga
для небольшого количества поколений, чтобы добраться около оптимальной точки. Затем решение от ga
используется в качестве начальной точки для другого решателя оптимизации, который быстрее и более эффективен для локального поиска.
В этом примере мы оптимизируем функцию Розенброка (также известный как вторую функцию Деджонга):
f(x)= 100*(x(2)-x(1)^2)^2+(1-x(1))^2
Эта функция известна в оптимизации из-за медленной сходимости большая часть выставки методов при попытке минимизировать эту функцию. Эта функция имеет уникальный минимум в точке x* = (1,1), где это имеет значение функции f (x*) = 0.
Мы можем просмотреть код для этой функции фитнеса.
type dejong2fcn.m
function scores = dejong2fcn(pop) %DEJONG2FCN Compute DeJongs second function. %This function is also known as Rosenbrock's function % Copyright 2003-2004 The MathWorks, Inc. scores = zeros(size(pop,1),1); for i = 1:size(pop,1) p = pop(i,:); scores(i) = 100 * (p(1)^2 - p(2)) ^2 + (1 - p(1))^2; end
Мы используем функциональный plotobjective
в тулбоксе, чтобы построить функциональный dejong2fcn
в области значений = [-2 2;-2 2].
plotobjective(@dejong2fcn,[-2 2;-2 2]);
Чтобы запуститься, мы будем использовать Генетический алгоритм, ga
, один, чтобы найти минимум функции Розенброка. Мы должны предоставить ga
указатель на функцию к функции фитнеса dejong2fcn.m
. Кроме того, ga
должен знать, сколько переменных находится в проблеме, которая является два для этой функции.
FitnessFcn = @dejong2fcn; numberOfVariables = 2;
Некоторые функции построения графика могут быть выбраны, чтобы контролировать производительность решателя.
options = optimoptions(@ga,'PlotFcn',{@gaplotbestf,@gaplotstopping});
Мы устанавливаем поток случайных чисел для воспроизводимости и запускаем ga
с вышеупомянутыми входными параметрами.
rng('default')
[x,fval] = ga(FitnessFcn,numberOfVariables,[],[],[],[],[],[],[],options)
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
x = 1×2
0.3454 0.1444
fval = 0.4913
Глобальный оптимум в x* = (1,1). ga
нашел точку около оптимума, но не мог получить более точный ответ с критерием остановки по умолчанию. Путем изменения критерия остановки мы можем найти более точное решение, но может потребоваться намного больше функциональных оценок, чтобы достигнуть x* = (1,1). Вместо этого мы можем использовать более эффективный локальный поиск, который запускается где брошенный ga
. Гибридное функциональное поле в ga
обеспечивает эту функцию автоматически.
Мы будем использовать гибридную функцию, чтобы решить задачу оптимизации, т.е. когда ga
остановится (или вы просите, чтобы он остановился), эта гибридная функция начнет с конечного пункта, возвращенного ga
. Нашим выбором является fminsearch
, patternsearch
или fminunc
. Поскольку этот пример оптимизации сглажен, т.е. непрерывно дифференцируем, мы можем использовать функцию fminunc
от Optimization Toolbox как наша гибридная функция. Поскольку fminunc
имеет свою собственную структуру опций, мы обеспечиваем его в качестве дополнительного аргумента при определении гибридной функции.
fminuncOptions = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton'); options = optimoptions(options,'HybridFcn',{@fminunc, fminuncOptions});
Запустите решатель ga
снова с fminunc
как гибридная функция.
[x,fval] = ga(FitnessFcn,numberOfVariables,[],[],[],[],[],[],[],options)
Optimization terminated: average change in the fitness value less than options.FunctionTolerance. First-order Iteration Func-count f(x) Step-size optimality 0 3 0.664192 28.1 1 12 0.489131 0.000402247 0.373 2 21 0.48383 91 1.22 3 24 0.422036 1 6.7 4 33 0.225633 0.295475 7.36 5 39 0.221682 0.269766 10.1 6 45 0.126376 10 7.96 7 48 0.0839643 1 0.457 8 54 0.0519836 0.5 4.56 9 57 0.0387946 1 5.37 10 60 0.0149721 1 0.85 11 63 0.00959914 1 3.45 12 66 0.0039939 1 0.662 13 69 0.00129755 1 0.348 14 72 0.000288982 1 0.634 15 75 2.29621e-05 1 0.0269 16 78 3.34554e-07 1 0.0139 17 81 5.38696e-10 1 0.000801 18 84 1.72147e-11 1 7.21e-06 Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
x = 1×2
1.0000 1.0000
fval = 1.7215e-11
Первый график показывает оптимальные и средние значения генеральной совокупности в каждой генерации. Оптимальное значение, найденное ga
, когда это остановилось, также показывают в заголовке графика. Когда отключенный ga
, fminunc
(гибридная функция) был автоматически вызван лучшей точкой, найденной ga
до сих пор. Решение x
и fval
является результатом использования ga
и fminunc
вместе. Как показано здесь, использование гибридной функции может улучшить точность решения эффективно.