private void checarSolucoes() { double avaliacao; piorAvaliacao = melhorAvaliacao = formigas[0].getAvaliacao(); for (Formiga formiga : formigas) { avaliacao = formiga.getAvaliacao(); if (melhorAvaliacao > avaliacao) { melhorAvaliacao = avaliacao; melhorSolucao = formiga.exibirCaminho(); } if (piorAvaliacao < avaliacao) { piorAvaliacao = avaliacao; piorSolucao = formiga.exibirCaminho(); } } }
private void atualizarFeromonio() { int tam = taxaFeromonio.length; double q = estrategia.getQ(); double qtdFeromDepositar, avaliacao; for (int i = 0; i < tam; i++) { qtdFeromDepositar = .0; for (Formiga formiga : formigas) { if (formiga.comtemNoVisitado(i) == true) { avaliacao = formiga.getAvaliacao(); qtdFeromDepositar += q / (avaliacao == 0 ? 1 : avaliacao); } } taxaFeromonio[i] += qtdFeromDepositar; } }
private void construirSolucao() { int numCelulas = estrategia.getNumCelulas(); int numTransicoes = estrategia.getNumTransicoes(); double alfa = estrategia.getAlpha(); for (Formiga formiga : formigas) { iniciarFormiga(formiga); List<Integer> nosVizinhos = formiga.getNosVizinhos(); int numNos = nosVizinhos.size(); int indice = 0; int j = 0; for (int z = 1; z < numTransicoes; z++) { double probTransTotal = .0; for (j = 0; j < numNos; j++) { indice = nosVizinhos.get(j).intValue(); if (formiga.comtemNoVisitado(indice) == false) { if (taxaFeromonio[indice] >= 0) { probTransTotal += Math.pow(taxaFeromonio[indice], alfa); } } } for (j = 0; j < numNos; j++) { indice = nosVizinhos.get(j).intValue(); if (formiga.comtemNoVisitado(indice) == false) { if (taxaFeromonio[indice] >= 0) { probTransicaoNo[indice] = Math.pow(taxaFeromonio[indice], alfa) / probTransTotal; } else { probTransicaoNo[indice] = .0; } } else { probTransicaoNo[indice] = .0; } } // Roleta double roleta = Math.random(); double maior = .0; double menor = .0; for (j = 0; j < numNos; j++) { indice = nosVizinhos.get(j).intValue(); if (formiga.comtemNoVisitado(indice) == false) { maior += probTransicaoNo[indice]; if (roleta >= menor && roleta <= maior) { formiga.adicionarNoVisitado(indice); probTransicaoNo[indice] = .0; break; } else { menor = maior; } } } } } }
// Integrar avaliação com estrategia do testador private void avaliarSolucoes() { double total = .0; for (Formiga formiga : formigas) { Iterator<Integer> it = formiga.getNosVisitados().iterator(); int no; int soma = 0; while (it.hasNext()) { no = it.next().intValue(); soma += no; } formiga.setAvaliacao(soma); total += soma; } this.media = total / formigas.length; for (Formiga formiga : formigas) { formiga.setAvaliacao(Math.abs(formiga.getAvaliacao() - media)); } }
private void iniciarFormiga(Formiga formiga) { int numCelulas = estrategia.getNumCelulas(); int celulaAleatoria = obterNumeroAleatorio(numCelulas - 1); Integer celula = new Integer(celulaAleatoria); formiga.adicionarNoVisitado(celula); }
private void resetarFormigas() { for (Formiga formiga : formigas) { formiga.setAvaliacao(.0); formiga.resetarSolucao(); } }