✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
⛄ 内容介绍
循环循环优化计算法是由河然然等人于2012年,其理论启发于循环,是根据观察观察,水的中水过程由提出、河水流向的过程而提出的建议。大气中断运动的驱动下,不从陆地水面、和植物的茎干,通过面散开,以水汽的形式进入大气层。到地面的主要作用是,通过地下、河道,再到达地面的作用。水水即用即循环中最常见的现象是由当前的水流循环选择的。好 好 层数)作作,大雨后,选择一些佳雨的降层为海下流算为第二天的雨点,选择一些雨后的小溪流为下午的雨点,作为晚上的雨点,认为是最后一层或海洋的雨。大海的,将其进行的以此为契机,适时的值应解(即)。
⛄ 部分代码
% 输入:
% Objective_function:你希望最小化或最大化的目标函数
% LB:问题的下限
% UB:问题的上限
% nvars:设计变量的数量
% Npop 人口规模
% Nsr 河流+海洋数量
% dmax 蒸发条件常数
% max_it:最大迭代次数
% 输出:
% Non_Downed_Solutions:最优非支配解决方案
% Pareto_Front:获得最优目标函数值
% NFEs:功能评估次数
% Elapsed_Time 解决优化问题所用的时间
MOWCA 的 %% 默认值
格式长 g
if (nargin <5 || isempty(Npop)), Npop=50; 结尾
if (nargin <6 || isempty(Nsr)), Nsr=4; 结尾
if (nargin <7 || isempty(dmax)), dmax=1e-16; 结尾
如果 (nargin <8 || isempty(max_it)), max_it=100; 结尾
%%------------------------------------------------ --------------------------
% 创建初始种群
抽动
N_stream=Npop-Nsr;
NPF=Npop; % Pareto Front 存档大小
ind.Positinotallow=[];
工业成本=[];
ind.Rank=[];
ind.Dominatinotallow=[];
ind.DominateCount=[];
ind.CrowdingDistance=[];
流行=repmat(ind,Npop,1);
对于 i=1:Npop
pop(i).Positinotallow=LB+(UB-LB).*rand;
pop(i).Cost=objective_function(pop(i).Position);
结尾
[pop, F]=非支配排序(pop); % 非支配排序
流行=计算拥挤距离(流行,F);% 计算拥挤距离
流行=排序人口(流行);% 排序人口
%------------- 形成海洋、河流和溪流 --------------
海=流行(1);
河=流行(2:NSR);
流=流行(Nsr+1:结束);
cs=[sea.CrowdingDistance';[river.CrowdingDistance]';stream(1).CrowdingDistance];
f=0;
如果长度(唯一(cs))~=1
CN=cs-max(cs);
别的
CN=cs;
f=1;
结尾
NS=round(abs(CN/(sum(CN)+eps))*N_stream);
如果 f~=1
NS(结束)=[];
结尾
NS=排序(NS,'下降');
% ------------------------- 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
⛄ 运行结果
⛄ 参考文献
[1]章纯. (2014)。水循环算法在结构优化设计中的应用和在多目标中的改进。(博士论文,广东工业大学)。