📄 fenelize.m
字号:
function fen=fenelize(x,gk,hk,tpop,tmax)
% 对有约束问题采用精确不可微罚函数,动态惩罚因子,适应数学模型:
% min f(x)
% s.t. gi(x)>=0 (i=1,2,……,gk);
% hj(x)==0 (j=1,2,……,hk).
%+++++++++++++++++++++++++++++++++++++
y0=objfunction(x);
res_gx=zeros(gk,1);
res_hx=zeros(hk,1);
[res_gx,res_hx]=restrain(x,gk,hk);
if gk>0
sumgk=0.0;
for i=1:gk
if imag(res_gx(i,1))~=0 %出现虚数现象
resf=10^8; %=inf时说明该染色体超过目标函数定义域
else
if res_gx(i,1)>0
resf=0;
else
resf=abs(res_gx(i,1));
end
end
sumgk=sumgk+resf;
end
else
sumgk=0.0;
end
%+++++++++++++++++++++++++++++++++++
if hk>0
sumhk=0.0;
for i=1:hk
if imag(res_hx(i,1))==0
sumhk=sumhk+abs(res_hx(i,1));
else
sumhk=inf;
end
end
else
sumhk=0.0;
end
%+++++++++++++++++++++++++++++++++++
if hk==0
factor1=floor(tpop/100);
factor2=10^factor1;
factor=min(factor2,1e+6); %阶跃式动态惩罚因子
%if tpop>=350
% factor=max(factor2,1e+6);
% end
else
if tpop<=floor(0.5*tmax)
factor1=floor(tpop/100);
factor=10^factor1; %阶跃式动态惩罚因子
else
factor1=floor(0.5*tmax/100);
factor2=10^factor1;
factor=factor2+4e+6*((tpop-(0.5*tmax))/tmax)^2; %动态惩罚因子
end
end
%factor=10; %用于程序调试
if imag(y0)==0
fen=y0+factor*(sumgk+sumhk); %惩罚函数值。
else
fen=inf;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -