使用模拟退火算法最小化
这个例子展示了如何创建和使用模拟退火算法最小化一个目标函数(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: 2.8401
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_objective
与x
,一个
,b
和c
。当您创建函数处理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年。