Java教程

MATLAB语言实现模拟退火算法求解n维变量的最小值问题

本文主要是介绍MATLAB语言实现模拟退火算法求解n维变量的最小值问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在给定定义域D,对于求解函数f(x)对应的最优值问题。此处以模拟退火算法求解30维变量函数F(x_i)最小值问题举例(最大值问题也可转化成求解最小值问题)。

F(x)=\sum_{i=1}^{n}(\sum_{j=1}^{i}x_j)^2

其中n=30-100\leqslant x_j\leqslant 100



一、模拟退火算法简介

模拟退火算法(SA)来源于固体退火原理,是一种基于概率的算法。模拟退火算法从某一较高初温出发,伴随温度参数的下降,寻找目标函数的全局最优解。

模拟退火算法属于贪心算法的一种,但引入了随机因素,在每次迭代是会有一定的概率接收恶化解,因此会有一定的可能性跳出局部最优解,搜索到全局最优解。



二、算法思路

令起始温度为T,由热力学可得,能量差为dE的降温概率可以表示为:

P(dE)=exp(\frac{dE}{kT})

其中k为玻尔兹曼常数。在编程实现时,一般令k=1,与T合并。令更新前的解为x,更新后的解为x_new,能量差就可以表示为:

\Delta=F(x)-F(x_{new})

最小值优化中降温的概率表示为:

P = exp(-\frac{\Delta}{T})

三、代码实现

% 使用参数
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

四、运行结果

程序执行最优解结果x及最优值F_x(x)

对函数值数组的绘图结果:

 

这篇关于MATLAB语言实现模拟退火算法求解n维变量的最小值问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!