【優化演算法】蚱蜢優化演算法(GOA)【含Matlab原始碼 1070期】
阿新 • • 發佈:2021-06-28
一、簡介
GOA是一種用於全域性優化的新型元啟發式演算法
提出的蝗蟲優化演算法(GOA)在數學上模擬並模擬了蝗蟲群的行為,以解決優化問題。
提出了一種稱為蚱蜢優化演算法(GOA)的優化演算法,並將其應用於結構優化中具有挑戰性的問題。該演算法通過數學建模和模擬自然界中蝗蟲群的行為來解決優化問題。首先將GOA演算法應用於包括CEC2005在內的一組測試問題上,對其效能進行了定性和定量的測試和驗證。並以52杆桁架、三杆桁架及懸臂樑為例,探討其適用性。
1 GOA數學模型
2 GOA迭代模型
3 GOA演算法的基本流程
4 GOA缺點
二、原始碼
%_________________________________________________________________________% % Grasshopper Optimization Algorithm (GOA) source codes demo V1.0 % % % % Developed in MATLAB R2016a % % The Grasshopper Optimization Algorithm function [TargetFitness,TargetPosition,Convergence_curve,Trajectories,fitness_history, position_history]=GOA(N, Max_iter, lb,ub, dim, fobj) disp('GOA is now estimating the global optimum for your problem....') flag=0; if size(ub,1)==1 ub=ones(dim,1)*ub; lb=ones(dim,1)*lb; end if (rem(dim,2)~=0) % this algorithm should be run with a even number of variables. This line is to handle odd number of variables dim = dim+1; ub = [ub; 100]; lb = [lb; -100]; flag=1; end %Initialize the population of grasshoppers GrassHopperPositions=initialization(N,dim,ub,lb); GrassHopperFitness = zeros(1,N); fitness_history=zeros(N,Max_iter); position_history=zeros(N,Max_iter,dim); Convergence_curve=zeros(1,Max_iter); Trajectories=zeros(N,Max_iter); cMax=1; cMin=0.00004; %Calculate the fitness of initial grasshoppers for i=1:size(GrassHopperPositions,1) if flag == 1 GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,1:end-1)); else GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,:)); end fitness_history(i,1)=GrassHopperFitness(1,i); position_history(i,1,:)=GrassHopperPositions(i,:); Trajectories(:,1)=GrassHopperPositions(:,1); end [sorted_fitness,sorted_indexes]=sort(GrassHopperFitness); % Find the best grasshopper (target) in the first population for newindex=1:N Sorted_grasshopper(newindex,:)=GrassHopperPositions(sorted_indexes(newindex),:); end TargetPosition=Sorted_grasshopper(1,:); TargetFitness=sorted_fitness(1); % Main loop l=2; % Start from the second iteration since the first iteration was dedicated to calculating the fitness of antlions while l<Max_iter+1 c=cMax-l*((cMax-cMin)/Max_iter); % Eq. (2.8) in the paper for i=1:size(GrassHopperPositions,1) temp= GrassHopperPositions'; for k=1:2:dim S_i=zeros(2,1); for j=1:N if i~=j Dist=distance(temp(k:k+1,j), temp(k:k+1,i)); % Calculate the distance between two grasshoppers r_ij_vec=(temp(k:k+1,j)-temp(k:k+1,i))/(Dist+eps); % xj-xi/dij in Eq. (2.7) xj_xi=2+rem(Dist,2); % |xjd - xid| in Eq. (2.7) s_ij=((ub(k:k+1) - lb(k:k+1))*c/2)*S_func(xj_xi).*r_ij_vec; % The first part inside the big bracket in Eq. (2.7) S_i=S_i+s_ij; end end S_i_total(k:k+1, :) = S_i; end X_new = c * S_i_total'+ (TargetPosition); % Eq. (2.7) in the paper GrassHopperPositions_temp(i,:)=X_new'; end % GrassHopperPositions GrassHopperPositions=GrassHopperPositions_temp; for i=1:size(GrassHopperPositions,1) % Relocate grasshoppers that go outside the search space Tp=GrassHopperPositions(i,:)>ub';Tm=GrassHopperPositions(i,:)<lb';GrassHopperPositions(i,:)=(GrassHopperPositions(i,:).*(~(Tp+Tm)))+ub'.*Tp+lb'.*Tm; % Calculating the objective values for all grasshoppers if flag == 1 GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,1:end-1)); else GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,:)); end fitness_history(i,l)=GrassHopperFitness(1,i); position_history(i,l,:)=GrassHopperPositions(i,:); Trajectories(:,l)=GrassHopperPositions(:,1); % Update the target if GrassHopperFitness(1,i)<TargetFitness TargetPosition=GrassHopperPositions(i,:); TargetFitness=GrassHopperFitness(1,i); end end Convergence_curve(l)=TargetFitness; disp(['In iteration #', num2str(l), ' , target''s objective = ', num2str(TargetFitness)]) l = l + 1; end
三、執行結果
四、備註
版本:2014a
完整程式碼或代寫加1564658423