📄 main2.m
字号:
%本程序是两步式多目标遗传算法。第一步寻找PARETO部分解,第二步寻找PARETO整个边界
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%初始化
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nind=input('种群大小nind=')
nvar=input('变量个数nvar=')
nind_amp=input('种群放大倍数nind_amp=')
interval_1=input('参数修改间隔interval_1=')
interval_2=input('图像显示间隔interval_2=')
interval_3_pmutation=input('变异区间修改间隔interval_3_pmutation=')
space=input('选择阶段方式开关space(=1开;=0关)=')
happy_kaiguan=input('选择检测方式开关happy_kaiguan(=1,2开;=0,other关)=')
best_num=input('最优解个数best_num(>1;<nind)=')
maxgen=input('繁衍代数maxgen=')
baoduobi=input('保持种群的多样性比baoduobi(往大<无穷;1.5;1;0.5;>0)=')
baoduobi_sub=input('保持种群的多样性的消除峰值数baoduobi_sub(往大<无穷;>1;15)=')
baoduolv_dis=input('保持种群的多样性的平均距离的数字化收缩率baoduolv_dis(往小<1;>0;)=')
chrom_space1_dwon=input('保持种群的多样性的平均距离数字化优惠效应拉力chrom_space1_dwon(往大<无穷;>0;)=')
ftaotaibili=input('反淘汰比ftaotaibili(往小<无穷;1.5;1;0.5;>0)=')
stockbi=input('最优个体库竞争比stockbi(<无穷;2;1.5;〉=1;)=')
youqunbi=input('种群中的优子群比例youqunbi(〉= 0.01;1;<无穷)=')
probability=input('目标函数1权重步长probability(〉= 0;〈= 0.5;)=')
probability_sup=input('目标函数1权重上限probability_sup(〉= 0;〈= 1;)=')
probability_below=input('目标函数1权重下限probability_below(〉= 0;〈= 1;)=')
pcross=input('交叉概率pcross(>0;<1)=')
pmutation=input('变异概率pmutation(>0;<1)=')
little_pmutation=input('变异概率压缩率little_pmutation(>0;<1)=')
pmutation_zone=input('变异区间压缩倍数pmutation_zone(<无穷;>1)=')
ftaotailv=input('反淘汰率ftaotailv(>0;<1)=')
ftaotailv0=input('反淘汰率ftaotailv0(>0;<1)=')
ftaotailv1=input('反淘汰率ftaotailv1(>0;<1)=')
ftaotailv2=input('反淘汰率ftaotailv2(>0;<1)=')
ftaotailv3=input('反淘汰率ftaotailv3(>0;<1)=')
ftaotailv4=input('反淘汰率ftaotailv4(>0;<1)=')
ggap=input('代沟ggap(>0;<1)=')
%nvar=10;
%nind=100;
%maxgen=10000;
%space=0,1;
%happy_kaiguan=1;2;or other;
%best_num=5;
%stockbi=>1;
%baoduobi=5;1;
%baoduobi_sub=往大<无穷;>1;
%baoduolv_dis=往小<1;>0;
%chrom_space1_dwon=往大<无穷;>0;
%ftaotaibili=0.8;1;
%nind_amp=10;
%youqunbi=3;
%probability=0.1;......;0.5;
%probability_sup= 0;〈= 1;
%probability_below= 0;〈= 1;
%ggap=0.5;
%pcross=0.9;0.7;
%pmutation=0.05;0.005;
%little_pmutation=0~1;
%pmutation_zone=<无穷;>1;10;
%ftaotailv=0.8;0.5;
%ftaotailv0=0.8;0.5;
%ftaotailv1=0.8;0.5;
%ftaotailv2=0.8;0.5;
%ftaotailv3=0.8;0.5;
%ftaotailv4=0.8;0.5;
%interval_1=10;
%interval_2=1;
%interval_3_pmutation=5;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%此间为已知的最优解,鲁棒控制不用
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Np=500;%已知的最优解群P1,P2%%%%因此对于不同的程序要做相应的调整!!!!!!!!!!!!!!!!!!!!
P1=0:1/Np:(Np-1)/Np;%P1为1*500的列;;0__1
P2=1-sqrt(P1); %ZDT1 and 4,,P1为1*500的列,,且对P1中的每个元素开方,,再被1减。
Sp=size(P1,2);%SP为P1的列数,即500
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%此间为已知的最优解,结束
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
trace1=[];trace2=[];trace3=[];stock_001=[];best=[];
Xvar1=ones(1,(nvar-1))*(-5);objv_end1_happy1=1;objv_end1_happy2=1;objv_end2_happy1=0;objv_end2_happy2=0;suiji_1=0.95;
Xvar2=ones(1,(nvar-1))*5;suiji_2=0.95;suiji_3=0.95;suiji_4=0.95;suiji_5=0.95; suiji_6= 0.95;n_xn_warm=111111111;
fieldr=[0,Xvar1;1,Xvar2];%不同的种群变量数据结构要调整
chrom=crtrp(3*nind,fieldr);
stock_001=chrom(1:nind,:);
best(1:best_num,:)=chrom(1:best_num,:);
gen=1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%主循环体
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while gen<maxgen,
best_num_copy=best_num;
if rem(gen, interval_1)==0,
nind_amp=input('种群放大倍数nind_amp=')
interval_1=input('参数修改间隔interval_1=')
interval_2=input('图像显示间隔interval_2=')
interval_3_pmutation=input('变异区间修改间隔interval_3_pmutation=')
space=input('选择阶段方式开关space(=1开;=0关)=')
happy_kaiguan=input('选择检测方式开关happy_kaiguan(=1,2开;=0,other关)=')
best_num=input('最优解个数best_num(>1;<nind;5)=')
maxgen=input('繁衍代数maxgen=')
baoduobi=input('保持种群的多样性比baoduobi(往大<无穷;1.5;1;0.5;>0)=')
baoduobi_sub=input('保持种群的多样性的消除峰值数baoduobi_sub(往大<无穷;>1;15)=')
baoduolv_dis=input('保持种群的多样性的平均距离的数字化收缩率baoduolv_dis(往小<1;>0;)=')
chrom_space1_dwon=input('保持种群的多样性的平均距离数字化优惠效应拉力chrom_space1_dwon(往大<无穷;>0;)=')
ftaotaibili=input('反淘汰比ftaotaibili(往小<无穷;1.5;1;0.5;>0)=')
stockbi=input('最优个体库竞争比stockbi(<无穷;2;1.5;〉=1;)=')
youqunbi=input('种群中的优子群比例youqunbi(〉= 0.01;1;<无穷)=')
probability=input('目标函数1权重步长probability(〉= 0;〈= 0.5;)=')
probability_sup=input('目标函数1权重上限probability_sup(〉= 0;〈= 1;)=')
probability_below=input('目标函数1权重下限probability_below(〉= 0;〈= 1;)=')
pcross=input('交叉概率pcross(>0;<1)=')
pmutation=input('变异概率pmutation(>0;<1)=')
little_pmutation=input('变异概率压缩率little_pmutation(>0;<1)=')
pmutation_zone=input('变异区间压缩倍数pmutation_zone(<无穷;>1)=')
ftaotailv=input('反淘汰率ftaotailv(>0;<1)=')
ftaotailv0=input('反淘汰率ftaotailv0(>0;<1)=')
ftaotailv1=input('反淘汰率ftaotailv1(>0;<1)=')
ftaotailv2=input('反淘汰率ftaotailv2(>0;<1)=')
ftaotailv3=input('反淘汰率ftaotailv3(>0;<1)=')
ftaotailv4=input('反淘汰率ftaotailv4(>0;<1)=')
ggap=input('代沟ggap(>0;<1)=')
end
if gen>=maxgen,
maxgen=11111111111111111111111111;
end
if best_num<1,
disp('best_num应大于1')
best_num=input('最优解个数best_num(>1;<nind;5)=')
end
if (probability_sup+probability)>1,
disp('(probability_sup+probability)>1')
probability=input('目标函数1权重步长probability(〉= 0;〈= 0.5;)=')
end
if space~=0,
q_0=fix((nind_amp+1)*nind*ftaotailv);
if q_0<=1.5*nind,
disp('Q_0应大于种群所含个体数的1.5倍')
ftaotailv=input('反淘汰率=')
end
q=fix(ggap*(nind_amp+1)*nind*ftaotailv);
if q<nind,
disp('Q应大于种群所含个体')
ggap=input('代沟=')
end
if (stockbi<1)|(n_xn_warm<=(stockbi*nind)),
disp('stockbi应大于1,且小于n_xn_warm')
stockbi=input('最优个体库竞争比stockbi(<无穷;2;1.5;〉=1;)=')
end
end
if best_num_copy<best_num,
best((best_num_copy+1):best_num,:)=stock_001((nind-(best_num-best_num_copy)+1):nind,:);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%保持种群的多样性
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%第一步寻找PARETO部分解
if space~=0,
%%%%%%%%%%%%%%%%%%第一步寻找PARETO部分解
objv1=f1333(chrom(:,:));
objv2=f2333(chrom(:,:));
n_xn2=size(chrom,1);
distancea=sqrt((objv1(2:n_xn2)-objv1(1:(n_xn2-1))).^2+(objv2(2:n_xn2)-objv2(1:(n_xn2-1))).^2);
distanceb=sqrt((objv1(n_xn2)-objv1(1)).^2+(objv2(n_xn2)-objv2(1)).^2);
distance0=[distanceb;distancea];
n_xn1=size(distance0,1);
duoyanghuabiaozhun=sum(distance0)/n_xn1;
% %%%%%%%%%%%%%%%%%%以上是求相邻点的距离差
[distance0_0,distance0_id1]=sort(distance0);
selch1=chrom(distance0_id1,:);
chrom=selch1;
n_xn1=size(distance0_0,1);
distance0_id2=find(distance0_0<=((sum(distance0_0)/n_xn1)*baoduobi));
chrom(distance0_id2,:)=[];
%%以上是根据相邻点的距离差剔除劣解
%%%%%%%%%%%%%种群数不足nind个时,添加最优解
n_xn2=size(chrom,1);
if (n_xn2>0)&(baoduobi_sub>=0),
number=baoduobi_sub;
if baoduobi_sub>=n_xn2,
disp('保持种群的多样性的消除峰值数baoduobi_sub太大')
baoduobi_sub=n_xn2-1;
end
chrom((n_xn2-baoduobi_sub):n_xn2,:)=[];
baoduobi_sub=number;
end
%%
n_xn2=size(chrom,1);
if n_xn2==0,
disp('保持种群的多样性比baoduobi太大')
end
if (n_xn2==0)|(n_xn2<=nind-best_num-1),
chrom((n_xn2+1):(n_xn2+best_num),:)=best(1:best_num,:);
chrom((n_xn2+best_num+1):nind,:)=stock_001((n_xn2+best_num+1):nind,:);
end
if (n_xn2<nind)&(n_xn2>nind-best_num-1),
chrom((n_xn2+1):nind,:)=best(1:(nind-n_xn2),:);
end
if n_xn2>nind,
chrom(1:(n_xn2-nind),:)=[];
end
%%%%%%%%%%%%%%%%%%%%种群数不足nind个时,添加最优解结束
%%%%%%%%%%%%%%%%%%%%%%排序
suiji_1=suiji_1+probability;
if suiji_1>probability_sup,
probability_below1=fix(suiji_1/probability_sup);
probability_below2=suiji_1-probability_below1*probability_sup;
if probability_below2<(probability_below/5),
suiji_1= probability_below;
else
suiji_1= probability_below2;
end
end
suiji= suiji_1;
%suiji_1=rand;
%suiji=probability+ suiji_1*(1-2*probability);
objv1=f1333(chrom(:,:));
objv2=f2333(chrom(:,:));
objv01=[objv1';objv2'];
objv0=suiji.*objv01(1,:)+(1-suiji).*objv01(2,:);
[objv0_11,oid_0]=sort(objv0);
oid_1=oid_0';
selch1=chrom(oid_1,:);
chrom=selch1;
v_end=chrom;
objv1=f1333(chrom(:,:));
objv2=f2333(chrom(:,:));
objv0=[objv1';objv2'];
objv_end=objv0;
%%%%%%%%%%%%%%%%%%%%%%
objv1_objv2_max_min_end1=abs(objv_end1_happy1-objv_end2_happy1);
objv1_objv2_max_min_end2=abs(objv_end1_happy2-objv_end2_happy2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%排序结束
% %%%%%%%%%%%%%%%%%%第一步寻找PARETO部分解,结束
else
%%%%%%%%%%%%%%%% %第二步寻找PARETO整个边界,共享函数法
objv1=f1333(chrom(:,:));
objv2=f2333(chrom(:,:));
if probability<0.05,
probability1=0.1;
else
probability1=probability;
end
number=fix(1/probability1)+1;
number_1=1;
objv02_12=[];
objv02=[];
while number_1<=number,
suiji_2=suiji_2+probability;
if suiji_2>probability_sup,
probability_below1=fix(suiji_2/probability_sup);
probability_below2=suiji_2-probability_below1*probability_sup;
if probability_below2<(probability_below/5),
suiji_2= probability_below;
else
suiji_2= probability_below2;
end
end
suiji= suiji_2;
%suiji_1=rand;
%suiji=probability+ suiji_1*(1-2*probability);
objv01=[objv1';objv2'];
objv02_12(number_1,:)=suiji.*objv01(1,:)+(1-suiji).*objv01(2,:);
number_1=number_1+1;
end
objv02_12_1=sort(objv02_12,1);
happy_number_objv02_12_1=(objv02_12_1(1,:)+objv02_12_1(number,:))./2;
[objv02_thlhappy_1,objv02_thlhappy_oid]=sort(happy_number_objv02_12_1,2);
selch1=chrom(objv02_thlhappy_oid,:);
chrom=selch1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%求各个体的距离
n_xn2_0=size(chrom,1);
distance0001=zeros(n_xn2_0,n_xn2_0);
distance0002=zeros(n_xn2_0,n_xn2_0);
distance000_1=[];
happy=1;
while happy<=2,
number_01=1;
while number_01<=n_xn2_0,
number_02=1;
vbiaozhun1=chrom(number_01,:);
objvbiaozhun11=f1333(vbiaozhun1(:,:));
objvbiaozhun12=f2333(vbiaozhun1(:,:));
while number_02<=n_xn2_0,
vbiaozhun2=chrom(number_02,:);
objvbiaozhun21=f1333(vbiaozhun2(:,:));
objvbiaozhun22=f2333(vbiaozhun2(:,:));
%%%%%%%%%%%%%%%%%%%%%%%%%%%
if happy==1,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
distance0001(number_01,number_02)=abs(objvbiaozhun11-objvbiaozhun21);
else
distance0002(number_01,number_02)=abs(objvbiaozhun12-objvbiaozhun22);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
number_02=number_02+1;
end
number_01=number_01+1;
end
happy=happy+1;
end
%distance000_1(number_01)=sum(distance000(number_01,:));
%distance000_2=max(distance000_1);
%[distance000_3,distance000_iod]=sort(distance000_1);
%selch1=chrom(distance000_iod,:);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -