function GACerveza(TiempoLimit,NGENER,howoften)

% GACERVEZA Runs the GA for solving the beer problem
%
% GaCerveza(TiempoLimit,NGENER,storehowoften)
%
%    TiempoLimit: [Lower,Upper] number of hours (such as [100,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 have the EVOCOM Toolbox (http://www.dacya.ucm.es/evocom) installed to run this program');
    return;
end


DIBUJAR=0; % Poner a 0 si no se quiere ver los graficos


SEED=sum(clock*100);
%SEED=10;

NPOBL=20;          
NSUBT=8;
NGENES=[];   
NPCRUCE=1; %antes habia 2   
%TOPE=620;    
CRUCE=0.8;
MUTATEMP=0.008;      
MUTATIME=0.008;

Temperature=[10,17];   
TemperatureInit=10;
PasoTiempo=1;     	%Genes
PasoTiempoInt=0.1;	%Integrar
AnguloRepair=0.1*pi/180; %En radianes

SALTOSUPER=1;
SALTOSUPER2= 20;
SALTOSUPER1= 10;

SALTO2=[2.0 2.0,repmat([1.5 1.0 0.5 0.3 0.2 0.1 0.1],1,ceil(NGENER/SALTOSUPER))];
SALTO1=repmat([1.0 1.0 1.0 1.0],1,ceil(NGENER/SALTOSUPER));


%      J=	 [	EA		e		sumamulb		vdk		distancia		calor	 dcalor	time];
prior=       [   1  	1	   2	     		1			3					2			2     2];
lowgoal=     [-15, 	60,   -100,		  	-.2 ,	  - Inf	,	     -Inf ,   -Inf   ,-Inf];
upgoal=	    [Inf	, Inf,   -2,	  		Inf	 ,  	Inf	,  	Inf , 	Inf   ,Inf];


escalado=20;

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',{TiempoLimit,Temperature,PasoTiempo,TemperatureInit});
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',{Temperature,AnguloRepair,TemperatureInit});

obj_str=objs_new(1);
obj_str=objs_set(obj_str,'proce_cerveza',PasoTiempoInt,8,1);

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

gas_str=gas_set(gas_str,'coding','gen',1);
gas_str=gas_set(gas_str,'coding','chrom',1);

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_multigoalprior');
param=param_new(5);
param=param_set(param,prior,1);
param=param_set(param,lowgoal,2);
param=param_set(param,upgoal,3);
param=param_set(param,'Goldberg',4);
param=param_set(param,escalado,5);
gas_str=gas_set(gas_str,'fitness','fitparam',param);

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','pointfun','crosspoint_cervezafix');
gas_str=gas_set(gas_str,'cross','pointparam',NPCRUCE);
gas_str=gas_set(gas_str,'cross','crossfun','crossing_cerveza');

gas_str=gas_set(gas_str,'mut','selgenesfun','mutsel_cerveza');
gas_str=gas_set(gas_str,'mut','selgenesparam',{MUTATEMP,MUTATIME});
gas_str=gas_set(gas_str,'mut','new_valuefun','mutnew_cerveza');

%gas_str=gas_set(gas_str,'recombine','fun','rec_subgen');
%gas_str=gas_set(gas_str,'recombine','param',[]);
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,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);

gas_str=gas_set(gas_str,'store','fun','store_savebestn');
gas_str=gas_set(gas_str,'store','param',{1,howoften,'results'});

if DIBUJAR
   % para mostrar resultados cada xxx generaciones 
   gas_str=gas_set(gas_str,'show','fun','show_bestn',1);
   gas_str=gas_set(gas_str,'show','param',howoften,1);
   % para dibujar resultados cada xxx generaciones 
   gas_str=gas_set(gas_str,'show','fun','show_cerveza',2);
   gas_str=gas_set(gas_str,'show','param',howoften,2);
end

gas_str=gas_set(gas_str,'equal','fun','equal_vector');
gas_str=gas_set(gas_str,'compare','fun','comp_vector');

gas_str=gas_set(gas_str,'super','fun','super_cerveza');
gas_str=gas_set(gas_str,'super','param',{SALTO1,SALTOSUPER1,SALTO2,SALTOSUPER2});
gas_str=gas_set(gas_str,'super','step',SALTOSUPER);
gas_str=gas_set(gas_str,'super','howmany',1);
gas_str=gas_set(gas_str,'super','fixed',0);

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

%save(sprintf('jota%s',nombre),'valuet');
%save(sprintf('cromo%s',nombre),'chromt');
%save(sprintf('tiempo%s',nombre),'tiempot');

