⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main2.m

📁 为了有效地应用遗传算法解决 鲁棒控制系统设计问题
💻 M
📖 第 1 页 / 共 3 页
字号:
%本程序是两步式多目标遗传算法。第一步寻找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 + -