#3017: updated build and test scripts to support VS 2022
[heuristiclab.git] / HeuristicLab.Optimization.Operators / 3.3 / SingleObjectivePathRelinker.cs
blob7aeebae81fe3fd1afda2df6410472e14add60fd2
1 #region License Information
2 /* HeuristicLab
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/>.
20 #endregion
22 using HeuristicLab.Common;
23 using HeuristicLab.Core;
24 using HeuristicLab.Data;
25 using HeuristicLab.Operators;
26 using HeuristicLab.Parameters;
27 using HEAL.Attic;
29 namespace HeuristicLab.Optimization.Operators {
30 /// <summary>
31 /// A base class for operators that perform path relinking between single objective solutions.
32 /// </summary>
33 [Item("SingleObjectivePathRelinker", "A base class for operators that perform path relinking between single objective solutions.")]
34 [StorableType("364CE8A7-0258-4EC1-BBDB-E40C944BD196")]
35 public abstract class SingleObjectivePathRelinker : SingleSuccessorOperator, ISingleObjectivePathRelinker {
36 #region Parameter properties
37 public ScopeParameter CurrentScopeParameter {
38 get { return (ScopeParameter)Parameters["CurrentScope"]; }
40 public ILookupParameter<ItemArray<IItem>> ParentsParameter {
41 get { return (IScopeTreeLookupParameter<IItem>)Parameters["Parents"]; }
43 public IValueParameter<PercentValue> RelinkingAccuracyParameter {
44 get { return (IValueParameter<PercentValue>)Parameters["RelinkingAccuracy"]; }
46 #endregion
48 #region Properties
49 private IScope CurrentScope {
50 get { return CurrentScopeParameter.ActualValue; }
52 private ItemArray<IItem> Parents {
53 get { return ParentsParameter.ActualValue; }
55 private PercentValue RelinkingAccuracy {
56 get { return RelinkingAccuracyParameter.Value; }
58 #endregion
60 [StorableConstructor]
61 protected SingleObjectivePathRelinker(StorableConstructorFlag _) : base(_) { }
62 protected SingleObjectivePathRelinker(SingleObjectivePathRelinker original, Cloner cloner) : base(original, cloner) { }
63 protected SingleObjectivePathRelinker()
64 : base() {
65 #region Create parameters
66 Parameters.Add(new ScopeParameter("CurrentScope", "The current scope that contains the parents."));
67 Parameters.Add(new ScopeTreeLookupParameter<IItem>("Parents", "The parents used for path relinking."));
68 Parameters.Add(new ValueParameter<PercentValue>("RelinkingAccuracy", "The percentage of relinked offspring that should be yielded.", new PercentValue(0.25)));
69 #endregion
72 public sealed override IOperation Apply() {
73 ItemArray<IItem> relinkedSolutions = Relink(Parents, RelinkingAccuracy);
74 var offspringScope = new Scope("Offspring");
75 foreach (var solution in relinkedSolutions) {
76 var scope = new Scope();
77 scope.Variables.Add(new Variable(ParentsParameter.ActualName, solution));
78 offspringScope.SubScopes.Add(scope);
80 CurrentScope.SubScopes.Add(offspringScope);
81 return base.Apply();
84 protected abstract ItemArray<IItem> Relink(ItemArray<IItem> parents, PercentValue n);