使用模拟退火算法进行最小化
此示例说明如何使用 Global Optimization Toolbox 中的模拟退火算法(simulannealbnd
函数)创建并最小化目标函数。有关算法的详细信息,请参阅 模拟退火的工作原理。
简单目标函数
要最小化的目标函数是两个变量的简单函数:
min f(x) = (4 - 2.1*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-4 + 4*x2^2)*x2^2; x
该函数被称为“cam”,如 LCW Dixon 和 GP Szego [1] 所述。
为了实现目标函数计算,MATLAB® 文件 simple_objective.m
具有以下代码:
type simple_objective
function y = simple_objective(x) %SIMPLE_OBJECTIVE Objective function for PATTERNSEARCH solver % Copyright 2004 The MathWorks, Inc. x1 = x(1); x2 = x(2); y = (4-2.1.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-4+4.*x2.^2).*x2.^2;
所有 Global Optimization Toolbox 求解器假设目标有一个输入 x
,其中 x
的元素数量与问题中的变量数量一样多。目标函数计算目标函数的标量值并在其单个输出参量 y
中返回它。
尽量减少使用 simulannealbnd
为了使用 simulannealbnd
最小化目标函数,请将函数句柄和起点 x0
作为第二个参量传递给目标函数。为了实现可再现性,请设置随机数流。
ObjectiveFunction = @simple_objective; x0 = [0.5 0.5]; % Starting point rng default % For reproducibility [x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0)
simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.
x = 1×2
-0.0896 0.7130
fval = -1.0316
exitFlag = 1
output = struct with fields:
iterations: 2948
funccount: 2971
message: 'simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.'
rngstate: [1x1 struct]
problemtype: 'unconstrained'
temperature: [2x1 double]
totaltime: 1.4887
simulannealbnd
返回四个输出参量:
x
- 找到最佳点fval
- 最佳点处的函数值exitFlag
- 对应于函数停止原因的整数output
- 有关优化步骤的信息
有界约束最小化
您可以使用 simulannealbnd
来解决有约束边界的问题。将下限和上界作为向量传递。对于每个坐标 i
,求解器确保 lb(i) <= x(i) <= ub(i)
。施加边界 –64 <= x(i) <= 64
。
lb = [-64 -64]; ub = [64 64];
使用下限和上界参量运行求解器。
[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0,lb,ub);
simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.
fprintf('The number of iterations was : %d\n', output.iterations);
The number of iterations was : 2428
fprintf('The number of function evaluations was : %d\n', output.funccount);
The number of function evaluations was : 2447
fprintf('The best function value found was : %g\n', fval);
The best function value found was : -1.03163
求解器找到的解与之前基本相同。
尽量减少使用附加参数
有时您希望目标函数通过在优化期间充当常量的额外参量进行参数化。例如,在前面的目标函数中,您可能希望将常数 4、2.1 和 4 替换为可更改的参数,以创建一系列目标函数。有关详细信息,请参阅传递额外参数。
重写目标函数以在新的最小化问题中采用三个附加参数。
min f(x) = (a - b*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-c + c*x2^2)*x2^2; x
a
、b
和 c
是目标函数的参数,在优化期间充当常量(它们不会作为最小化的一部分而变化)。为了实现目标函数计算,MATLAB 文件 parameterized_objective.m
包含以下代码:
type parameterized_objective
function y = parameterized_objective(x,p1,p2,p3) %PARAMETERIZED_OBJECTIVE Objective function for PATTERNSEARCH solver % Copyright 2004 The MathWorks, Inc. x1 = x(1); x2 = x(2); y = (p1-p2.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-p3+p3.*x2.^2).*x2.^2;
再次,您需要将函数句柄以及起点作为第二个参量传递给目标函数。
simulannealbnd
仅使用一个参量 x
调用目标函数,但目标函数有四个参量:x
、a
、b
和 c
。为了指示哪个变量是参量,请使用匿名函数来捕获附加参量的值(常量 a
、b
和 c
)。创建一个函数句柄 ObjectiveFunction
到一个匿名函数,该函数接受一个输入 x
,但使用 x
、a
、b
和 c
调用 parameterized_objective
。当您创建函数句柄 ObjectiveFunction
时,变量 a
、b
和 c
具有存储在匿名函数中的值。
a = 4; b = 2.1; c = 4; % Define constant values
ObjectiveFunction = @(x) parameterized_objective(x,a,b,c);
x0 = [0.5 0.5];
[x,fval] = simulannealbnd(ObjectiveFunction,x0)
simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.
x = 1×2
0.0898 -0.7127
fval = -1.0316
求解器找到的解与之前基本相同。
参考资料
[1] Dixon, L. C. W., and G .P. Szego (eds.).Towards Global Optimisation 2.North-Holland:Elsevier Science Ltd., Amsterdam, 1978.