#region License Information /* HeuristicLab * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Optimization; using HeuristicLab.Optimization.Operators; using HeuristicLab.Parameters; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers { [Item("AfterMutationCombinedOperator", "An operator that contains all operators that need to be executed after mutation.")] [StorableClass] public class AfterMutationCombinedOperator : CombinedOperator { public ILookupParameter EvaluatorParameter { get { return ((LookupParameter)Parameters["Evaluator"]); } } public IValueParameter SimilarityCalculatorParameter { get { return (IValueParameter)Parameters["SimilarityCalculator"]; } } public ValueParameter UpdateIntervalParameter { get { return (ValueParameter)Parameters["UpdateInterval"]; } } public ILookupParameter GenerationsParameter { get { return (ILookupParameter)Parameters["Generations"]; } } [Storable] protected MutationPerformanceAnalyzer mAnalyzer; [Storable] protected VariableRemover varRemover; [Storable] protected IEvaluator evaluatorClone; [Storable] protected SolutionToPopulationAnalyzer solToPopAnalyzer; [StorableConstructor] protected AfterMutationCombinedOperator(bool deserializing) : base(deserializing) { } protected AfterMutationCombinedOperator(AfterMutationCombinedOperator original, Cloner cloner) : base(original, cloner) { mAnalyzer = original.mAnalyzer != null ? (MutationPerformanceAnalyzer)original.mAnalyzer.Clone(cloner) : null; varRemover = original.varRemover != null ? (VariableRemover)original.varRemover.Clone(cloner) : null; solToPopAnalyzer = original.solToPopAnalyzer != null ? (SolutionToPopulationAnalyzer)original.solToPopAnalyzer.Clone(cloner) : null; } public AfterMutationCombinedOperator() : base() { Parameters.Add(new LookupParameter("Evaluator", "The operator which is used to evaluate new solutions.")); Parameters.Add(new ValueParameter("SimilarityCalculator")); Parameters.Add(new ValueParameter("UpdateInterval", "The interval in which the operator should be applied.", new IntValue(2))); Parameters.Add(new LookupParameter("Generations", "Nr of generations.")); SimilarityCalculatorParameter.ValueChanged += new System.EventHandler(SimilarityCalculatorParameter_ValueChanged); } protected virtual void SimilarityCalculatorParameter_ValueChanged(object sender, System.EventArgs e) { SimilarityCalculatorParameter.Value.QualityVariableName = "TSPTourLength"; SimilarityCalculatorParameter.Value.SolutionVariableName = "TSPTour"; } public override IDeepCloneable Clone(Cloner cloner) { return new AfterMutationCombinedOperator(this, cloner); } public override void InitializeOperators() { evaluatorClone = (IEvaluator)EvaluatorParameter.ActualValue.Clone(); ((ILookupParameter)evaluatorClone.Parameters["Quality"]).ActualName = "TSPTourLengthM"; mAnalyzer = new MutationPerformanceAnalyzer(); varRemover = new VariableRemover(); solToPopAnalyzer = new SolutionToPopulationAnalyzer(); solToPopAnalyzer.ChartPostfixParameter.Value = new Data.StringValue("after Mutation"); Operators.Add(evaluatorClone); Operators.Add(mAnalyzer); Operators.Add(varRemover); Operators.Add(solToPopAnalyzer); } public override IOperation Apply() { if (GenerationsParameter.ActualValue.Value % UpdateIntervalParameter.Value.Value == 0) { return base.Apply(); } else { return base.BaseApply(); } } } }