📄 tree_ga2.m
字号:
% 注意: 必须先运行ga_ini来初始化参数
% 函数调用: pcincl.m, equ_gen3.m, opt_par.m, mutato3.m, x_over2.m,
% fit_fun2.m, strrem.m, strep2.m, fps.m, lin_seed, disp_res,
% permut.m
close all
clear p e1 e2 e3
a=0;
count=0;
results=[0 0 0];
% 设置随机数种子
rand('seed',sum(100*clock))
randn('seed',sum(100*clock))
% 初始化屏幕
% 清屏
main=figure('Number','Off',...
'Name','遗传算法GA For MATLAB',...
'Resize','off',...
'Units','Pixels',...
'Position',[2 2 636 455]);
drawnow;
ax1=axes(...
'Units','pixels',...
'Position',[60 270 520 130],...
'Box','on',...
'Color',[0 0 0],...
'Visible','on');
ax2=axes(...
'Units','pixels',...
'Position',[60 110 230 100],...
'Box','on',...
'Color',[0 0 0],...
'Visible','on');
ax3=axes(...
'Units','pixels',...
'Position',[350 110 230 100],...
'Box','on',...
'Color',[0 0 0],...
'Visible','on');
% 为调用ad_just2 初始化串
% 在群体选择之前最大的方案个数
% => pop_size
y_front='y_est(:,1)=';
colons=';';
for i=2:pop_size,
y_front=str2mat2(y_front,['y_est(:,' num2str(i) ')=']);
colons=str2mat2(colons,';');
end
% 设置输入(u) 输出(y)变量
[D L]=size(output_var);
for i = 1 : L
if output_var(i) == 1
y=data(:,i);
break;
end
end
% 输入数据矩阵赋值
u=pcincl(data,include_var,output_var);
[num_data,num_inp]=size(u);
stdy = std(y);
%用线性模型生成种子群体
lin_seed
[seed_num,xxx]=size(seed_pop);
seed_flag=1;
% 初始化输入
for i=1:num_inp,
eval(['u' num2str(i) '= u(:,' num2str(i) ');']);
end
%产生初始群体
if seed_flag==0
pop = equ_gen3(s_length,num_inp,equ_par,fun_set,num_fun_arg_set,user_def_fun);
pop=opt_par(pop,u,y,num_inp,options,time_out);
else
pop = seed_pop;
end
for i=seed_num+1:pop_size,
x2 = equ_gen3(s_length,num_inp,equ_par,fun_set,num_fun_arg_set, user_def_fun);
x2=opt_par(x2,u,y,num_inp,options,time_out);
pop = str2mat2(pop, x2);
end
% 绘图初始化
theta=[0 0]';
text3=ga_text(main,210,410,200,15,'0 - 代',[1 1 1],[0 0 0]);
text1=ga_text(main,20,35,600,15,'当前代最佳树:',[1 1 1],[1 0 0]);
text2=ga_text(main,20,20,600,15,'',[1 1 1],[1 0 0]);
text6=ga_text(main,20,2,145,15,'适应度:',[1 1 1],[1 0 0]);
text7=ga_text(main,165,2,145,15,'',[1 1 1],[1 0 0]);
text8=ga_text(main,300,2,145,15,'误差均方根:',[1 1 1],[1 0 0]);
text9=ga_text(main,435,2,185,15,'',[1 1 1],[1 0 0]);
MAX_FIT=[];
% 代循环
for i=1:num_gen,
[Q,R]=size(pop);
disp(['Generation ' num2str(i)])
% 确定每个个体(方程)在群体中的适应度
[fit,pop,mod_size,str_len]=fit_fun2(ffunc,pop,pop_size,u,y,num_data,num_inp,stdy,y_front,colons,snip_length);
[max_fit,max_fit_ind]=max(fit);
[min_fit,min_fit_ind]=min(fit);
set(text3,'string',[num2str(i) ' - 代']);
% 求出最佳串,并计算theta值
out=['y_e = ' pop(max_fit_ind,:) ';'];
% 去掉 '{', '}', '<1', '<2', '<3' and '>'
out=strrem(out);
out = strep2(out);
eval(out);
if ffunc=='ccf',
data=[y_e ones( num_data,1)];
theta=inv(data'*data)*data'*y;
y_est1=y_e;
y_p1=data*theta;
y_p=y_p1;
elseif ffunc=='mse',
y_p = y_e;
end
count = count +1;
drawnow;
a=fit(max_fit_ind);
if count >= presults,
% 显示结果
disp_res
count=0;
end
% 做存储间隔检查
if rem(i,dump_num) == 0,
if i==dump_num,
save_theta=theta';
save_pop=pop(max_fit_ind,:);
save_fit=a;
else
save_theta=[save_theta; theta'];
save_pop=str2mat2(save_pop,pop(max_fit_ind,:));
save_fit=[save_fit; a];
end
save save_pop save_theta save_pop save_fit
end
%确定下一代的大小
new_size=floor((1-p_old)*mod_size);
% 挑选遗传算子
new_pop=[];
j=0;
while j < new_size,
p_gen=rand(1);
if p_gen < p_mutate, % 转变
fps_num=fps(fit);
deblank_pop = deblank(pop(fps_num,:));
pop_mut = mutato3(deblank_pop,u,y,num_inp,p_c2u,mut_fun_wgt,...
mut_fun_set,mut_num_fun_arg_set,fun_name,num_fun_arg,user_def_fun,equ_par);
if strcmp(deblank(pop(fps_num,:)),pop_mut) == 0,
pop_mut=opt_par(pop_mut,u,y,num_inp,options,time_out);
end
j=j+1;
if j==1,
new_pop=pop_mut;
else
new_pop=str2mat2(new_pop,pop_mut);
end
elseif p_gen < p_mutate + p_cross, % 交叉
x_fps_num=fps(fit);
y_fps_num=fps(fit);
[xnew,ynew]=x_over2(deblank(pop(x_fps_num,:)),deblank(pop(y_fps_num,:)));
xnew=opt_par(xnew,u,y,num_inp,options,time_out);
ynew=opt_par(ynew,u,y,num_inp,options,time_out);
if j < new_size-1,
j=j+2;
if j==2,
new_pop=xnew;
new_pop=str2mat2(new_pop,ynew);
else
new_pop=str2mat2(new_pop,xnew,ynew);
end
else
j=j+1;
new_pop=str2mat2(new_pop,xnew);
end
elseif p_gen < p_mutate + p_cross + p_perm, % 转换
fps_num=fps(fit);
deblank_pop = deblank(pop(fps_num,:));
pop_perm = permut(deblank_pop,num_inp,fun_set,num_fun_arg_set,fun_name,...
num_fun_arg,user_def_fun);
if strcmp(deblank(pop(fps_num,:)),pop_perm) == 0,
pop_perm=opt_par(pop_perm,u,y,num_inp,options,time_out);
end
j=j+1;
if j==1,
new_pop=pop_perm;
else
new_pop=str2mat2(new_pop,pop_perm);
end
else % 直接再生
fps_num=fps(fit);
j=j+1;
if j==1,
new_pop=pop(fps_num,:)
else
new_pop=str2mat2(new_pop,pop(fps_num,:));
end
end
end
% 旧世代排序
sort_pop = pop;
sort_fit = fit;
for j=1:pop_size,
[max_fit,max_fit_ind]=max(sort_fit);
sort_pop(j,:) = pop(max_fit_ind,:);
sort_fit(max_fit_ind) = -inf;
end
% 旧世代存活成员加入
keep_pop=sort_pop(1:pop_size-new_size,:);
pop=str2mat(new_pop,keep_pop);
% 重新初始化检查
if rem(i,rein_num) == 0,
best_pop=keep_pop(1,:);
clear pop
pop=best_pop;
for j=2:pop_size,
x2 = equ_gen3(s_length,num_inp,equ_par,fun_set,num_fun_arg_set,user_def_fun)
x2=opt_par(x2,u,y,num_inp,options,time_out);
pop = str2mat2(pop, x2);
end
end
clear new_pop keep_pop
% 混合群体
pop=shuffle(pop);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -