在给定定义域,对于求解函数对应的最优值问题。此处以模拟退火算法求解30维变量函数最小值问题举例(最大值问题也可转化成求解最小值问题)。
其中,。
模拟退火算法(SA)来源于固体退火原理,是一种基于概率的算法。模拟退火算法从某一较高初温出发,伴随温度参数的下降,寻找目标函数的全局最优解。
模拟退火算法属于贪心算法的一种,但引入了随机因素,在每次迭代是会有一定的概率接收恶化解,因此会有一定的可能性跳出局部最优解,搜索到全局最优解。
令起始温度为T,由热力学可得,能量差为dE的降温概率可以表示为:
其中k为玻尔兹曼常数。在编程实现时,一般令,与T合并。令更新前的解为x,更新后的解为x_new,能量差就可以表示为:
最小值优化中降温的概率表示为:
% 使用参数 T = 1e8; % 起始温度 MAX = 100; % 变量最大值 MIN = -100; % 变量最小值 S = 0.5; % 每次的变化量 K = 0.99; % 温度递减率 T_min = 1e-9; % 温度下限 value = []; % 每次迭代更新的函数值 % 主函数main x = 200 * rand(1,30) - 100; %变量初值 while T > T_min for i = 1:10 for j = 1:30 x = fun(j,x,T); end end T = T * K; value = [value,Fx(x)]; end disp('最优解:') disp(x) disp('最小值:') disp(Fx(x)) n = 1:length(value); plot(n,value) % 退火函数 function x = fun(j,xtemp,T) f = Fx(xtemp); x = xtemp; x_new = xtemp; x_new(j) = xtemp(j) + 0.5 * getX; if ((x_new(j) > -100) && (x_new(j) < 100)) f_new = Fx(x_new); Delta = f - f_new; if f_new < f x = x_new; else if exp(Delta / T) > rand x = x_new; end end end end % 值函数 function fx=Fx(x) tmpx = 0; tempx = 0; for i = 1:30 for j = 1:i tmpx = tmpx + x(j); end tmpx = tmpx^2; tempx = tmpx + tempx; tmpx = 0; end fx = tempx; end % 获取随机数 function x = getX x = 200 * rand - 100; end
程序执行最优解结果及最优值:
对函数值数组的绘图结果: