|
function [Xt,Yt] = FSA_scatter( Xi, Yi, pop,pro, popminmax, sizepop, visual, step, try_number, delta, BestPop)
% 追尾行为
popmin = popminmax(1); popmax = popminmax(2);
V = length(Xi);M = length(Yi); %%返回向量长度
for k=1:sizepop %%sizeopp种群数
d(k) = norm( Xi-pop(k,1:V),2);%%二范数计算,计算当前位置到其他种群位置的距离。
end
[a,b] = find( d>0 & d<visual );%%a没用,可用~忽略;主要计算b的值
if(~isempty(b)) %%判断~isempty(b),b为空数组,输出为0,执行觅食行为;否则输出逻辑1,转到下一条指令。
Xc = zeros( size(pop(1,1:V)) );%%赋值为0数组
for k=1:length(b) %%返回向量长度,%%%既符合要求的个体(猜)
XcQ(k,:) = pop(b(k),1:V); %%对应x值
YcQ(k,:) = evaluate_objective( XcQ(k,:),pro); %%得到符合条件个体的Y值
end
%找到所有支配解
Cnew = [XcQ,YcQ];V = size(XcQ,2);M = size(YcQ,2);
[Cnew] = JudgePopDominationQs(Cnew,M,V);
XcQ=Cnew(:,1:V);YcQ=Cnew(:,V+1:end); %%肉眼可见。。
%计算拥挤度 并将拥挤度最大的作为最优的
Dis = FishDis([XcQ YcQ;Xi Yi;],M,V); %%可以看到Xi,Yi在最后一行,对应序号为end
[~,ind]=max(Dis(1:end-1)); %% ind对应的序号为拥挤度最大的,对应判断语句
Xmax = XcQ(ind,:); %%赋值
%%Xmax = (Xmax-Xi+BestPop(1:V)-Xi)+Xi; %%%新点的一种求取方法,看个人喜好增减或改变
Ymax = evaluate_objective(Xmax,pro); %%求y值
%if Domination2(Ymax,Yi) && Dis(ind)>Dis(end) %%追尾行为的判断条件
if Domination2(Ymax,Yi) && Dis(ind)>Dis(end) && Dis(ind)<delta %%看行23,24
Xt = Xi + ( Xmax - Xi )./norm(Xmax-Xi,2) .* step .*rand(1);
Xt=PopWs(Xt,pro);
Yt = evaluate_objective(Xt,pro); % 适应度值 %%新点求值过程
else
% 觅食行为
[Xt,Yt] = FSA_find( Xi, Yi, pro, popminmax, visual, step, try_number,BestPop(1:V));
end
else
% 觅食行为
[Xt,Yt] = FSA_find( Xi, Yi, pro, popminmax, visual, step, try_number ,BestPop(1:V));
end
%%%%%%%%以上为个人理解,有错万望指出,一起学习,进步%%%%%%%%%%%
|
|