Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveSoftTabuCriterion.cs @ 9473

Last change on this file since 9473 was 9473, checked in by jhelm, 11 years ago

#1966: Fixed some problems in MCV-move operators; Added parts of potvin-encoding implementation;

File size: 9.1 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.Collections.Generic;
23using HeuristicLab.Common;
24using HeuristicLab.Core;
25using HeuristicLab.Data;
26using HeuristicLab.Encodings.IntegerVectorEncoding;
27using HeuristicLab.Operators;
28using HeuristicLab.Optimization;
29using HeuristicLab.Parameters;
30using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
31using HeuristicLab.Problems.BinPacking.Interfaces;
32
33namespace HeuristicLab.Encodings.PackingEncoding.MultiComponentVector {
34  [Item("MultiComponentVectorMoveSoftTabuCriterion", "<Missing>")]
35  [StorableClass]
36  public class MultiComponentVectorMoveSoftTabuCriterion : SingleSuccessorOperator, IMultiComponentVectorMoveOperator, ITabuChecker {
37    public override bool CanChangeName {
38      get { return false; }
39    }
40    public ILookupParameter<MultiComponentVectorMove> MultiComponentVectorMoveParameter {
41      get { return (ILookupParameter<MultiComponentVectorMove>)Parameters["MultiComponentVectorMove"]; }
42    }
43    public ILookupParameter<MultiComponentVectorEncoding> MultiComponentVectorParameter {
44      get { return (ILookupParameter<MultiComponentVectorEncoding>)Parameters["MultiComponentVector"]; }
45    }
46    public ILookupParameter<ItemList<IItem>> TabuListParameter {
47      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
48    }
49    public ILookupParameter<BoolValue> MoveTabuParameter {
50      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
51    }
52    public IValueLookupParameter<BoolValue> MaximizationParameter {
53      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
54    }
55    public ILookupParameter<DoubleValue> MoveQualityParameter {
56      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
57    }
58    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
59      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
60    }
61
62    [StorableConstructor]
63    protected MultiComponentVectorMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
64    protected MultiComponentVectorMoveSoftTabuCriterion(MultiComponentVectorMoveSoftTabuCriterion original, Cloner cloner) : base(original, cloner) { }
65    public MultiComponentVectorMoveSoftTabuCriterion()
66      : base() {
67      Parameters.Add(new LookupParameter<MultiComponentVectorMove>("MultiComponentVectorMove", "The move to evaluate."));
68      Parameters.Add(new LookupParameter<MultiComponentVectorEncoding>("MultiComponentVector", "The solution to evaluate."));
69      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
70      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
71      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
72      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
73      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
74    }
75
76    public override IDeepCloneable Clone(Cloner cloner) {
77      return new MultiComponentVectorMoveSoftTabuCriterion(this, cloner);
78    }
79
80    public override IOperation Apply() {
81      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
82      MultiComponentVectorMove move = MultiComponentVectorMoveParameter.ActualValue;
83      MultiComponentVectorEncoding multiComponentVector = MultiComponentVectorParameter.ActualValue;
84      int length = multiComponentVector.PackingInformations.Count;
85      double moveQuality = MoveQualityParameter.ActualValue.Value;
86      bool maximization = MaximizationParameter.ActualValue.Value;
87      bool useAspiration = UseAspirationCriterionParameter.Value.Value;
88      bool isTabu = IsMoveTabu(tabuList, move, multiComponentVector, moveQuality, maximization, useAspiration);
89
90      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
91      return base.Apply();
92    }
93
94    private bool IsMoveTabu(ItemList<IItem> tabuList, MultiComponentVectorMove move, MultiComponentVectorEncoding multiComponentVector, double moveQuality, bool maximization, bool useAspiration) {
95      bool isTabu = false;
96
97      SingleItemRotationMove sirm = move as SingleItemRotationMove;
98      SingleGroupingMove sgm = move as SingleGroupingMove;
99      SwapPositionMove spm = move as SwapPositionMove;
100      ChangePositionMove cpm = move as ChangePositionMove;
101      MCVTripleMove tm = move as MCVTripleMove;
102      var attributes = tabuList.FindAll(ta => ta.GetType().Equals(move.GetMoveAttributeType()));
103
104      if (sirm != null) {
105        foreach (IItem tabuMove in attributes) {
106          SingleItemRotationMoveAttribute sirmAttr = (tabuMove as SingleItemRotationMoveAttribute);
107          if (sirmAttr != null
108            && (!useAspiration
109                || maximization && moveQuality <= sirmAttr.MoveQuality
110                || !maximization && moveQuality >= sirmAttr.MoveQuality)) {
111            if (sirm.ItemIndex == sirmAttr.ItemIndex && multiComponentVector.PackingInformations[sirm.ItemIndex].Rotated == sirmAttr.ItemRotation)
112              isTabu = true;
113          }
114          if (isTabu) break;
115        }
116      } else if (sgm != null) {
117        foreach (IItem tabuMove in attributes) {
118          SingleGroupingMoveAttribute sgmAttr = (tabuMove as SingleGroupingMoveAttribute);
119          if (sgmAttr != null
120            && (!useAspiration
121                || maximization && moveQuality <= sgmAttr.MoveQuality
122                || !maximization && moveQuality >= sgmAttr.MoveQuality)) {
123                  if (multiComponentVector.PackingInformations[sgm.Index].ItemIndex == multiComponentVector.PackingInformations[sgmAttr.Index].ItemIndex
124              && multiComponentVector.PackingInformations[sgm.Index].AssignedBin == sgmAttr.AssignedBin)
125              isTabu = true;
126          }
127          if (isTabu) break;
128        }
129      } else if (spm != null) {
130        foreach (IItem tabuMove in attributes) {
131          SwapPositionMoveAttribute spmAttr = (tabuMove as SwapPositionMoveAttribute);
132          if (spmAttr != null
133            && (!useAspiration
134                || maximization && moveQuality <= spmAttr.MoveQuality
135                || !maximization && moveQuality >= spmAttr.MoveQuality)) {
136            if (spm.Index1 == spmAttr.Index1
137              && spm.Index2 == spmAttr.Index2
138              && multiComponentVector.PackingInformations[spm.Index1].ItemIndex == spmAttr.ItemIndex1
139              && multiComponentVector.PackingInformations[spm.Index2].ItemIndex == spmAttr.ItemIndex2)
140              isTabu = true;
141          }
142          if (isTabu) break;
143        }
144      } else if (cpm != null) {
145        foreach (IItem tabuMove in attributes) {
146          ChangePositionMoveAttribute cpmAttr = (tabuMove as ChangePositionMoveAttribute);
147          if (cpmAttr != null
148            && (!useAspiration
149                || maximization && moveQuality <= cpmAttr.MoveQuality
150                || !maximization && moveQuality >= cpmAttr.MoveQuality)) {
151            if (cpm.Index == cpmAttr.Index
152        && cpm.TargetIndex == cpmAttr.TargetIndex
153        && multiComponentVector.PackingInformations[cpm.Index].ItemIndex == cpmAttr.ItemIndex)
154              isTabu = true;
155          }
156          if (isTabu) break;
157        }
158      } else if (tm != null) {
159        foreach (IItem tabuMove in attributes) {
160          MCVTripleMoveAttribute tmAttr = (tabuMove as MCVTripleMoveAttribute);
161          if (tmAttr != null
162            && (!useAspiration
163                || maximization && moveQuality <= tmAttr.MoveQuality
164                || !maximization && moveQuality >= tmAttr.MoveQuality)) {
165            if ((tm.Index == tmAttr.Index && tm.TargetIndex == tmAttr.TargetIndex)
166                && multiComponentVector.PackingInformations[tm.Index].ItemIndex == tmAttr.ItemIndex
167                && tm.Rotation == !(tmAttr.RotationAfter.Equals(tmAttr.RotationBefore))
168                && (tm.Group == tmAttr.GroupAfter && multiComponentVector.PackingInformations[tm.Index].AssignedBin == tmAttr.GroupBefore)
169              )
170              isTabu = true;
171          }
172          if (isTabu) break;
173        }
174      }
175
176
177
178      return isTabu;
179    }
180  }
181}
Note: See TracBrowser for help on using the repository browser.