Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs @ 9124

Last change on this file since 9124 was 7999, checked in by ascheibe, 12 years ago

#1864

  • switched IOperators collection to IItems
  • adapted algorithms and problems
  • added AfterDeserialization hooks for problem, external evaluation problem and user-defined problem
File size: 11.8 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Drawing;
25using System.Linq;
26using System.Threading;
27using HeuristicLab.Collections;
28using HeuristicLab.Common;
29using HeuristicLab.Core;
30using HeuristicLab.Data;
31using HeuristicLab.Parameters;
32using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
33using HeuristicLab.PluginInfrastructure;
34
35namespace HeuristicLab.Optimization {
36  /// <summary>
37  /// A problem which can be defined by the user.
38  /// </summary>
39  [Item("User-Defined Problem", "A problem which can be defined by the user.")]
40  [Creatable("Problems")]
41  [StorableClass]
42  public sealed class UserDefinedProblem : ParameterizedNamedItem, ISingleObjectiveHeuristicOptimizationProblem, IStorableContent {
43    public string Filename { get; set; }
44
45    public static new Image StaticItemImage {
46      get { return HeuristicLab.Common.Resources.VSImageLibrary.Type; }
47    }
48    public new ParameterCollection Parameters {
49      get { return base.Parameters; }
50    }
51    IKeyedItemCollection<string, IParameter> IParameterizedItem.Parameters {
52      get { return Parameters; }
53    }
54
55    #region Parameters
56    public IValueParameter<ISingleObjectiveEvaluator> EvaluatorParameter {
57      get { return (IValueParameter<ISingleObjectiveEvaluator>)Parameters["Evaluator"]; }
58    }
59    public ValueParameter<BoolValue> MaximizationParameter {
60      get { return (ValueParameter<BoolValue>)Parameters["Maximization"]; }
61    }
62    IParameter ISingleObjectiveHeuristicOptimizationProblem.MaximizationParameter {
63      get { return MaximizationParameter; }
64    }
65    public ValueParameter<ISolutionCreator> SolutionCreatorParameter {
66      get { return (ValueParameter<ISolutionCreator>)Parameters["SolutionCreator"]; }
67    }
68    IParameter IHeuristicOptimizationProblem.SolutionCreatorParameter {
69      get { return SolutionCreatorParameter; }
70    }
71    IParameter IHeuristicOptimizationProblem.EvaluatorParameter {
72      get { return EvaluatorParameter; }
73    }
74    public OptionalValueParameter<DoubleValue> BestKnownQualityParameter {
75      get { return (OptionalValueParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
76    }
77    IParameter ISingleObjectiveHeuristicOptimizationProblem.BestKnownQualityParameter {
78      get { return BestKnownQualityParameter; }
79    }
80    public OptionalValueParameter<IScope> BestKnownSolutionParameter {
81      get { return (OptionalValueParameter<IScope>)Parameters["BestKnownSolution"]; }
82    }
83    public ValueParameter<ItemList<IItem>> OperatorsParameter {
84      get { return (ValueParameter<ItemList<IItem>>)Parameters["Operators"]; }
85    }
86    #endregion
87
88    #region Properties
89    public BoolValue Maximization {
90      get { return MaximizationParameter.Value; }
91      set { MaximizationParameter.Value = value; }
92    }
93    public ISolutionCreator SolutionCreator {
94      get { return SolutionCreatorParameter.Value; }
95      set { SolutionCreatorParameter.Value = value; }
96    }
97    ISolutionCreator IHeuristicOptimizationProblem.SolutionCreator {
98      get { return SolutionCreatorParameter.Value; }
99    }
100    public ISingleObjectiveEvaluator Evaluator {
101      get { return EvaluatorParameter.Value; }
102      set { EvaluatorParameter.Value = value; }
103    }
104    ISingleObjectiveEvaluator ISingleObjectiveHeuristicOptimizationProblem.Evaluator {
105      get { return EvaluatorParameter.Value; }
106    }
107    IEvaluator IHeuristicOptimizationProblem.Evaluator {
108      get { return EvaluatorParameter.Value; }
109    }
110    public DoubleValue BestKnownQuality {
111      get { return BestKnownQualityParameter.Value; }
112      set { BestKnownQualityParameter.Value = value; }
113    }
114    public IEnumerable<IItem> Operators {
115      get { return OperatorsParameter.Value; }
116    }
117    #endregion
118
119    [StorableConstructor]
120    private UserDefinedProblem(bool deserializing) : base(deserializing) { }
121    [StorableHook(HookType.AfterDeserialization)]
122    private void AfterDeserialization() {
123      // BackwardsCompatibility3.3
124      #region Backwards compatible code, remove with 3.4
125      if (Parameters.ContainsKey("Operators") && Parameters["Operators"] is ValueParameter<ItemList<IOperator>>) {
126        ItemList<IOperator> tmp = ((ValueParameter<ItemList<IOperator>>)Parameters["Operators"]).Value;
127        Parameters.Remove("Operators");
128        Parameters.Add(new ValueParameter<ItemList<IItem>>("Operators", "The operators and items that the problem provides to the algorithms.", new ItemList<IItem>(tmp), false));
129      }
130      #endregion
131
132      RegisterEventHandlers();
133    }
134    public UserDefinedProblem()
135      : base() {
136      Parameters.Add(new ValueParameter<ISingleObjectiveEvaluator>("Evaluator", "The evaluator that collects the values to exchange.", new EmptyUserDefinedProblemEvaluator()));
137      Parameters.Add(new ValueParameter<ISolutionCreator>("SolutionCreator", "An operator to create the solution components."));
138      Parameters.Add(new ValueParameter<BoolValue>("Maximization", "Set to false as most test functions are minimization problems.", new BoolValue(false)));
139      Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this problem."));
140      Parameters.Add(new OptionalValueParameter<IScope>("BestKnownSolution", "The best known solution for this external evaluation problem."));
141      Parameters.Add(new ValueParameter<ItemList<IItem>>("Operators", "The operators and items that the problem provides to the algorithms.", new ItemList<IItem>()));
142
143      RegisterEventHandlers();
144    }
145
146    private UserDefinedProblem(UserDefinedProblem original, Cloner cloner)
147      : base(original, cloner) {
148      RegisterEventHandlers();
149    }
150    public override IDeepCloneable Clone(Cloner cloner) {
151      return new UserDefinedProblem(this, cloner);
152    }
153
154    #region Events
155    public event EventHandler SolutionCreatorChanged;
156    private void OnSolutionCreatorChanged() {
157      EventHandler handler = SolutionCreatorChanged;
158      if (handler != null) handler(this, EventArgs.Empty);
159    }
160    public event EventHandler EvaluatorChanged;
161    private void OnEvaluatorChanged() {
162      EventHandler handler = EvaluatorChanged;
163      if (handler != null) handler(this, EventArgs.Empty);
164    }
165    public event EventHandler OperatorsChanged;
166    private void OnOperatorsChanged() {
167      EventHandler handler = OperatorsChanged;
168      if (handler != null) handler(this, EventArgs.Empty);
169    }
170    public event EventHandler Reset;
171    private void OnReset() {
172      EventHandler handler = Reset;
173      if (handler != null) handler(this, EventArgs.Empty);
174    }
175    #endregion
176
177    #region Event handlers
178    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
179      OnSolutionCreatorChanged();
180    }
181    private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
182      if (Evaluator != null)
183        Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
184      ParameterizeOperators();
185      OnEvaluatorChanged();
186    }
187    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
188      ParameterizeOperators();
189    }
190    private void OperatorsParameter_ValueChanged(object sender, EventArgs e) {
191      OnOperatorsChanged();
192    }
193    private void OperatorsParameter_Value_ItemsAdded(object sender, EventArgs e) {
194      OnOperatorsChanged();
195    }
196    private void OperatorsParameter_Value_ItemsRemoved(object sender, EventArgs e) {
197      OnOperatorsChanged();
198    }
199    private void OperatorsParameter_Value_CollectionReset(object sender, EventArgs e) {
200      OnOperatorsChanged();
201    }
202    #endregion
203
204    #region Helpers
205    private void RegisterEventHandlers() {
206      SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
207      EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
208      if (Evaluator != null)
209        Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
210      OperatorsParameter.ValueChanged += new EventHandler(OperatorsParameter_ValueChanged);
211      OperatorsParameter.Value.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IItem>>(OperatorsParameter_Value_ItemsAdded);
212      OperatorsParameter.Value.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IItem>>(OperatorsParameter_Value_ItemsRemoved);
213      OperatorsParameter.Value.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IItem>>(OperatorsParameter_Value_CollectionReset);
214    }
215
216    private void ParameterizeOperators() {
217      // A best effort approach to wiring
218      if (Evaluator != null) {
219        string qualityName = Evaluator.QualityParameter.ActualName;
220        foreach (IOperator op in OperatorsParameter.Value.OfType<IOperator>()) {
221          foreach (ILookupParameter<DoubleValue> param in op.Parameters.OfType<ILookupParameter<DoubleValue>>()) {
222            if (param.Name.Equals("Quality")) param.ActualName = qualityName;
223          }
224          foreach (IScopeTreeLookupParameter<DoubleValue> param in op.Parameters.OfType<IScopeTreeLookupParameter<DoubleValue>>()) {
225            if (param.Name.Equals("Quality")) param.ActualName = qualityName;
226          }
227        }
228      }
229    }
230    #endregion
231
232    [Item("EmptyUserDefinedProblemEvaluator", "A dummy evaluator that will throw an exception when executed.")]
233    [StorableClass]
234    [NonDiscoverableType]
235    private sealed class EmptyUserDefinedProblemEvaluator : ParameterizedNamedItem, ISingleObjectiveEvaluator {
236
237      [StorableConstructor]
238      private EmptyUserDefinedProblemEvaluator(bool deserializing) : base(deserializing) { }
239      private EmptyUserDefinedProblemEvaluator(EmptyUserDefinedProblemEvaluator original, Cloner cloner)
240        : base(original, cloner) {
241      }
242      public override IDeepCloneable Clone(Cloner cloner) {
243        return new EmptyUserDefinedProblemEvaluator(this, cloner);
244      }
245
246      #region ISingleObjectiveEvaluator Members
247
248      public ILookupParameter<DoubleValue> QualityParameter {
249        get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
250      }
251
252      #endregion
253
254      public EmptyUserDefinedProblemEvaluator() {
255        Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The solution quality."));
256      }
257
258      #region IOperator Members
259
260      public bool Breakpoint { get; set; }
261
262      public IOperation Execute(IExecutionContext context, CancellationToken cancellationToken) {
263        throw new InvalidOperationException("Please choose an appropriate evaluation operator.");
264      }
265
266#pragma warning disable 67
267      public event EventHandler BreakpointChanged;
268
269      public event EventHandler Executed;
270#pragma warning restore 67
271
272      #endregion
273
274      public static new Image StaticItemImage {
275        get { return HeuristicLab.Common.Resources.VSImageLibrary.Method; }
276      }
277    }
278  }
279}
Note: See TracBrowser for help on using the repository browser.