using System; using System.Linq; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; using HeuristicLab.Optimization; using HeuristicLab.Parameters; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; using HeuristicLab.PluginInfrastructure; namespace HeuristicLab.Problems.Robocode { [StorableClass] [Creatable("Problems")] [Item("Robocode Problem", "The Robocode problem for genetic programming.")] public class Problem : SingleObjectiveHeuristicOptimizationProblem { #region parameter names private const string TankProgramParameterName = "TankProgram"; private const string MaxTankProgramLengthParameterName = "MaxProgramLength"; private const string MaxTankProgramDepthParameterName = "MaxProgramDepth"; private const string TankGrammarParameterName = "Grammar"; private const string RobocodePathParamaterName = "Path"; private const string CoevolutionParameterName = "Coevolution"; #endregion #region parameters public IFixedValueParameter MaxTankProgramLengthParameter { get { return (IFixedValueParameter) Parameters[MaxTankProgramLengthParameterName]; } } public IFixedValueParameter MaxTankProgramDepthParameter { get { return (IFixedValueParameter) Parameters[MaxTankProgramDepthParameterName]; } } public IValueParameter GrammarParameter { get { return (IValueParameter) Parameters[TankGrammarParameterName]; } } public IFixedValueParameter RobocodePathParameter { get { return (IFixedValueParameter) Parameters[RobocodePathParamaterName]; } } public IFixedValueParameter CoevolutionParameter { get { return (IFixedValueParameter) Parameters[CoevolutionParameterName]; } } #endregion [StorableConstructor] protected Problem(bool deserializing) : base(deserializing) { } protected Problem(Problem original, Cloner cloner) : base(original, cloner) { } // default constructor for the problem // also creates the fitness evaluation operator (Evaluator), // and the tree creation operator (RampedHalfAndHalfTreeCreator) public Problem() : base(new Evaluator(), new RampedHalfAndHalfTreeCreator()) { Parameters.Add( new FixedValueParameter( MaxTankProgramDepthParameterName, "Maximal depth of the Robocode tank program.", new IntValue(6))); Parameters.Add( new FixedValueParameter( MaxTankProgramLengthParameterName, "Maximal length of the tank program.", new IntValue(1000))); Parameters.Add( new ValueParameter( TankGrammarParameterName, "Grammar for the tank program.", new Grammar())); Parameters.Add(new FixedValueParameter( RobocodePathParamaterName, "Path of the Robocode installation.", new StringValue("F:/robocode2"))); Parameters.Add(new FixedValueParameter( CoevolutionParameterName, "Use Coevolution", new BoolValue(false))); Maximization.Value = true; InitializeOperators(); } public override IDeepCloneable Clone(Cloner cloner) { return new Problem(this, cloner); } private void InitializeOperators() { Operators.AddRange( ApplicationManager.Manager.GetInstances()); Operators.Add(new MinAverageMaxSymbolicExpressionTreeLengthAnalyzer()); Operators.Add(new SymbolicExpressionSymbolFrequencyAnalyzer()); Operators.Add(new BestSolutionAnalyzer()); ParameterizeOperators(); ParameterizeAnalyzers(); } protected override void OnEvaluatorChanged() { base.OnEvaluatorChanged(); Evaluator.TankProgramParameter.ActualName = TankProgramParameterName; ParameterizeAnalyzers(); ParameterizeOperators(); } protected override void OnSolutionCreatorChanged() { base.OnSolutionCreatorChanged(); SolutionCreator.SymbolicExpressionTreeParameter.ActualName = TankProgramParameterName; ParameterizeAnalyzers(); ParameterizeOperators(); } private void ParameterizeAnalyzers() { var analyzers = Operators.OfType(); foreach (var o in analyzers.OfType()) { o.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; } foreach (var o in analyzers.OfType()) { o.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName; } } private void ParameterizeOperators() { var operators = Parameters .OfType() .Select(p => p.Value) .OfType() .Union(Operators); foreach (var o in operators.OfType()) { o.SymbolicExpressionTreeGrammarParameter.ActualName = TankGrammarParameterName; } foreach (var o in operators.OfType()) { o.MaximumSymbolicExpressionTreeDepthParameter.ActualName = MaxTankProgramDepthParameterName; o.MaximumSymbolicExpressionTreeLengthParameter.ActualName = MaxTankProgramLengthParameterName; } foreach (var op in operators.OfType()) { op.TankProgramParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; } foreach (var op in operators.OfType()) { op.ParentsParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; op.ChildParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; } foreach (var op in operators.OfType()) { op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; } foreach (var op in operators.OfType()) { op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; } } } }