www.gusucode.com > matlab编程遗传算法计算匹配电路源码程序 > code1/code/MATLAB源代码/matlab_match/ga_helu_equalizer.m

    function [Chrom,num_integer,num_parameter,ObjV,trace,sat_target,gen] = ga_helu_equalizer(Nind,MAXGEN,SUBPOP,stu_min,stu_max,exp_objv)
%UNTITLED4 此处显示有关此函数的摘要
%   此处显示详细说明
%Nind=200;   %个体数目,或每个子种群的个体数目
%MAXGEN=450;   %最大遗传代数
GGAP=0.9;     %选择算子的选择比例
%SUBPOP=4;    %子种群数 
MIGR=0.2;     %迁移率
MIGGEN=20;    %每隔多少代进行迁移
INSR=0.9;     %插入率
%mortality=0.2;    %淘汰率
num_integer=21;     %整数编码的基因数
num_parameter=15;     %每个结构所含的电气参数的数量
L1_min=10;
L1_max=1000;
C1_min=0.1;
C1_max=1000;
L2_min=10;
L2_max=100;
C2_min=0.1;
C2_max=1000;
L3_min=10;
L3_max=100;
C3_min=0.1; 
C3_max=1000;
L4_min=10;
L4_max=100;
C4_min=0.1;
C4_max=1000;
L5_min=10;
L5_max=100;
C5_min=0.1;
C5_max=1000;
L6_min=10;
L6_max=100;
C6_min=0.1;
C6_max=1000;
L7_min=10;
L7_max=100;
C7_min=0.1;
C7_max=1000;
R_min=1;
R_max=1000;
num_max=8;
variable_range=[stu_min 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min ...
L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min ...
L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min ...
L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min L1_min C1_min L2_min C2_min L3_min C3_min L4_min C4_min L5_min C5_min L6_min C6_min L7_min C7_min R_min;...
stu_max num_max num_max num_max num_max num_max num_max num_max num_max num_max num_max num_max num_max num_max num_max num_max num_max num_max num_max num_max num_max...
L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max ...
L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max ...
L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max ...
L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max L1_max C1_max L2_max C2_max L3_max C3_max L4_max C4_max L5_max C5_max L6_max C6_max L7_max C7_max R_max];

Chrom=creat_chrom(SUBPOP*Nind,num_integer,variable_range);    %创建种群
%Chrom(1,:)=[1 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ...
%    61.2 930.1 3 37.6 1000 3 18 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 ...
%    43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 ...
%    43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 ...
%    43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14 43.6 850.1 3 39.6 1000 3 14];
Chrom = check_chrom_rules_helu(Chrom,num_integer);
trace=zeros(MAXGEN,2);     %用于跟踪算法的解
[ObjV,S21_passband_delta,~,~]=helu(Chrom,num_integer,num_parameter);   %计算目标函数值
gen=0;                         %代数计数器
mutation_probability_max=0.2;      %设置变异率的最大值
mutation_probability_min=0.05;      %设置变异率的最小值
crossover_probability_max=0.8;     %设置交叉率的最大值
crossover_probability_min=0.4;     %设置交叉率的最小值

while (gen<MAXGEN)&&(min(ObjV)>exp_objv)
      FitnV=ranking(ObjV,[2 0],SUBPOP);      %基于排序的适应度分配,目标值最小的适应度为2,最大的适应度为0
      SelCh=select('sus',Chrom,FitnV,GGAP,SUBPOP);    %随机遍历抽样
      if gen==0
           [ObjVSel,Sel_S21_passband_delta,VSWR1_max,VSWR2_max]=helu(SelCh,num_integer,num_parameter);
      end
      SelCh=recombin_structure(SelCh,num_integer,num_parameter,SUBPOP);      %离散重组,对结构离散重组,电气参数跟随移动
      SelCh=recombin_electric_parameter(SelCh,num_integer,crossover_probability_max,crossover_probability_min,gen,MAXGEN);    %电气参数的中间重组
      SelCh=mutate_variable(SelCh,variable_range,num_integer,mutation_probability_max,mutation_probability_min,gen,MAXGEN,ObjVSel);   %变异
      SelCh = check_chrom_rules_helu(SelCh,num_integer);
      [ObjVSel,Sel_S21_passband_delta,VSWR1_max,VSWR2_max]=helu(SelCh,num_integer,num_parameter); %计算子代的目标函数值

      [Chrom,ObjV]=reins(Chrom,SelCh,SUBPOP,[1 INSR],ObjV,ObjVSel);    %重插入子代的新种群

      gen=gen+1;                               %代数计数器加1
      trace(gen,1)=min(ObjV);                  %跟踪最优解
      trace(gen,2)=sum(ObjV)/length(ObjV);     %跟踪平均解

      if (rem(gen,MIGGEN)==0)                  %在子种群之间迁移个体
           [Chrom,ObjV]=migrate(Chrom,SUBPOP,[MIGR,1,0],ObjV);
%           [x,y]=sort(ObjV','descend');
%           Chrom(y(1:Nind*SUBPOP*mortality),:)=creat_chrom(Nind*SUBPOP*mortality,num_integer,variable_range);
%           [ObjV,S21_passband]=match1(Chrom,num_integer,num_parameter);
      end

end
[BestObjV,Location]=min(ObjV);                  %找出最优解
[ObjV1,S21_passband_delta1,VSWR1_max1,VSWR2_max1]=helu(Chrom(Location,:),num_integer,num_parameter);
if (S21_passband_delta1<3)&&(VSWR1_max1<1.6)
    sat_target=1;
else sat_target=0;
end
%figure(1);
%plot(trace(1:gen,1));hold on;grid;                      %最优解的曲线
%plot(Temp_trace(:,2),'-.');grid;                    %平均解的曲线
%legend('解的变化','均值的变化');
%BestObjV=Temp_BestObjV
%BestS21_passband=Temp_BestS21_passband
%BestIndividual=Temp_BestIndividual

%[ObjV,S21_passband,root_mean_square]=helu(Chrom,num_integer,num_parameter);
%[BestObjV,Location]=min(ObjV)                  %找出最优解
%[ObjV1,S21_passband1,root_mean_square1,VSWR1_max,VSWR2_max]=helu(Chrom(Location,:),num_integer,num_parameter)
%BestIndividual=Chrom(Location,:)               %最优解的基因
%plot_s21_helu(Chrom(Location,:),num_integer,num_parameter);
%load train
%sound(y,Fs)
end