#region License Information /* HeuristicLab * Copyright (C) 2002-2014 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 System; using System.Collections.Generic; using System.Drawing; using System.Linq; using HeuristicLab.Analysis; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Encodings.RealVectorEncoding; using HeuristicLab.Optimization; using HeuristicLab.Parameters; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; namespace HeuristicLab.Problems.Programmable { [Item("Programmable Problem (single-objective)", "Represents a single-objective problem that can be programmed.")] [Creatable("Problems")] [StorableClass] public class SingleObjectiveProgrammableProblem : SingleObjectiveHeuristicOptimizationProblem, IParameterizedNamedItem, IStorableContent { public string Filename { get; set; } public static new Image StaticItemImage { get { return Common.Resources.VSImageLibrary.Script; } } public new ParameterCollection Parameters { get { return base.Parameters; } } IKeyedItemCollection IParameterizedItem.Parameters { get { return Parameters; } } public IValueParameter ProblemDefinitionParameter { get { return (IValueParameter)Parameters["ProblemDefinition"]; } } protected IValueParameter EncodingParameter { get { return (IValueParameter)Parameters["Encoding"]; } } public ISingleObjectiveProblemDefinition ProblemDefinition { get { return ProblemDefinitionParameter.Value; } set { ProblemDefinitionParameter.Value = value; } } public override IEnumerable ExecutionContextItems { get { return base.ExecutionContextItems.Concat(new[] { ProblemDefinition.Encoding }); } } protected override IEnumerable GetOperators() { return base.GetOperators().Concat(ProblemDefinition.Encoding.Operators); } [StorableConstructor] protected SingleObjectiveProgrammableProblem(bool deserializing) : base(deserializing) { } protected SingleObjectiveProgrammableProblem(SingleObjectiveProgrammableProblem original, Cloner cloner) : base(original, cloner) { RegisterEventHandlers(); } public SingleObjectiveProgrammableProblem() : base(new SingleObjectiveEvaluator(), new MultiEncodingCreator()) { Parameters.Add(new ValueParameter("ProblemDefinition", "Defines the problem.", new SingleObjectiveProblemScript() { Name = Name })); Parameters.Add(new ValueParameter("Encoding", "Describes the configuration of the encoding, what the variables are called, what type they are and their bounds if any.")); Operators.Add(new BestScopeSolutionAnalyzer()); Operators.Add(new SingleObjectiveAnalyzer()); Operators.Add(Evaluator); RegisterEventHandlers(); } public override IDeepCloneable Clone(Cloner cloner) { return new SingleObjectiveProgrammableProblem(this, cloner); } [StorableHook(HookType.AfterDeserialization)] // ReSharper disable UnusedMember.Local private void AfterDeserialization() { RegisterEventHandlers(); } // ReSharper restore UnusedMember.Local private void RegisterEventHandlers() { ProblemDefinitionParameter.ValueChanged += ProblemDefinitionParameterOnValueChanged; RegisterProblemDefinitionEventHandlers(); } private void ProblemDefinitionParameterOnValueChanged(object sender, EventArgs eventArgs) { RegisterProblemDefinitionEventHandlers(); Parameterize(); } private void RegisterProblemDefinitionEventHandlers() { ProblemDefinitionParameter.Value.ProblemDefinitionChanged += ProblemDefinitionChanged; ProblemDefinitionParameter.Value.NameChanged += ProblemDefinitionNameChanged; } private void ProblemDefinitionNameChanged(object sender, EventArgs eventArgs) { if (sender != ProblemDefinitionParameter.Value) return; Name = ProblemDefinitionParameter.Value.Name; } protected override void OnNameChanged() { base.OnNameChanged(); ProblemDefinitionParameter.Value.Name = Name; } protected override void OnEvaluatorChanged() { base.OnEvaluatorChanged(); Parameterize(); } protected virtual void ProblemDefinitionChanged(object sender, EventArgs eventArgs) { Parameterize(); } protected virtual void Parameterize() { var definition = ProblemDefinitionParameter.Value; if (definition == null) return; IEncoding encoding = definition.Encoding; SolutionCreator = encoding.SolutionCreator; EncodingParameter.Value = encoding; Maximization.Value = definition.IsMaximizationProblem; Evaluator.EncodingParameter.ActualName = EncodingParameter.Name; Evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name; foreach (var evalOp in Operators.OfType()) { evalOp.EncodingParameter.ActualName = EncodingParameter.Name; evalOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name; } foreach (var analyzeOp in Operators.OfType()) { analyzeOp.EncodingParameter.ActualName = EncodingParameter.Name; analyzeOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name; analyzeOp.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName; } ConfigureSingleEncodingOperators(); UpdateImprovementOperators(); UpdateMoveOperators(); } protected virtual void ConfigureSingleEncodingOperators() { foreach (var su in GetOperators().OfType()) { su.MaximizationParameter.ActualName = MaximizationParameter.Name; } } protected virtual void UpdateImprovementOperators() { if (!Operators.Any(x => x is SingleObjectiveImprover)) Operators.Add(new SingleObjectiveImprover()); foreach (var improver in Operators.OfType()) { improver.EncodingParameter.ActualName = EncodingParameter.Name; improver.MaximizationParameter.ActualName = MaximizationParameter.Name; improver.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name; improver.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName; } } protected virtual void UpdateMoveOperators() { if (!Operators.Any(x => x is SingleObjectiveMoveGenerator)) Operators.Add(new SingleObjectiveMoveGenerator()); if (!Operators.Any(x => x is SingleObjectiveMoveEvaluator)) Operators.Add(new SingleObjectiveMoveEvaluator()); if (!Operators.Any(x => x is SingleObjectiveMoveMaker)) Operators.Add(new SingleObjectiveMoveMaker()); foreach (var generator in Operators.OfType()) { generator.EncodingParameter.ActualName = EncodingParameter.Name; generator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name; } foreach (var evaluator in Operators.OfType()) { evaluator.EncodingParameter.ActualName = EncodingParameter.Name; evaluator.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName; evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name; } foreach (var maker in Operators.OfType()) { maker.EncodingParameter.ActualName = EncodingParameter.Name; maker.MoveQualityParameter.ActualName = Operators.OfType().First().MoveQualityParameter.ActualName; maker.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName; } } } }