import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import catolica.ia.ser.Populacao;
public class Ag {
public static void main(String[] args) {
File arquivo = new File("resultado.txt");
FileWriter fr = null;
try {
fr = new FileWriter(arquivo);
System.out.println("Inicio do experimento! (processando...) ");
Populacao p = new Populacao(100);
for (int i = 0; i < 25; i++) { fr.write("geracao: " + i + "\n"); p.novaGeracao(0.10, 0.01); fr.write(p.toString()); } System.out.println("fim do experimento!"); fr.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } Populacao.java package catolica.ia.ser; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /** * Esta classe tem o objetivo de prover a abstração necessaria para o * funcionamento de uma populacao de individuos. * * @author Daniel Gatis Carrazzoni * */ public class Populacao { private Collection
private int tamanho;
/**
* construtor.
*
* @param tamanho
* tamanho da populacao.
*/
public Populacao(int tamanho) {
this.tamanho = tamanho;
individuos = new ArrayList
initPopulacao(tamanho);
}
/**
* inicializa populacao.
*
* @param tamanho
* tamanho da populacao.
*/
private void initPopulacao(int tamanho) {
for (int i = 0; i < tamanho; i++) { individuos.add(new Individuo()); } } /** * cria uma nova geração da população. * * @param taxaDeCruzamento * taxa de cruzamento. * @param taxaDeMutacao * taxa de mutacao. */ public void novaGeracao(double taxaDeCruzamento, double taxaDeMutacao) { int iteracoes = (int)(taxaDeCruzamento * tamanho); for (int i = 0; i < iteracoes; i++) { addIndividuo(getCasal().cruzar(taxaDeMutacao)); } } /** * adiciona um individuo na população. caso o individuo a ser adicionado * seja um mutante ele é colocado no lugar do individuo de menor fitness da * populacao. caso a individuo não seja mutante só adiciona se o fitness do * individuo seja maior que o menor fitness da populacao. * * @param individuo novo individuo. */ private void addIndividuo(Individuo individuo) { double menorFit = Integer.MAX_VALUE; int indiceASubstituir = 0; Individuo[] temp = new Individuo[tamanho]; individuos.toArray(temp); for (int i = 0; i < temp.length; i++) { if (temp[i].getFitness() <= menorFit) { indiceASubstituir = i; menorFit = temp[i].getFitness(); } } if (individuo.isMutante()) { individuos.remove(temp[indiceASubstituir]); individuos.add(individuo); } else { if (temp[indiceASubstituir].getFitness() < individuo.getFitness()) { individuos.remove(temp[indiceASubstituir]); individuos.add(individuo); } } } /** * seleciona um casal apto ao cruzamento. * @return casal. */ private Casal getCasal() { Individuo pai = selecionar(); Individuo mae; do { mae = selecionar(); } while (pai.equals(mae)); return new Casal(pai, mae); } /** * selecao baseada no metodo da roleta. * @return o individuo selecionado. */ private Individuo selecionar() { double somatorioDosFitness = 0; double fitnessAcumulado = 0; Individuo retorno = null; Collection





















