public bool Execute() { ga.Crossover = new CustomCrossover(); ga.GenomeFactory = new CustomFactory(0, parameters.Questoes.Count - 1, parameters.QtdQuestoes); switch (parameters.Seletor) { case SeletorGA.Roleta: ga.Selector = new WeightedSelector(ga.Genomes); break; case SeletorGA.Sequencial: ga.Selector = new SequentialSelector(ga.Genomes); break; case SeletorGA.Randomico: ga.Selector = new RandomSelector(ga.Genomes); break; } ga.Crossover.CrossoverProbability = parameters.ProbabilidadeReproducao / 100.0; //0.3;0.2; ga.Crossover.MutationProbability = parameters.ProbabilidadeMutacao / 100.0; //0.015; ga.Elitism = parameters.HabilitaElitismo; ga.CustomObj = parameters.Questoes; if (OnGANewGeneration != null) { ga.NewGeneration += new GeneticAlgorithmEventHandler(this.OnNewGeneration); } if (OnGANewBestFitness != null) { ga.NewBestFitness += new GeneticAlgorithmGenomeEventHandler(this.OnNewBestFitness); } ga.QryBestFitness += new GeneticAlgorithmCancelEventHandler(this.OnQryBestFitness); ga.Evaluator = new CustomEvaluator(parameters); ga.CreateGenomes(9); ga.ExitConditions.Duration = TimeSpan.FromSeconds(parameters.MaxDuration); ga.ExitConditions.Generations = parameters.MaxGenerations; ga.ExitConditions.FitnessGoal = parameters.MinFitnessGoal; bestGenome = (CustomGenome)ga.Execute(); stopTime = DateTime.Now; exitCondiction = ga.ExitConditions.ExitCondiction; bestGenome.UpdateStat(parameters); return(true); }
public void OnNewBestFitness(GeneticAlgorithm sender, GenomeEventArgs args) { CustomGenome genome = (CustomGenome)args.Genome; genome.UpdateStat(parameters); //int hash = genome.GetHashCode(); if (OnGANewBestFitness != null) { CustomGenomeEventArgs newArgs = new CustomGenomeEventArgs(); newArgs.Genome = genome; OnGANewBestFitness(this, newArgs); } }
public double Eval(Genome candidate) { CustomGenome genome = (CustomGenome)candidate; genome.UpdateStat(parameters); double ret = 0; ret += Math.Abs(genome.QtdTotal() - genome.Length) * 200; if (parameters.TempoPrevistoAvaliacao > 0) { ret += Math.Abs(genome.TempoTotal() - parameters.TempoPrevistoAvaliacao); } foreach (ConfigComplexidade rule in parameters.ComplexRules) { ret += Math.Abs(genome.ComplexTotal(rule.ComplexIni, rule.ComplexFim) - rule.Quantidade) * 100; } int tipoQuestao; foreach (ConfigTipoQuestao rule in parameters.TipoQuestaoRules) { tipoQuestao = (int)rule.TipoQuestao; ret += Math.Abs(genome.TipoTotal(tipoQuestao, tipoQuestao) - rule.Quantidade) * 100; } if (ret > (double)int.MaxValue) { ret = (double)int.MaxValue; } return((((double)int.MaxValue) - ret) / ((double)int.MaxValue) * 100.0); }