private async void ProcessarGeracao() { bool ret = false; Cursor.Current = Cursors.WaitCursor; ProcessGeneticAlgorithm pga = new ProcessGeneticAlgorithm(parametersGA); //pga.OnGANewGeneration += OnGANewGeneration; pga.OnGANewBestFitness += OnGANewBestFitness; btnParar.Visible = true; this.btnParar.Click += new System.EventHandler(delegate(object sender, EventArgs e) { pga.StopProcess(); }); startTime = DateTime.Now; Timer timer = new Timer(); timer.Interval = 100; timer.Tick += new EventHandler(timer_Tick); await Task.Run(() => { GerarListaDeQuestoes(); ret = parametersGA.Questoes.Count >= parametersGA.QtdQuestoes; }); txtQtdQuestoesDisponiveis.Text = parametersGA.Questoes.Count.ToString("#,##0", CultureInfo.CurrentCulture); if (!ret) { ShowAlerta("Não há questões disponíveis para atender a quantidade de questões solicitada para a avaliação!"); } if (ret) { timer.Start(); await Task.Run(() => { ret = pga.Execute(); }); timer.Stop(); AtualizaTempoProcessamento(); } btnParar.Visible = false; if (ret) { StringBuilder sb = new StringBuilder(); sb.Append(@"{\rtf1\ansi"); sb.Append(@"\ansicpg1252\deff0\deflang1033"); sb.Append(@"{\fonttbl{\f0\fnil\fcharset0 Courier New;}}"); sb.Append(@"{\colortbl;\red255\green0\blue0;\red0\green255\blue0;\red0\green0\blue255; }"); sb.Append("Quantidade de gerações: ").Append(@"\b ").Append(pga.GenerationCount.ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ").Append(@" \line "); sb.Append("Tempo de Processamento (Segs.): ").Append(@"\b ").Append(pga.ElapTimeSeconds.ToString()).Append(@"\b0 ").Append(@" \line "); sb.Append("Tipo de Finalização: ").Append(@"\b ").Append(pga.ExitCondiction.ToString()).Append(@"\b0 ").Append(@" \line "); sb.Append("Fitness: ").Append(@"\b ").Append(pga.BestGenome.Fitness.ToString()).Append(@"\b0").Append(@" \line "); sb.Append("Geração: ").Append(@"\b ").Append(pga.BestGenome.Generation.ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ").Append(@" \line "); //sb.Append("Hashcode: ").Append(pga.BestGenome.GetHashCode().ToString()).Append(@" \line "); sb.Append("Quantidade de Questões: ").Append(@"\b ").Append(pga.BestGenome.QtdTotal().ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 "); if (pga.BestGenome.QtdTotal() != parametersGA.QtdQuestoes) { sb.Append(@"\b ").Append(@"\cf1 ").Append(" <= Incorreto (Solicitado ").Append(parametersGA.QtdQuestoes.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 ").Append(@"\cf0"); ret = false; } sb.Append(@" \line "); sb.Append("Status:\t").Append(@"\b "); if (ret) { sb.Append(@"\b ").Append("Gravação da Avaliação Permitida").Append(@"\b0 ").Append(@" \line "); } else { sb.Append(@"\b ").Append(@"\cf1").Append("Impossível Gravar Avaliação").Append(@"\b0 ").Append(@"\cf0").Append(@" \line "); } sb.Append("Tempo Total das Questões: ").Append(@"\b ").Append(pga.BestGenome.TempoTotal().ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 "); if (parametersGA.TempoPrevistoAvaliacao != 0 && pga.BestGenome.TempoTotal() != parametersGA.TempoPrevistoAvaliacao) { sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(parametersGA.TempoPrevistoAvaliacao.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 "); } sb.Append(@" \line "); sb.Append(@" \line "); List <ConfigTipoQuestao> tipoQuestaoRules = new List <ConfigTipoQuestao>(parametersGA.TipoQuestaoRules); ConfigTipoQuestao cqr; sb.Append("Quantidades por Tipo:").Append(@" \line "); sb.Append("\t").Append(TipoDeQuestao.Discursiva.ToString()).Append(":\t\t").Append(@"\b ").Append(pga.BestGenome.TipoTotal((int)TipoDeQuestao.Discursiva, (int)TipoDeQuestao.Discursiva).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 "); cqr = tipoQuestaoRules.Find(x => x.TipoQuestao == TipoDeQuestao.Discursiva); if (cqr != null && pga.BestGenome.TipoTotal((int)TipoDeQuestao.Discursiva, (int)TipoDeQuestao.Discursiva) != cqr.Quantidade) { sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(cqr.Quantidade.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 "); } sb.Append(@" \line "); sb.Append("\t").Append(TipoDeQuestao.EscolhaSimples.ToString()).Append(":\t").Append(@"\b ").Append(pga.BestGenome.TipoTotal((int)TipoDeQuestao.EscolhaSimples, (int)TipoDeQuestao.EscolhaSimples).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 "); cqr = tipoQuestaoRules.Find(x => x.TipoQuestao == TipoDeQuestao.EscolhaSimples); if (cqr != null && pga.BestGenome.TipoTotal((int)TipoDeQuestao.EscolhaSimples, (int)TipoDeQuestao.EscolhaSimples) != cqr.Quantidade) { sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(cqr.Quantidade.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 "); } sb.Append(@" \line "); sb.Append("\t").Append(TipoDeQuestao.MultiplaEscolha.ToString()).Append(":\t").Append(@"\b ").Append(pga.BestGenome.TipoTotal((int)TipoDeQuestao.MultiplaEscolha, (int)TipoDeQuestao.MultiplaEscolha).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 "); cqr = tipoQuestaoRules.Find(x => x.TipoQuestao == TipoDeQuestao.MultiplaEscolha); if (cqr != null && pga.BestGenome.TipoTotal((int)TipoDeQuestao.MultiplaEscolha, (int)TipoDeQuestao.MultiplaEscolha) != cqr.Quantidade) { sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(cqr.Quantidade.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 "); } sb.Append(@" \line "); sb.Append("\t").Append(TipoDeQuestao.ListaDeAssociacao.ToString()).Append(":\t").Append(@"\b ").Append(pga.BestGenome.TipoTotal((int)TipoDeQuestao.ListaDeAssociacao, (int)TipoDeQuestao.ListaDeAssociacao).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 "); cqr = tipoQuestaoRules.Find(x => x.TipoQuestao == TipoDeQuestao.ListaDeAssociacao); if (cqr != null && pga.BestGenome.TipoTotal((int)TipoDeQuestao.ListaDeAssociacao, (int)TipoDeQuestao.ListaDeAssociacao) != cqr.Quantidade) { sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(cqr.Quantidade.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 "); } sb.Append(@" \line "); sb.Append(@" \line "); if (parametersGA.ComplexRules.Length > 0) { sb.Append("Quantidades por regra de Complexidade:").Append(@" \line "); foreach (ConfigComplexidade c in parametersGA.ComplexRules) { sb.Append("\tComplexidade ").Append(c.ComplexIni.ToString()).Append(" a ").Append(c.ComplexFim.ToString()).Append(":\t").Append(@"\b ").Append(pga.BestGenome.ComplexTotal(c.ComplexIni, c.ComplexFim).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 "); if (pga.BestGenome.ComplexTotal(c.ComplexIni, c.ComplexFim) != c.Quantidade) { sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(c.Quantidade.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 "); } sb.Append(@" \line "); } sb.Append(@" \line "); } sb.Append("Quantidades por Complexidade:").Append(@" \line "); for (int i = 1; i <= 10; i++) { sb.Append("\tComplexidade ").Append(i.ToString()).Append(":\t").Append(@"\b ").Append(pga.BestGenome.ComplexTotal(i, i).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ").Append(@" \line "); } sb.Append(@" \line "); sb.Append("IDs das Questões:").Append(@" \line "); sb.Append(pga.BestGenome.ToString().Replace("|", ", ")).Append(@" \line "); sb.Append(" }"); rtxResultado.Rtf = sb.ToString(); } else { rtxResultado.Text = "Houve erro na geração da Avaliação."; } if (pga.BestGenome != null) { questoes = new List <int>(pga.BestGenome.IdsQuestoes()); } else { questoes = new List <int>(); } btnFechar.Enabled = true; btnGravar.Enabled = ret; Cursor.Current = Cursors.Default; }