function sons = cruzamento(father,mother,flag)
% FUNÇÃO CRUZAMENTO - gera um filho a partir de um papai e uma mamãe
% 		sons = cruzamento(father,mother,flag)
% onde:
%		  father - codificação binária do papai	
%		  mother - codificação binária da mamãe	
%		  flag (opcional) - tipo de cruzamento ocorrido
%						1 - (default) cruzamento simples
%						2 - cruzamento entre filhos
%						3 - cruzamento em múltiplos pontos
% 		  sons - dois filhos gerados
%
% Marcelo Farenzena
% 11 / 2004

if nargin < 2
   disp('O algoritmo não aceita partenogenese!')	
   break
end

if size(father,2) ~= size(mother,2)
   disp('Pai e mãe são de espécies diferentes!')
   break
end

if size(father,2) < 2
   break
end

if nargin == 2
	flag = 1;   
end

nb = length(father); 	% número de gens do papai

switch flag
case 1  % cruzamento simples
   pc = ceil((nb-1)*rand(1));					    % seleção do ponto de corte
   sons(1,:) = strcat(father(1:pc), mother(pc+1:end));  % filho 1: coisa linda da mamãe 
   sons(2,:) = strcat(mother(1:pc), father(pc+1:end));  % filho 2: coisa linda da vovó
case 2  % cruzamento entre filhos
   pc = ceil((nb-1)*rand(1));					    % seleção do ponto de corte para primeira geração
   sons(1,:) = strcat(father(1:pc), mother(pc+1:end));  % filho 1: logo será pai
   sons(2,:) = strcat(mother(1:pc), father(pc+1:end));  % filho 2: logo será mãe
   
   father = sons(1,:); % novo pai
   mother = sons(2,:); % nova mãe
   
   pc = ceil((nb-1)*rand(1));					    % seleção do ponto de corte
   sons(1,:) = strcat(father(1:pc), mother(pc+1:end));  % filho 1: coisa linda da mamãe 
   sons(2,:) = strcat(mother(1:pc), father(pc+1:end));  % filho 2: coisa linda da vovó        
case 3
   ngt = ceil(nb*rand(1));			% número de genes trocados
   vgt = ceil(nb*rand(1,ngt));	% vetor de genes trocados
   sons(1,:) = father;   
   sons(2,:) = mother;
   sons(1,vgt) = mother(vgt);
   sons(2,vgt) = father(vgt);   
end



