public async Task Processar(CancellationToken token) { var temSolucao = false; var populacao = new Populacao(_algoritimo.NumeroDeGenes, _algoritimo.TamanhoDaPopulacao, _algoritimo.Inicio); await _servicoDePopulacao.CalculaAptidaoDaPopulacao(populacao); int?melhorAptidao = null; for (int i = 1; !temSolucao && i <= _algoritimo.MaximoDeGeracoes && !token.IsCancellationRequested; i++) { await _servicoDeAtualizacaoDeInterface.IncrementarGeracao(); populacao = await _servicoDePopulacao.NovaGeracao(populacao); var melhorIndividuoLocal = populacao.Individuos.OrderBy(x => x.Aptidao).FirstOrDefault(); await _servicoDeAtualizacaoDeInterface.DefinirMelhorAptidaoDaGeracao(melhorIndividuoLocal.Aptidao); await _servicoDeAtualizacaoDeInterface.DefineMelhorCaminhoDaGeracao(melhorIndividuoLocal.Genes); if (melhorIndividuoLocal.Localizacao == _algoritimo.Solucao) { temSolucao = true; } if (melhorAptidao >= melhorIndividuoLocal.Aptidao || melhorAptidao == null) { melhorAptidao = melhorIndividuoLocal.Aptidao; await _servicoDeAtualizacaoDeInterface.DefinirMelhorAptidaoGeral(melhorAptidao.Value); await _servicoDeAtualizacaoDeInterface.DefineMelhorCaminhoGeral(melhorIndividuoLocal.Genes); } } var melhorIndividuo = populacao.Individuos.OrderBy(x => x.Aptidao).FirstOrDefault(); if (_ponto != null) { await _ponto.DefinirLocalizacao(melhorIndividuo); await _servicoDeAtualizacaoDeInterface.DefinirMelhorAptidaoGeral(melhorIndividuo.Aptidao); await _servicoDeAtualizacaoDeInterface.DefineMelhorCaminhoGeral(melhorIndividuo.Genes); } if (!token.IsCancellationRequested) { await _servicoDeAtualizacaoDeInterface.FinalizaExecucao(); } }
public async Task CalcularAptidao(Individuo individuo) { int aptidao = -15; if (_ponto != null) { await _ponto.DefinirLocalizacao(individuo); } foreach (var movivento in individuo.Genes) { aptidao += await _servicoDeMovimentacaoDoIndividuo.Mover(individuo, movivento) + distanciaDaChegada[individuo.Localizacao]; } individuo.Aptidao = aptidao; }
public async Task <int> Mover(Individuo individuo, EnumeradorDeMovimentoDoIndividuo movimento) { var penalidade = _servicoDePenalidade.CalcularPenalidade(movimento, individuo.Localizacao); if (penalidade == EnumeradorDeResultadoDaMovimentacao.ForaDoLabirinto) { return(200); } if (penalidade == EnumeradorDeResultadoDaMovimentacao.AtravessaParede) { return(100); } int novoLocal; if (movimento == EnumeradorDeMovimentoDoIndividuo.N) { novoLocal = (int)individuo.Localizacao - 1; } else if (movimento == EnumeradorDeMovimentoDoIndividuo.S) { novoLocal = (int)individuo.Localizacao + 1; } else if (movimento == EnumeradorDeMovimentoDoIndividuo.L) { novoLocal = (int)individuo.Localizacao + 4; } else { novoLocal = (int)individuo.Localizacao - 4; } individuo.Localizacao = (EnumeradorDeLocalizacaoDoIndividuo)novoLocal; if (_ponto != null) { await _ponto.DefinirLocalizacao(individuo); } return(0); }