function GACerveza(HORASC,NGENER,storehowoften)

% GACERVEZA Runs the GA for solving the beer problem
%
% GaCerveza(HORASC,NGENER,storehowoften)
%    HORASC: Number of hours of the whole process (such as 150)
%    NGENER: Number of generations of the genetic algorithm
%    storehowoften: steptime used to save the data in the files
%                   results_HORASC_step

% APRENDIZAJE AUTOMÁTICO (G. Pajares y J. M. de la Cruz, Eds.)
% Editorial: RA-MA
% Capítulo 9: El Aprendizaje con Algoritmos Genéticos
% Autores: Bonifacio de Andres y Toro


if ~exist('is_new')
    warning('You need to instal the freeware EVOCOM toolbox (http://www.dacya.ucm.es/evocom) to be able to run this program');
    return;
end


DIBUJAR=0;


SEED=sum(clock*100);

TGEN=1 ; %1 hora cada intervalo.
NPOBL=20;          
NSUBT=8;
NGENES=HORASC+1;   %El numero de genes es el numero de horas + 1

SALTOSUPER=20;  
NPCRUCE=2; %antes habia 2   
CRUCE=0.8;       
MUTA=0.008;            

TGEN=1;
HORAS=(NGENES-1)*TGEN;
Ti=10;   
Tf=17; 
Tinit=10;

SALTO=[2 2 1.5 1.5 1, repmat([1.0 .5 .3 .2 .2 .1 .1 .2 .2 .3 .5],1,ceil(NGENER/SALTOSUPER))];


ind_str=is_new(1);
ind_str=is_set(ind_str,'gen_number',NGENES);
ind_str=is_set(ind_str,'fungen','gen_cerveza');
ind_str=is_set(ind_str,'paramgen',{[Ti,Tf],Tinit});
ind_str=is_set(ind_str,'funeval','gev_equal');
ind_str=is_set(ind_str,'parameval',[]);
ind_str=is_set(ind_str,'funrepair','repair_cerveza');
ind_str=is_set(ind_str,'paramrepair',{[Ti,Tf],Tinit});

obj_str=objs_new(1);
obj_str=objs_set(obj_str,'proce_cerveza',HORAS,1,1);

gas_str=gas_new(length(ind_str),sum(cell2mat(objs_fields(obj_str,3))),2);

gas_str=gas_set(gas_str,'number','popinit',NPOBL);
gas_str=gas_set(gas_str,'number','parents',NSUBT);
gas_str=gas_set(gas_str,'number','ninmigrant',2);


gas_str=gas_set(gas_str,'fitness','obj','max');
gas_str=gas_set(gas_str,'fitness','fitfun','fit_ranklinear');
gas_str=gas_set(gas_str,'fitness','fitparam',.8);

gas_str=gas_set(gas_str,'selec','fun','sel_roulette');

gas_str=gas_set(gas_str,'cross','prob',CRUCE);
gas_str=gas_set(gas_str,'cross','pointparam',NPCRUCE);

gas_str=gas_set(gas_str,'mut','selgenesparam',MUTA);


gas_str=gas_set(gas_str,'recombine','fun','rec_elitism');
gas_str=gas_set(gas_str,'recombine','param',2);

gas_str=gas_set(gas_str,'stop','param',NGENER);

gas_str=gas_set(gas_str,'change','fun','ga_mut');
param=param_new(4);
param=param_set(param,gas_get(gas_str,'mut','selgenesfun'),1);
param=param_set(param,0.08,2);
param=param_set(param,gas_get(gas_str,'mut','new_valuefun'),3);
param=param_set(param,gas_get(gas_str,'mut','new_valueparam'),4);
gas_str=gas_set(gas_str,'change','param',param);

if DIBUJAR
	gas_str=gas_set(gas_str,'show','fun','show_bestn',1);
	gas_str=gas_set(gas_str,'show','param',1,1);
	gas_str=gas_set(gas_str,'show','fun','show_cerveza',2);
	gas_str=gas_set(gas_str,'show','param',1,2);
end

gas_str=gas_set(gas_str,'store','fun','store_savebestn');
gas_str=gas_set(gas_str,'store','param',{1,storehowoften,sprintf('results_%d',HORASC)});

gas_str=gas_set(gas_str,'super','fun','super_profile');
gas_str=gas_set(gas_str,'super','param',SALTO);
gas_str=gas_set(gas_str,'super','step',SALTOSUPER);
gas_str=gas_set(gas_str,'super','howmany',1);

[gen,chrom,value,fitness]=ga_algorithm(ind_str,gas_str,obj_str,SEED);


