这个例子演示了如何使用模拟退火算法(simulannealbnd
函数)的全局优化工具箱。有关算法的细节,请参见模拟退火的工作原理.
最小化的目标函数是两个变量的简单函数:
最小f (x) = (4 - 2.1 * x1 x1 ^ ^ 2 + 4/3) * x1 ^ 2 + x1 * x2 + (4 + 4 * x2 ^ 2) * x2 ^ 2;x
正如L.C.W. Dixon和G.P. Szego[1]所描述的,这个功能被称为“cam”。
实现目标函数的计算,MATLAB文件simple_objective.m
有以下代码:
类型simple_objective
function y = simple_objective(x) % simple_objective for PATTERNSEARCH solver %版权所有x2 = x (2);y = (4 - 2.1 * x1。^ 2 + x1。^ 4. / 3)。* x1。^ 2 + x1。* x2 + (4 + 4 * x2。^ 2)。* x2。^ 2;
所有全局优化工具箱求解器都假定目标有一个输入x
,在那里x
元素的数量与问题中变量的数量相同。目标函数计算目标函数的标量值,并在其单个输出参数中返回y
.
simulannealbnd
将目标函数最小化使用simulannealbnd
,将函数句柄传递给目标函数和起始点x0
作为第二个论点。为了再现性,设置随机数流。
ObjectiveFunction = @simple_objective;X0 = [0.5 0.5];%的起点rng默认的%的再现性[x, fval exitFlag、输出]= simulannealbnd (x0 ObjectiveFunction)
优化终止:更改的最佳功能值小于选项。功能公差。
x =1×2-0.0896 - 0.7130
fval = -1.0316
exitFlag = 1
输出=结构体字段:迭代:2948 funccount: 2971消息:'优化终止:改变最佳函数值小于选项。' rngstate: [1x1 struct] problemtype: 'unconstrained' temperature: [2x1 double] totaltime: 2.5105
simulannealbnd
返回四个输出参数:
x
-找到最佳点
fval
-最佳点的功能值
exitFlag
—函数停止原因对应的整数
输出
—优化步骤信息
您可以使用simulannealbnd
解决有约束条件的问题。将上下界作为向量传递。对于每一个坐标我
,求解器确保了这一点Lb (i) <= x(i) <= ub(i)
.实施范围-64 <= x(i) <= 64
.
Lb = [-64 -64];Ub = [64 64];
使用上界和下界参数运行求解器。
[x, fval exitFlag、输出]= simulannealbnd (x0, ObjectiveFunction磅,乌兰巴托);
优化终止:更改的最佳功能值小于选项。功能公差。
流('迭代次数为:%d\n', output.iterations);
迭代次数为:2428
流('函数的计算次数为:%d\n', output.funccount);
函数求值次数为:2447
流('找到的最佳函数值是:%g\n', fval);
得到的最佳函数值为-1.03163
解算器会找到与之前相同的解。
有时,您希望在优化过程中使用作为常量的额外参数对目标函数进行参数化。例如,在前面的目标函数中,您可能想用参数替换常数4、2.1和4,您可以更改这些参数来创建目标函数族。有关更多信息,请参见传递额外的参数.
重写目标函数,在一个新的最小化问题中增加三个参数。
最小f (x) = (a - b * x1 x1 ^ ^ 2 + 4/3) * x1 ^ 2 + x1 * x2 + (- c + c * x2 ^ 2) * x2 ^ 2;x
一个
,b
,c
是目标函数的参数,在优化过程中作为常数(它们不会作为最小化的一部分而变化)。实现目标函数的计算,MATLAB文件parameterized_objective.m
包含以下代码:
类型parameterized_objective
函数y = parameterized_objective(x,p1,p2,p3) % parameterized_objective目标函数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
,一个
,b
,c
.要指出哪个变量是实参,请使用匿名函数来捕获附加实参(常量)的值一个
,b
,c
).创建一个函数句柄ObjectiveFunction
到接受一个输入的匿名函数x
电话,但parameterized_objective
与x
,一个
,b
和c
.当你创建函数句柄时ObjectiveFunction
,变量一个
,b
,c
具有存储在匿名函数中的值。
= 4;b = 2.1;c = 4;定义常量值@(x) parameterized_objective(x,a,b,c);X0 = [0.5 0.5];[x, fval] = simulannealbnd (x0 ObjectiveFunction)
优化终止:更改的最佳功能值小于选项。功能公差。
x =1×20.0898 - -0.7127
fval = -1.0316
解算器会找到与之前相同的解。
L. C. W.迪克森和G . p。Szego (eds)。面向全局优化北荷兰:爱思唯尔科学有限公司,阿姆斯特丹,1978。