最小化使用模拟退火算法

此示例示出了如何使用模拟退火算法来创建和最小化的目标函数(simulannealbnd功能)在全局优化工具箱。对于算法的详细信息,请参阅如何模拟退火作品

简单的目标函数

最小化的目标函数是两个变量的简单函数:

分F(X)=(4  -  2.1 * X1 ^ 2 + X1 ^ 4/3)* X1 ^ 2 + X 1 * X 2 +(-4 + 4 * X 2 ^ 2)* X2 ^ 2;X

此功能被称为“凸轮”,如在L.C.W.描述Dixon和G.P.Szego [1]。

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

类型simple_objective
函数y = simple_objective(X)%SIMPLE_OBJECTIVE为PATTERNSEARCH求解%版权所有2004 The MathWorks公司目标函数,Inc.的X1 = X(1);x2 = x (2);。Y =(。4-2.1 * X1 ^ 2 + X1 ^ 4/3)* X1 ^ 2 + X 1 * X 2 +( -  4 + 4 * X 2 ^ 2)* X2 ^ 2。;

所有全局优化工具箱求解器假定目标有一个输入X,其中X元素的数量和问题中变量的数量一样多。目标函数计算目标函数的标量值,并在它的单个输出参数中返回它ÿ

尽量减少使用simulannealbnd

使用目标函数最小化simulannealbnd,通过在功能句柄到目标函数和一个起点X0作为第二个参数。对于重复性,设定随机数流。

ObjectiveFunction = @simple_objective;x0 = [0.5 0.5];% 初始点rng默认%的再现性[X,FVAL,exitFlag,输出] = simulannealbnd(ObjectiveFunction,X0)
优化终止:在最好的函数值的变化小于options.FunctionTolerance。
X =1×2-0.0896 0.7130
FVAL = -1.0316
exitFlag = 1
输出=同场的结构:迭代:2948 funccount:2971的消息:“优化终止:在最好的函数值变化小于options.FunctionTolerance”。rngstate:[1x1的结构] problemtype: '无约束' 温度:[2×1双] TOTALTIME:2.9647

simulannealbnd返回四个输出参数:

  • X- 最佳点中找到

  • FVAL- 在最佳点函数值

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

  • 产量- 关于优化步骤信息

界约束

您可以使用simulannealbnd用约束条件来解决问题。作为向量传递下界和上界。对于每一个坐标一世,解算器可以确保lb(i) <= x(i) <= ub(i)。实施范围-64 <= X(I)<= 64

磅= [-64 -64];UB = [64 64];

使用下界和上界参数运行求解器。

[x, fval exitFlag、输出]= simulannealbnd (x0, ObjectiveFunction磅,乌兰巴托);
优化终止:在最好的函数值的变化小于options.FunctionTolerance。
fprintf中('迭代次数为:%d\n', output.iterations);
迭代次数是:2428
fprintf中(“功能的评价的人数为:%d \ n”,output.funccount);
函数计算的次数为:2447
fprintf中(“最好函数值发现:%克\ N”, fval);
最好的函数值发现:-1.03163

求解器本质上找到相同的解决方案之前。

使用附加参数最小化

有时候你想要的目标函数由作为优化过程中的常量额外的参数进行参数设置。例如,在前面的目标函数,你可能想用参数来代替常量4,2.1和4,你可以改变,以建立一个家庭的目标函数。欲了解更多信息,请参阅传递额外的参数(优化工具箱)。

重写目标函数,在一个新的最小化问题中增加三个参数。

分F(X)=(A  -  B * X1 ^ 2 + X1 ^ 4/3)* X1 ^ 2 + X 1 * X 2 +(-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模式搜索求解器目标函数%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 .P。Szego(编辑)。迈向全球优化2。北荷兰:爱思唯尔科学有限公司,阿姆斯特丹,1978年。

也可以看看

相关的话题