主要内容

用模拟退火算法求最小值

此示例显示如何使用模拟退火算法(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]中所描述的那样。

实现目标函数的计算,MATLAB®文件simple_objective.m具有以下代码:

类型simple_objective
版权所有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;

所有全局优化工具箱求解器都假设目标只有一个输入x,在那里x问题中有多少变量就有多少元素。目标函数计算目标函数的标量值,并在其单个输出参数中返回它y

尽量减少使用simulannealbnd

最小化目标函数使用simulannealbnd,将函数句柄传递给目标函数和起始点x0作为第二个论证。为了重现性,设置随机数流。

ObjectiveFunction = @simple_objective;X0 = [0.5 0.5];%起点rng默认的%用于再现性[x,fval,exitFlag,output] = simulannealbnd(objecvefunction,x0)
优化终止:最佳函数值的更改小于options.FunctionTolerance。
x =1×2-0.0896 - 0.7130
Fval = -1.0316
exitFlag = 1
输出=带字段的结构:迭代:2948 funccount: 2971消息:'优化终止:最佳函数值的变化小于options.FunctionTolerance。' rngstate: [1x1 struct] problemtype: 'unconstrained' temperature: [2x1 double] totaltime: 3.3158

simulannealbnd返回四个输出参数:

  • x-找到最佳点

  • fval-函数值在最佳点

  • exitFlag—函数停止原因对应的整数

  • 输出—优化步骤信息

约束约束最小化

你可以使用simulannealbnd解决有约束的问题。将下界和上界作为向量传递。对于每个坐标,求解器保证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);
优化终止:最佳函数值的更改小于options.FunctionTolerance。
流('迭代次数为:%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
function y = parameterized_objective(x,p1,p2,p3) % parameterized_objective用于PATTERNSEARCH求解器的目标函数%版权所有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_objectivex一个b而且c.创建函数句柄时ObjectiveFunction,变量一个b,c具有存储在匿名函数中的值。

A = 4;B = 2.1;C = 4;定义常数值ObjectiveFunction = @(x) parameterized_objective(x,a,b,c);X0 = [0.5 0.5];[x,fval] = simulannealbnd(objecvefunction,x0)
优化终止:最佳函数值的更改小于options.FunctionTolerance。
x =1×20.0898 - -0.7127
Fval = -1.0316

解算器会得到与之前相同的解。

参考文献

[1]迪克森,l.c.w, g.p。Szego (eds)。朝向全局优化2。北荷兰:爱思唯尔科学有限公司,阿姆斯特丹,1978年。

另请参阅

相关的话题