- 一种混合麻雀搜索算法
- 基于反向对立学习的种群初始化(有用,减小初始化种群适应度很有用)
- 利用metropolis准则对当前解与新解进行比较替换, 避免寻优迭代过程产生停滞和陷入局部最优(该准则类似于贪婪,只是用来判断是否需要代替新界,无其他作用)
2,基于 Sobol 序列和纵横交叉策略的麻雀搜索算法
-
- 基于 Sobol 序列初始化种群位置
- 采用非线性权重递减更新发现者,(原算法中缺乏对于步长的有效控制,在发现最优解后,其他个体迅速向最优解靠拢,使得算法难以有效控制全局探索和局部开发进程,从而陷入局部最优)。该方法有助于算法专注于在已探索的区域寻 找更好的解决方案,保持较高的局部开发能力,加快收敛速度。
- 针对警戒者纵横交叉策略(类似于遗传算法中的交叉变异,更新后比较适应度,则有保留)
3,基于混沌麻雀搜索算法的无人机航迹规划方法
立方混沌映射初始化
精英反向学习更新发现者(利用精英反向学习策略对麻雀种群中的发现者进行选泽,公式是随机数乘以上下边界-最优位置,这样的结果是所有新解都是利用最优解产生的,)
利用正余弦优化算法更新加入者(追随者向最优位置的移动是跳跃式的,利用正 弦余弦算法进行追随者位置更迭,减少搜索盲点。)
警戒者的作用是加强全局寻优,对收敛速度不好,对警戒者的数量采取线性递减的形式,
算法易停滞不变,采取高斯随机游走产生新个体代替原来的个体
%_________________________________________________________________________% % 麻雀优化算法 % %_________________________________________________________________________% function [Best_pos,Best_score,curve]=SSA(pop,Max_iter,lb,ub,dim,fobj) ST = 0.6;%预警值 PD = 0.7;%发现者的比列,剩下的是加入者0.3 SD = 0.2;%意识到有危险麻雀的比重 PDNumber = pop*PD; %发现者数量 SDNumber = pop*SD; %pop - pop*PD;%意识到有危险麻雀数量 if(max(size(ub)) == 1) ub = ub.*ones(1,dim); lb = lb.*ones(1,dim); %lb为1*dim的矩阵 end %种群初始化 X0=initialization(pop,dim,ub,lb); X = X0; %计算初始适应度值 fitness = zeros(1,pop); for i = 1:pop fitness(i) = fobj(X(i,:)); end [fitness, index]= sort(fitness);%排序 BestF = fitness(1); WorstF = fitness(end); GBestF = fitness(1);%全局最优适应度值 for i = 1:pop X(i,:) = X(index(i),:);%对种群按适应度进行排序 end curve=zeros(1,Max_iter); GBestX = X(1,:);%全局最优位置 X_new = X; %排好序的新种群矩阵 for i = 1: Max_iter %开始每次迭代 R2 = rand(1); for j = 1:PDNumber %%发现者的位置更新 if(R2<ST) X_new(j,:) = X(j,:).*exp(-j/(rand(1)*Max_iter));%收敛于0 else X_new(j,:) = X(j,:) + randn()*ones(1,dim);%收敛于最优位置 end end for j = PDNumber+1:pop % if(j>(pop/2)) %加入者的位置更新25 if(j>(pop - PDNumber)/2 + PDNumber)%50-35/2+35=????????和公式不一样 X_new(j,:)= randn().*exp((X(end,:) - X(j,:))/j^2); else %产生-1,1的随机数 A = ones(1,dim); for a = 1:dim if(rand()>0.5) A(a) = -1; end end AA = A'*inv(A*A'); X_new(j,:)= X(1,:) + abs(X(j,:) - X(1,:)).*AA'.*ones(1,dim); end end Temp = randperm(pop); SDchooseIndex = Temp(1:SDNumber); for j = 1:SDNumber %%警戒者位置更新 if(fitness(SDchooseIndex(j))~= GBestF) X_new(SDchooseIndex(j),:) = X(1,:) + randn().*abs(X(SDchooseIndex(j),:) - X(1,:)); elseif(fitness(SDchooseIndex(j))== GBestF) K = 2*rand() -1; X_new(SDchooseIndex(j),:) = X(SDchooseIndex(j),:) + K.*(abs( X(SDchooseIndex(j),:) - X(end,:))./(fitness(SDchooseIndex(j)) - fitness(end) + 10^-8)); end end % %边界控制 for j = 1:pop for a = 1: dim if(X_new(j,a)>ub) X_new(j,a) =ub(a); end if(X_new(j,a)<lb) X_new(j,a) =lb(a); end end end %更新位置 for j=1:pop fitness_new(j) = fobj(X_new(j,:));%求适应度 end for j = 1:pop if(fitness_new(j) < GBestF)%如果某一个的适应度小于最佳适应度,最佳的那个就要改变。在这做插值 GBestF = fitness_new(j);%如果迭代后适应度反而变大,则gbestf不变。。 GBestX = X_new(j,:); end end X = X_new; fitness = fitness_new; %排序更新 [fitness, index]= sort(fitness);%排序 for j = 1:pop X(j,:) = X(index(j),:); end curve(i) = GBestF;%如果改成fitness(1)会出现两个尖峰 end Best_pos =GBestX; Best_score = curve(end); end