概况
模拟退火算法、遗传算法、蚁群算法、粒子群算法等算法,都是属于概率算法,不绝对,不迅速,能用其它方式解决的问题,不要用这些相对复杂的算法,比如有明确的线性关系或者非线性对应关系。这里的概率算法是指摇骰子式的算法,虽然这些算法的特定规则,很大程度能保证找到比较合适的结果,但是对于复杂的多最值图像,也未必取得令人满意的结果。为了解决这个问题,发展出了自适应模拟退火算法,自适应遗传算法等改进型,以及遗传-粒子群混合型算法。
Rastrigin函数
表达式: f(x) = ∑(A+x^2 - A*cos(2π * x))
所以,二维Rastrigin函数表达式
绘图如下,最大值约80.7
optimtool工具
这是一个神奇的工具 ,旧版本(2006a以前)没有,新版本(比如2023)也没有, 2014a版本没有粒子群等,可以用2016?
模拟退火,速度比遗传慢一点,最大值检测非常好,最小值不理想。
遗传算法,最大值检测非常好,最小值检测要比sa好一些的。
其它参考
以下连接可以用学习自适应遗传算法的手撸写法,全部都是外部链接,不需要VIP可见。
https://www.cnblogs.com/yezuhui/p/6853257.html
https://www.cnblogs.com/ncepubye/p/12724070.html
演化算法原理与实战(一)遗传算法(GA)原理与Matlab实现 - 知乎
Function = @(x) -(x-5).^2; Fitness = sum(Function(Population),2);
R2023a版本推荐Function的这种写法。
%%百度生成的sa算法,它自己叫asa自适应模拟退火
function [bestSol, bestFitness] = asa(objFunc, nVar, lb, ub, MaxIt, T0, Tf)% objFunc:目标函数% nVar:变量数量% lb:变量下界% ub:变量上界% MaxIt:最大迭代次数% T0:初始温度% Tf:最终温度Dimension = nVar; % 变量维数Iteration = MaxIt; % 迭代次数T = T0; % 初始温度r = 0.98; % 温度降低的速率bestSol = rand(1, Dimension).*(ub - lb) + lb; % 初始解bestFitness = objFunc(bestSol); % 初始解的适应度fitness = bestFitness; % 当前解的适应度Sol = bestSol; % 当前解Temp = T; % 当前温度for iter = 1:IterationnewSol = rand(1, Dimension).*(ub - lb) + lb; % 产生新解newFitness = objFunc(newSol); % 新解的适应度if newFitness < fitnessSol = newSol;fitness = newFitness;elseif exp(-(newFitness - fitness)/Temp) > rand()Sol = newSol;fitness = newFitness;endif fitness < bestFitnessbestSol = Sol;bestFitness = fitness;endTemp = Temp * r; % 降低温度end
end