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