主要内容

使用模拟退火算法最小化

这个例子展示了如何创建和使用模拟退火算法最小化一个目标函数(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.迪克森和他的Szego [1]。

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

类型simple_objective
函数y = simple_objective (x) % PATTERNSEARCH simple_objective目标函数求解器%版权2004年MathWorks公司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: [1 x1 struct] problemtype:“无约束的温度:[2 x1双]totaltime: 3.7955

simulannealbnd返回四个输出参数:

  • x-最佳点发现

  • fval——在最佳点函数值

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

  • 输出——信息优化步骤

绑定约束最小化

您可以使用simulannealbnd与绑定约束来解决问题。通过上下边界向量。对于每一个坐标解算器确保磅(我)< = x (i) < =乌兰巴托(我)。实施范围-64 < = x (i) < = 64

磅= (-64 - -64);乌兰巴托= (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) % PATTERNSEARCH parameterized_objective目标函数求解器%版权2004年MathWorks公司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,一个,bc。当您创建函数处理ObjectiveFunction,变量一个,b,c值存储在匿名函数。

= 4;b = 2.1;c = 4;%定义常量值ObjectiveFunction = @ (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

解算器发现本质上相同的解决方案。

引用

[1]狄克逊,l·c·W。每分钟,G。Szego (eds)。对全球优化2。北荷兰:爱思唯尔的科学有限公司,阿姆斯特丹,1978年。

另请参阅

相关的话题