%左端点:a
%右端点:b
%种群规模:population_size
%遗传代数:number_of_generation
%步长(精度):step_length
%交叉概率(crossover probability):pc
%变异概率(mutation probability):pm
%进化代数:number_of_evolution
%----------初始化--------%
clear;
global a;
global b;
global bitlength;
format long;
a=0;
b=10;
population_size=20000;
step_length=0.000001;
pc=0.5;
pm=0.5;
number_of_evolution=100;
bitlength=ceil(log2((b-a)/step_length));
population_matrix=round(rand(population_size,bitlength))
[fit_value,c_probability]=fitness(population_matrix);
for w=1:number_of_evolution
%----------------复制操作---------------%
% for i=1:population_size
% p=rand();
% for j=1:population_size
% if c_probability(j)<=p
% continue;
% end
% k=j;
% break;
% end
% population_matrix(i,:)=population_matrix(j,:);
% end
%----------------交叉预备操作---------------%
N=round(pc*population_size);
if rem(N,2)~=0%往交叉数增大方向取进行交叉的数目
N=N+1;
end
for i=1:N %选择进行交叉的染色体
s=rand()*population_size;
s=round(s+0.5);%对选中的染色体编号期望值进行校正,以实现所有染色体被选中的概率完全一样
seletion(i,:)=population_matrix(s,:);
s_row(i)=s;
end
for i=1:(N/2)
s=rand()*(bitlength-1);%进行交叉位点的期望值
s=round(s+0.5);%对交叉位点期望值进行校正,以实现所有交叉点被选中的概率完全一样
sss(i)=s;
end
%----------------交叉操作---------------%
for i=1:size(sss,2)%i从1到ss的列数,即交叉点位个数之间遍历
s=seletion(2*i-1,(sss(i)+1):bitlength);%1号交叉点位对应seletion中1、2行,2号交叉点位对应seletion中3、4行,用2*i-1与2*i与i对应。s是交换数据时的中介。该行将seletion的2*i-1行中,ss(i)+1到bitlength间(即从交叉点到最后)的数据送入中间变量s
seletion(2*i-1,(sss(i)+1):bitlength)=seletion(2*i,(sss(i)+1):bitlength);%将seletion中2*i行的ss(i)+1到bitlength间(即从交叉点到最后)的数据送入seletion中2*i-1行中的对应位置
seletion(2*i,(sss(i)+1):bitlength)=s;%将中介s中的存的seletion中2*i-1号染色体中的数据,传递给seletion的2*i行中(都是对应位置)
newseletion(2*i-1,:)=seletion(2*i-1,:);%将交叉好后的2*i-1号染色体依次送入新的变量newseletion中
newseletion(2*i,:)=seletion(2*i,:);%将交叉好后的2*i号染色体依次送入新的变量newseletion中
end
for i=1:size(s_row,2)%i从1到取出进行交叉的染色体个数之间遍历
population_matrix(s_row(i),:)=newseletion(i,:);%将交叉后的染色体恢复原位
end
%----------------变异预备操作---------------%
mutation_number=round(size(population_matrix,1)*size(population_matrix,2)*pm);
for i=1:mutation_number
mutation_row(i)=round(rand()*population_size+0.5);
mutation_column(i)=round(rand()*bitlength+0.5);
population_matrix(mutation_row(i), mutation_column(i))=~population_matrix(mutation_row(i), mutation_column(i));
end
[fit_value,c_probability]=fitness(population_matrix);
ww(w)=w;
fitfit_value(w)=max(fit_value);
w
end
plot(ww,fitfit_value)
xlabel('进化代数');
ylabel('适应值度值');
result=max(fit_value)
评论0