主要内容

用模拟退火算法求极小化

此示例演示如何使用模拟退火算法(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
函数y = simple_objective(x) % simple_objective for PATTERNSEARCH solver %版权所有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、输出]= simulannealbnd (x0 ObjectiveFunction)
优化终止:最佳函数值的变化小于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: 1.2776

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磅,乌兰巴托);
优化终止:最佳函数值的变化小于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
函数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具有存储在匿名函数中的值。

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

求解器得到的解基本上和之前的解一样。

参考文献

狄克逊,l.c.w., G . p。Szego (eds)。向着全球优化2。荷兰北部:爱思唯尔科学有限公司,阿姆斯特丹,1978。

另请参阅

相关的话题

Baidu
map