1
#region License Information
3 * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
5 * This file is part of HeuristicLab.
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.
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.
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/>.
22 using HeuristicLab
.Common
;
23 using HeuristicLab
.Core
;
24 using HeuristicLab
.Data
;
25 using HeuristicLab
.Operators
;
26 using HeuristicLab
.Parameters
;
29 namespace HeuristicLab
.Optimization
.Operators
{
31 /// An operator which creates new solutions. Evaluation of the new solutions is executed in parallel, if an engine is used which supports parallelization.
33 [Item("SolutionsCreator", "An operator which creates new solutions. Evaluation of the new solutions is executed in parallel, if an engine is used which supports parallelization.")]
34 [StorableType("3EE12E32-F8AF-4C7E-A9C9-B5DC5561CFE2")]
35 public sealed class SolutionsCreator
: SingleSuccessorOperator
{
36 public ValueLookupParameter
<IntValue
> NumberOfSolutionsParameter
{
37 get { return (ValueLookupParameter<IntValue>)Parameters["NumberOfSolutions"]; }
39 public ValueLookupParameter
<IOperator
> SolutionCreatorParameter
{
40 get { return (ValueLookupParameter<IOperator>)Parameters["SolutionCreator"]; }
42 public ValueLookupParameter
<IOperator
> EvaluatorParameter
{
43 get { return (ValueLookupParameter<IOperator>)Parameters["Evaluator"]; }
45 public ValueLookupParameter
<BoolValue
> ParallelParameter
{
46 get { return (ValueLookupParameter<BoolValue>)Parameters["Parallel"]; }
48 private ScopeParameter CurrentScopeParameter
{
49 get { return (ScopeParameter)Parameters["CurrentScope"]; }
51 public IScope CurrentScope
{
52 get { return CurrentScopeParameter.ActualValue; }
54 public IntValue NumberOfSolutions
{
55 get { return NumberOfSolutionsParameter.Value; }
56 set { NumberOfSolutionsParameter.Value = value; }
60 private SolutionsCreator(StorableConstructorFlag _
) : base(_
) { }
61 private SolutionsCreator(SolutionsCreator original
, Cloner cloner
) : base(original
, cloner
) { }
62 public SolutionsCreator()
64 Parameters
.Add(new ValueLookupParameter
<IntValue
>("NumberOfSolutions", "The number of solutions that should be created."));
65 Parameters
.Add(new ValueLookupParameter
<IOperator
>("SolutionCreator", "The operator which is used to create new solutions."));
66 Parameters
.Add(new ValueLookupParameter
<IOperator
>("Evaluator", "The operator which is used to evaluate new solutions. This operator is executed in parallel, if an engine is used which supports parallelization."));
67 Parameters
.Add(new ValueLookupParameter
<BoolValue
>("Parallel", "True if the operator should be applied in parallel on all sub-scopes, otherwise false.", new BoolValue(true)));
68 Parameters
.Add(new ScopeParameter("CurrentScope", "The current scope to which the new solutions are added as sub-scopes."));
70 [StorableHook(HookType
.AfterDeserialization
)]
71 private void AfterDeserialization() {
72 if (!Parameters
.ContainsKey("Parallel")) Parameters
.Add(new ValueLookupParameter
<BoolValue
>("Parallel", "True if the operator should be applied in parallel on all sub-scopes, otherwise false.", new BoolValue(true))); // backwards compatibility
75 public override IDeepCloneable
Clone(Cloner cloner
) {
76 return new SolutionsCreator(this, cloner
);
79 public override IOperation
Apply() {
80 int count
= NumberOfSolutionsParameter
.ActualValue
.Value
;
81 IOperator creator
= SolutionCreatorParameter
.ActualValue
;
82 IOperator evaluator
= EvaluatorParameter
.ActualValue
;
83 bool parallel
= ParallelParameter
.ActualValue
.Value
;
85 int current
= CurrentScope
.SubScopes
.Count
;
86 for (int i
= 0; i
< count
; i
++)
87 CurrentScope
.SubScopes
.Add(new Scope((current
+ i
).ToString()));
89 OperationCollection creation
= new OperationCollection();
90 OperationCollection evaluation
= new OperationCollection() { Parallel = parallel }
;
91 for (int i
= 0; i
< count
; i
++) {
92 if (creator
!= null) creation
.Add(ExecutionContext
.CreateOperation(creator
, CurrentScope
.SubScopes
[current
+ i
]));
93 if (evaluator
!= null) evaluation
.Add(ExecutionContext
.CreateOperation(evaluator
, CurrentScope
.SubScopes
[current
+ i
]));
95 OperationCollection next
= new OperationCollection();
98 next
.Add(base.Apply());