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

    function NewChrom = mutate_variable(OldChrom,variable_range,num_integer,Pm_max,Pm_min,gen,MAXGEN,ObjVSel)
%mutate_variable 离散变异+实值变异
%   此处显示详细说明
Pm=Pm_max+(Pm_min-Pm_max)*(gen+1)/MAXGEN;
[Nind,Lind]=size(OldChrom);
[x,y]=sort(ObjVSel);
Pm_big=3*Pm;
Pm_medium=2*Pm;
Pm_small=Pm;
length_big=ceil(Nind/4);
length_medium=ceil(Nind/2);
length_small=Nind-length_medium-length_big;
i_big=y(1:length_big);
i_medium=y(length_big+1:length_big+length_medium);
i_small=y(length_medium+1:length_medium+length_small);
NewChrom=OldChrom;
%结构变异
structure_variable_range=variable_range(2,1:num_integer)-variable_range(1,1:num_integer);

Base_structure_variable_range_big=structure_variable_range(ones(length_big,1),:);
Base_structure_variable_low_big=rep(variable_range(1,1:num_integer),[length_big,1]);    
NewChrom(i_big,1:num_integer)=Base_structure_variable_low_big+rem(OldChrom(i_big,1:num_integer)+(rand(length_big,num_integer)<Pm_big).*ceil(rand(length_big,num_integer).*(Base_structure_variable_range_big))-Base_structure_variable_low_big,Base_structure_variable_range_big+1);

Base_structure_variable_range_medium=structure_variable_range(ones(length_medium,1),:);
Base_structure_variable_low_medium=rep(variable_range(1,1:num_integer),[length_medium,1]); 
NewChrom(i_medium,1:num_integer)=Base_structure_variable_low_medium+rem(OldChrom(i_medium,1:num_integer)+(rand(length_medium,num_integer)<Pm_medium).*ceil(rand(length_medium,num_integer).*(Base_structure_variable_range_medium))-Base_structure_variable_low_medium,Base_structure_variable_range_medium+1);

Base_structure_variable_range_small=structure_variable_range(ones(length_small,1),:);
Base_structure_variable_low_small=rep(variable_range(1,1:num_integer),[length_small,1]); 
NewChrom(i_small,1:num_integer)=Base_structure_variable_low_small+rem(OldChrom(i_small,1:num_integer)+(rand(length_small,num_integer)<Pm_small).*ceil(rand(length_small,num_integer).*(Base_structure_variable_range_small))-Base_structure_variable_low_small,Base_structure_variable_range_small+1);
%电气参数变异
electric_parameter_range=variable_range(2,num_integer+1:Lind)-variable_range(1,num_integer+1:Lind);

range_big=rep(0.5*electric_parameter_range,[length_big 1]);
range_medium=rep(0.5*electric_parameter_range,[length_medium 1]);
range_small=rep(0.5*electric_parameter_range,[length_small 1]);

range_big=range_big.*(rand(length_big,Lind-num_integer)<Pm_big);
range_medium=range_medium.*(rand(length_medium,Lind-num_integer)<Pm_medium);
range_small=range_small.*(rand(length_small,Lind-num_integer)<Pm_small);

range_big=range_big.*(1-2*(rand(length_big,Lind-num_integer)<0.5));
range_medium=range_medium.*(1-2*(rand(length_medium,Lind-num_integer)<0.5));
range_small=range_small.*(1-2*(rand(length_small,Lind-num_integer)<0.5));

   ACCUR = 20;
   Vect = 2 .^ (-(0:(ACCUR-1))');
   Delta_big = (rand(length_big,ACCUR) < 1/ACCUR) * Vect;
   Delta_medium = (rand(length_medium,ACCUR) < 1/ACCUR) * Vect;
   Delta_small = (rand(length_small,ACCUR) < 1/ACCUR) * Vect;
   Delta_big = rep(Delta_big, [1 Lind-num_integer]);
   Delta_medium = rep(Delta_medium, [1 Lind-num_integer]);
   Delta_small = rep(Delta_small, [1 Lind-num_integer]);

NewChrom(i_big,num_integer+1:Lind)=OldChrom(i_big,num_integer+1:Lind)+range_big.*Delta_big;
NewChrom(i_medium,num_integer+1:Lind)=OldChrom(i_medium,num_integer+1:Lind)+range_medium.*Delta_medium;
NewChrom(i_small,num_integer+1:Lind)=OldChrom(i_small,num_integer+1:Lind)+range_small.*Delta_small;

NewChrom(:,num_integer+1:Lind)=max(rep(variable_range(1,num_integer+1:Lind),[Nind 1]),NewChrom(:,num_integer+1:Lind));
NewChrom(:,num_integer+1:Lind)=min(rep(variable_range(2,num_integer+1:Lind),[Nind 1]),NewChrom(:,num_integer+1:Lind));
end