% function itereticAlgorithm(afloat,Qahat,fidlog)
tic
load small.mat
% load sixdim.mat
global afloat
global Qahat
global range
afloat = a;
Qahat = Q;
fidlog = fopen('AGA.log','wt')
%% 模糊度去相关
% increment = afloat - rem(afloat,1); %模糊度的整数部分,
% afloat = rem(afloat,1); %考虑到大小,为了防止整数溢出有发生,原始模糊度大小被减为-1~1
% %% 也可以考虑没有去除整数部分的计算
% [Qzhat,L,D,Z,zfloat] = Decorrelation(Qahat,afloat,fidlog);
% Qahat = Qzhat;
% afloat = zfloat;
%%
% 确定每一个模糊度的染色体编码所需的二进制位数
baseline = 1; % 基线长度,用于确定模糊度搜索范围
lambda_L1 = 0.01903; % 波长
range = round( baseline/lambda_L1 );
ranges = 2*range+1;
bits = 0;
while 1
if ( 2^(bits - 1) < ranges ) && ( 2^bits > ranges)
break;
else
bits = bits+1;
end
end
n = size(Qahat,2); %模糊度的个数
chromlength = n*bits; % 染色体长度
%% 遗传算法参数配置
popsize = 10; % 种群大小
iterations = 300; % 最大世代数
maxruns = 1; % 遗传算法总的运行次数
%% 自适应遗传算法参数
pc1 = 0.9;
pc2 = 0.6;
pm1 = 0.1;
pm2 = 0.001;
fprintf(fidlog,'\n');
fprintf(fidlog,' 自适应遗传算法参数\n');
fprintf(fidlog,'----------------------------------------------------------------\n');
fprintf(fidlog,' 种群大小(popsize) = %d\n',popsize);
fprintf(fidlog,' 染色体长度(chromlength) = %d\n',chromlength);
fprintf(fidlog,' 最大迭代数(iterations) = %d\n',iterations);
fprintf(fidlog,' 交叉概率(pc1 and pc2) = %d,%d\n',pc1,pc2);
fprintf(fidlog,' 变异概率(pm1 and pm2) = %d,%d\n',pm1,pm2);
fprintf(fidlog,'-----------------------------------------------------------------\n');
time = zeros(iterations);
min_fitness = zeros(iterations);
max_fitness = zeros(iterations);
avg_fitness = zeros(iterations);
best_JN = zeros(iterations);
best_fitness = zeros(iterations);
new_population = zeros(popsize,chromlength);
for run = 1:1:maxruns
% 初始化
population = initial_population(popsize,chromlength);
writechrom(fidlog,'初始化种群',population);
% 遗传迭代
for iter = 1:1:iterations
time(iter) = iter;
% 遗传迭代
fprintf(fidlog,'\n第%d/%d次运行:当前代为%d,共%d代',run,maxruns,iter,iterations);
% 计算适应度值 fitness = b-log10(JN);
[ambiguity,FN,fitness] = calculate_fitness(population,fidlog);
% writematrix(fidlog,'对应的整数模糊度',ambiguity);
% writematrix(fidlog,'对应的目标函数值',FN);
% writematrix(fidlog,'对应的适应度值',fitness);
%% *************Step1:评估最佳适应度***************
% 最小适应度
min_fitness(iter) = min(fitness); writematrix(fidlog,'min_fitness',min_fitness(iter));
% 最大适应度
max_fitness(iter) = max(fitness); writematrix(fidlog,'max_fitness',max_fitness(iter));
% 平均适应度
avg_fitness(iter) = mean(fitness); writematrix(fidlog,'avg_fitness',avg_fitness(iter));
% 目标函数最小:J(N)=(N-N^)t*Q^(-1)*(N-N^) = min
% 最佳的个体保留, 并替代最不好的个体
[min_JN,index_min_JN] = min(FN); % N make J(N)=(N-N^)t*Q^(-1)*(N-N^) minimum
% writematrix(fidlog,'本次迭代最小的J(N)',min_JN);
best_individual = population(index_min_JN,:);
writechrom(fidlog,'本次迭代最佳个体(满足J(N)最小)',best_individual);
% 最差个体,本次迭代后用最佳的个体替代
[max_JN,index_max_JN] = max(FN);
% writematrix(fidlog,'本次迭代最大的J(N)',max_JN);
worst_individual = population(index_max_JN,:);
% writechrom(fidlog,'本次迭代最差个体(满足J(N)最大)',worst_individual);
%% 从种群中去除掉 最佳个体(保留)和 最差个体(被替换)
index = [1:popsize];
index(index_max_JN) = 0;
index(index_min_JN) = 0;
index = nonzeros(index); % 去除了最佳个体和最差个体
new_population = population(index,:); % 剩余的个体
new_fitness = fitness(index,:); % 剩余的个体适应度
new_pop_size = popsize-2; % 剩余种群大小
%% *************Step2: 选择复制 ***************
new_population = AGA_selection(new_population,new_fitness);
% new_population(1,:) = best_individual;
% writechrom(fidlog,'选择复制操作后的种群',new_population);
%% *************Step2: 交叉 ***************
new_population = AGA_crossover(new_population,pc1,pc2,fidlog);
% new_population(1,:) = best_individual; % 最佳个体保留
% writechrom(fidlog,'交叉操作后的种群',new_population);
%
% %% *************Step3: 变异 ***************
new_population = AGA_mutation(new_population,pm1,pm2,fidlog);
% new_population(1,:) = best_individual; % 最佳个体保留
% writechrom(fidlog,'变异操作后的种群',new_population);
%
%% 种群更新一代
population(3:popsize,:) = new_population(1:new_pop_size,:);
population(1,:) = best_individual; % 最佳个体保留
population(2,:) = best_individual; % 最差个体替换
% writechrom(fidlog,'种群更新一代后',population);
end
% figure
% plot(time,max_fitness,'-^r',time,min_fitness,'-b*',time,avg_fitness,'-dg');
% % xlabel('Iteration');
% % ylabel('Fitness');
% % title('Adaptive Genetic Algorithm');
% xlabel('迭代次数');
% ylabel('适应度函数值');
% title('自适应遗传算法');
% legend('max','min','avg','Location','Best');
end
toc