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