source: trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/ShakingOperators/IntegerVectorShakingOperator.cs @ 11756

Last change on this file since 11756 was 11756, checked in by mkommend, 5 years ago

#2293: Added Bounds parameter for Real- and IntegerVectorShakingOperators.

File size: 4.7 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2014 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.Collections.Generic;
23using System.Linq;
24using HeuristicLab.Collections;
25using HeuristicLab.Common;
26using HeuristicLab.Core;
27using HeuristicLab.Data;
28using HeuristicLab.Optimization;
29using HeuristicLab.Optimization.Operators;
30using HeuristicLab.Parameters;
31using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
32using HeuristicLab.PluginInfrastructure;
33
34namespace HeuristicLab.Encodings.IntegerVectorEncoding {
35  /// <summary>
36  /// A shaking operator for VNS.
37  /// </summary>
38  [Item("IntegerVectorShakingOperator", "A shaking operator for VNS which uses available manipulation operators to perform the shaking.")]
39  [StorableClass]
40  public class IntegerVectorShakingOperator : ShakingOperator<IIntegerVectorManipulator>, IIntegerVectorMultiNeighborhoodShakingOperator, IStochasticOperator, IBoundedIntegerVectorOperator {
41
42    public ILookupParameter<IntegerVector> IntegerVectorParameter {
43      get { return (ILookupParameter<IntegerVector>)Parameters["IntegerVector"]; }
44    }
45
46    public ILookupParameter<IRandom> RandomParameter {
47      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
48    }
49
50    public IValueLookupParameter<IntMatrix> BoundsParameter {
51      get { return (IValueLookupParameter<IntMatrix>)Parameters["Bounds"]; }
52    }
53
54    [StorableConstructor]
55    protected IntegerVectorShakingOperator(bool deserializing) : base(deserializing) { }
56    protected IntegerVectorShakingOperator(IntegerVectorShakingOperator original, Cloner cloner) : base(original, cloner) { }
57    public override IDeepCloneable Clone(Cloner cloner) {
58      return new IntegerVectorShakingOperator(this, cloner);
59    }
60    public IntegerVectorShakingOperator()
61      : base() {
62      Parameters.Add(new LookupParameter<IntegerVector>("IntegerVector", "The integer vector to shake."));
63      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator that will be used for stochastic shaking operators."));
64      Parameters.Add(new ValueLookupParameter<IntMatrix>("Bounds", "A 2 column matrix specifying the lower and upper bound for each dimension. If there are less rows than dimension the bounds vector is cycled."));
65
66      foreach (IIntegerVectorManipulator shaker in ApplicationManager.Manager.GetInstances<IIntegerVectorManipulator>().OrderBy(x => x.Name))
67        if (!(shaker is ISelfAdaptiveManipulator)) Operators.Add(shaker);
68    }
69
70    [StorableHook(HookType.AfterDeserialization)]
71    private void AfterDeserialization() {
72      #region Backwards compatible code, remove with 3.4
73      if (!Parameters.ContainsKey("Bounds"))
74        Parameters.Add(new ValueLookupParameter<IntMatrix>("Bounds", "A 2 column matrix specifying the lower and upper bound for each dimension. If there are less rows than dimension the bounds vector is cycled."));
75      #endregion
76    }
77
78    #region Wiring of some parameters
79    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IIntegerVectorManipulator>> e) {
80      base.Operators_ItemsAdded(sender, e);
81      ParameterizeOperators(e.Items);
82    }
83
84    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IIntegerVectorManipulator>> e) {
85      base.Operators_ItemsReplaced(sender, e);
86      ParameterizeOperators(e.Items);
87    }
88
89    private void ParameterizeOperators(IEnumerable<IndexedItem<IIntegerVectorManipulator>> items) {
90      if (items.Any()) {
91        foreach (IStochasticOperator op in items.Select(x => x.Value).OfType<IStochasticOperator>())
92          op.RandomParameter.ActualName = RandomParameter.Name;
93        foreach (IIntegerVectorManipulator op in items.Select(x => x.Value).OfType<IIntegerVectorManipulator>())
94          op.IntegerVectorParameter.ActualName = IntegerVectorParameter.Name;
95      }
96    }
97    #endregion
98  }
99}
Note: See TracBrowser for help on using the repository browser.