💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
目录
💥1 概述
📚2 运行结果
🎉3 参考文献
🌈4 Matlab代码实现
💥1 概述
2012年,Hadi Eskandar等人观察大自然中水的循环过程产生灵感,提出了水循环算法(WCA)。在自然界中,不同的地方上的水,通过吸收太阳的能量,改变状态到另外一个地方。地面上的水分被太阳蒸发或经植物的蒸腾作用成为大气层中的水蒸气,在大气层中的水蒸气预冷就会液化成为小水珠,由于重力的作用形成降雨落到地面。目前,WCA算法已在多个方面得到应用,比如函数优化、机械工程优化等。并且,在优化这些方面的问题时,相比于其他算法,WCA算法往往能够得出更好的结果,展现了其良好的寻优能力。
📚2 运行结果
部分代码:
tic
N_stream=Npop-Nsr;
NPF=Npop; % Pareto Front Archive Size
ind.Positinotallow=[];
ind.Cost=[];
ind.Rank=[];
ind.Dominatinotallow=[];
ind.DominatedCount=[];
ind.CrowdingDistance=[];
pop=repmat(ind,Npop,1);
for i=1:Npop
pop(i).Positinotallow=LB+(UB-LB).*rand;
pop(i).Cost=objective_function(pop(i).Position);
end
[pop, F]=NonDominatedSorting(pop); % Non-dominated sorting
pop=CalcCrowdingDistance(pop,F); % Calculate crowding distance
pop=SortPopulation(pop); % Sort population
%------------- Forming Sea, Rivers, and Streams --------------------------
sea=pop(1);
river=pop(2:Nsr);
stream=pop(Nsr+1:end);
cs=[sea.CrowdingDistance';[river.CrowdingDistance]';stream(1).CrowdingDistance];
f=0;
if length(unique(cs))~=1
CN=cs-max(cs);
else
CN=cs;
f=1;
end
NS=round(abs(CN/(sum(CN)+eps))*N_stream);
if f~=1
NS(end)=[];
end
NS=sort(NS,'descend');
% ------------------------- Modification on NS -----------------------
i=Nsr;
while sum(NS)>N_stream
if NS(i)>1
NS(i)=NS(i)-1;
else
i=i-1;
end
end
i=1;
while sum(NS)<N_stream
NS(i)=NS(i)+1;
end
if find(NS==0)
index=find(NS==0);
for i=1:size(index,1)
while NS(index(i))==0
NS(index(i))=NS(index(i))+round(NS(i)/6);
NS(i)=NS(i)-round(NS(i)/6);
end
end
end
NS=sort(NS,'descend');
NB=NS(2:end);
%%
%----------- Main Loop for MOWCA --------------------------------------------
disp('********** Multi-objective Water Cycle Algorithm (MOWCA)************');
disp('*Iterations Number of Pareto Front Members *');
disp('********************************************************************');
FF=zeros(max_it,numel(sea.Cost));
for i=1:max_it
%---------- Moving stream to sea---------------------------------------
for j=1:NS(1)
stream(j).Positinotallow=stream(j).Position+2.*rand(1).*(sea.Position-stream(j).Position);
stream(j).Positinotallow=min(stream(j).Position,UB);
stream(j).Positinotallow=max(stream(j).Position,LB);
stream(j).Cost=objective_function(stream(j).Position);
end
%---------- Moving Streams to rivers-----------------------------------
for k=1:Nsr-1
for j=1:NB(k)
stream(j+sum(NS(1:k))).Positinotallow=stream(j+sum(NS(1:k))).Position+2.*rand(1,nvars).*(river(k).Position-stream(j+sum(NS(1:k))).Position);
stream(j+sum(NS(1:k))).Positinotallow=min(stream(j+sum(NS(1:k))).Position,UB);
stream(j+sum(NS(1:k))).Positinotallow=max(stream(j+sum(NS(1:k))).Position,LB);
stream(j+sum(NS(1:k))).Cost=objective_function(stream(j+sum(NS(1:k))).Position);
end
end
%---------- Moving rivers to Sea --------------------------------------
for j=1:Nsr-1
river(j).Positinotallow=river(j).Position+2.*rand(1,nvars).*(sea.Position-river(j).Position);
river(j).Positinotallow=min(river(j).Position,UB);
river(j).Positinotallow=max(river(j).Position,LB);
river(j).Cost=objective_function(river(j).Position);
end
%-------------- Evaporation condition and raining process--------------
% Check the evaporation condition for rivers and sea
for k=1:Nsr-1
if ((norm(river(k).Position-sea.Position)<dmax) || rand<0.1)
for j=1:NB(k)
stream(j+sum(NS(1:k))).Positinotallow=LB+rand(1,nvars).*(UB-LB);
end
end
end
% Check the evaporation condition for streams and sea
for j=1:NS(1)
if ((norm(stream(j).Position-sea.Position)<dmax))
stream(j).Positinotallow=LB+rand(1,nvars).*(UB-LB);
end
end
🎉3 参考文献
部分理论来源于网络,如有侵权请联系删除。
[1]张海鹏. 基于多目标水循环算法的股票投资组合构建研究[D].东北财经大学,2020.DOI:10.27006/d.cnki.gdbcu.2020.000937.
[2]姚凯. 基于多目标水循环算法的冷热电联供优化调度研究[D].南昌大学,2020.DOI:10.27232/d.cnki.gnchu.2020.001172.