Main function - gpols_mainloop.m

Syntax:
[newpopu,evnum] = gpols_mainloop(popu,X,Y,Q,opt);

 newpopu Structure (population) New generation of population
 evnum Scalar integer Number of function evaulations
 popu Structure (population) Population
 X Matrix of reals (np x nr) Input data for evaluation
 Y Vector of reals (np x 1) Output data for evaluation
 Q Vector of reals (np x 1) Optional weighting vector for X and Y
 opt Vector (1x10 or 10x1) Options vector


This function execute one evolutionary-loop and generates the next generation of population.

The user should call this function iteratively.

The popu is the population variable, which contains the individuals of current generation.

The X, Y, and Q are the regression matrix, output vector and weighting vector, respectively (see gpols_evaluation).

The opt contains the options:
opt(1): ggap, generation gap (0-1)
opt(2): pc, probability of crossover (0-1)
opt(3): pm, probability of mutation (0-1)
opt(4): sels, selection mode (0: roulette wheel, 1: total random, 2,3,..: tournament selection (with tournament size = sels)
opt(5): rmode, mode of tree-recombination (1 or 2)
opt(6): a1, first penalty parameter (default = 0)
opt(7): a2, second penalty parameter (default = 0)
opt(8): OLS threshold value (default = 0)
opt(9): if 1: polynomial evaluation, else normal evaluation (default = 0)
opt(10): if 1: always evaluate all individuals, else evaluate only new individuals (default = 0)


Example:

%Regression matrix
ndata = 100; 
nvar = 3; 
X = rand(ndata,nvar); 
%Output vector (y = 10*x1*x2+5*x3) 
Y = 10*X(:,1).*X(:,2) + 5*X(:,3); 
Y = Y + randn(size(Y))*0.01; %some 'measurement' noise 
%GP equation symbols 
symbols{1} = {'+','*'}; 
symbols{2} = {'x1','x2','x3'}; %length(symbols{2}) = size(X,2) ! 
%Initial population 
popusize = 40; 
maxtreedepth = 5; 
popu = gpols_init(popusize,maxtreedepth,symbols); 
%First evaluation 
opt = [0.8 0.7 0.3 2 1 0.2 30 0.05 0 0]; 
popu = gpols_evaluate(popu,[1:popusize],X,Y,[],opt(6:9)); 
%info 
disp(gpols_result([],0)); 
disp(gpols_result(popu,1)); 
%GP loops 
for c = 2:20, 
  %iterate 
  popu = gpols_mainloop(popu,X,Y,[],opt); 
  %info 
  disp(gpols_result(popu,1)); 
end 
%Result 
[s,tree] = gpols_result(popu,2); 
disp(s);