文章目录
- 前言
- 一、SA原理
- 二、源码
-
- 1.matlab源码
- 总结
前言
提示:本文在matlab平台实现了SA算法用于求解特征选择问题。
一、SA原理
- 通过模拟金属退火这一过程发现,从高温时粒子的不稳定状态到低温时粒子的稳定状态,其间并不是一直都往稳定的状态变化,也有小概率会往更加不稳定的状态变化,但最有总能收敛到一个比较好的局部最优解。
- SA算法是最经典的元启发式算法之一,已经被证明——只要时间足够就一定能收敛到全局最优解?忘了是不是记错了哈哈。不过对于复杂的问题上时间就是不可接受的了,只是理论上证明。
-
算法步骤,即伪代码:
①初始化当前位置和适应度值,温度。
②进入一个for loop,多次进行扰动,并记录结果
③如果上一个for loop有更好的解,则进入上一个for loop中最好的解。
④如果上一个for loop 没有更好的解,则以Metropolis准则判断是否是要接受上一个for loop的最好解
⑤降温
⑤直至迭代结束
- Memory:每次迭代记录SA的最优解,保证不丢失历史最优解。
- 降温策略:一般来说 T = T * 温度衰减系数,还有很多其它的降温策略,其实没啥用
- 扰动策略:分为随机扰动和顺序扰动
- 并行化计算:在每个for loop里面可以进行并行
二、源码
1.matlab源码
代码如下(示例):
%% SA memory&without memory were saved in this function
function [globalbest_x,globalbest_faval,X,F] = SA()
iter = 1;%迭代次数初值
% a=0.95;%温度衰减系数
Mint=0.001;%初始温度
Maxt=2000;%最后温度
gN2 = min(gN,80);
a=(Mint/Maxt)^(gN2/4800);%温度衰减系数
t=Maxt;
Markov=gN;%Markov链长度
p = 0.5;
InitializationX = randsrc(1,gN,[0,1;p,(1-p)]);%初始解
InitResult = Fitness(InitializationX);
globalbest_x = InitializationX;
globalbest_faval = InitResult (:,4);
X = InitializationX;
F = InitResult (:,4);
% Accept_P = zeros(ceil((4800/gN)),gN);
%% 开始迭代
while t>=Mint
iter = iter + 1;
% MarkovResult =
parfor j=1:Markov
NewX = X;
%%随机扰动
% r = round(rand(1,1)*gN);
% if r==0
% r = 1;
% end
% NewX(r) = ~NewX(r);
%%遍历扰动
NewX(j) = ~NewX(j);
ELMResult = ELM_Fitness(gdistribute,glable,gTrainData,gTrainLable,gTestData,gTestLable,DivideMethod,NewX,NumberofHiddenNeurons,ActiveName,C);
NewF = ELMResult(:,4);
if(NewF> F)
X = NewX;
F = NewF;
if NewF>globalbest_faval
globalbest_faval = NewF;
globalbest_x = NewX;
end
elseif exp((NewF-F)/t)>rand()
% Accept_P(iter-1,j) = P;
X = NewX;
F = NewF;
if NewF>globalbest_faval
globalbest_faval = NewF;
globalbest_x = NewX;
end
end
end
disp([iter,t,F,globalbest_faval]);
% disp(globalbest_x);
t=t*a;
end
end
%% 结果显示--------------------------------------------------------------------------
总结
本文介绍了SA算法求解特征选择问题的原理,并提供了matlab源码以供参考。