Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveHardTabuCriterion.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.4 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("MultiComponentVectorMoveHardTabuCriterion", "<Missing>")]
35  [StorableClass]
36  public class MultiComponentVectorMoveHardTabuCriterion : 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 MultiComponentVectorMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
64    protected MultiComponentVectorMoveHardTabuCriterion(MultiComponentVectorMoveHardTabuCriterion original, Cloner cloner) : base(original, cloner) { }
65    public MultiComponentVectorMoveHardTabuCriterion()
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 MultiComponentVectorMoveHardTabuCriterion(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      SingleItemRotationMove sirm = move as SingleItemRotationMove;
97      SingleGroupingMove sgm = move as SingleGroupingMove;
98      SwapPositionMove spm = move as SwapPositionMove;
99      ChangePositionMove cpm = move as ChangePositionMove;
100      MCVTripleMove tm = move as MCVTripleMove;
101      var attributes = tabuList.FindAll(ta => ta.GetType().Equals(move.GetMoveAttributeType()));
102
103      if (sirm != null) {
104        foreach (IItem tabuMove in attributes) {
105          SingleItemRotationMoveAttribute sirmAttr = (tabuMove as SingleItemRotationMoveAttribute);
106          if (sirmAttr.MoveQuality.Equals(moveQuality))
107            return true;
108          if (sirmAttr != null
109            && (!useAspiration
110                || maximization && moveQuality <= sirmAttr.MoveQuality
111                || !maximization && moveQuality >= sirmAttr.MoveQuality)) {
112                  if (sirm.ItemIndex == sirmAttr.ItemIndex || multiComponentVector.PackingInformations[sirm.ItemIndex].Rotated == sirmAttr.ItemRotation)
113                    isTabu = true;
114          }
115          if (isTabu) break;
116        }
117      } else if (sgm != null) {
118        foreach (IItem tabuMove in attributes) {
119          SingleGroupingMoveAttribute sgmAttr = (tabuMove as SingleGroupingMoveAttribute);
120          if (sgmAttr.MoveQuality.Equals(moveQuality))
121            return true;
122          if (sgmAttr != null
123            && (!useAspiration
124                || maximization && moveQuality <= sgmAttr.MoveQuality
125                || !maximization && moveQuality >= sgmAttr.MoveQuality)) {
126                  if ( multiComponentVector.PackingInformations[sgm.Index].ItemIndex ==  multiComponentVector.PackingInformations[sgmAttr.Index].ItemIndex
127                    || multiComponentVector.PackingInformations[sgm.Index].AssignedBin == sgmAttr.AssignedBin)
128                    isTabu = true;
129          }
130          if (isTabu) break;
131        }
132      } else if (spm != null) {
133        foreach (IItem tabuMove in attributes) {
134          SwapPositionMoveAttribute spmAttr = (tabuMove as SwapPositionMoveAttribute);
135          if (spmAttr.MoveQuality.Equals(moveQuality))
136            return true;
137          if (spmAttr != null
138            && (!useAspiration
139                || maximization && moveQuality <= spmAttr.MoveQuality
140                || !maximization && moveQuality >= spmAttr.MoveQuality)) {
141            if (spm.Index1 == spmAttr.Index1
142              || spm.Index2 == spmAttr.Index2
143              || multiComponentVector.PackingInformations[spm.Index1].ItemIndex == spmAttr.ItemIndex1
144              || multiComponentVector.PackingInformations[spm.Index2].ItemIndex == spmAttr.ItemIndex2)
145              isTabu = true;
146          }
147          if (isTabu) break;
148        }
149      } else if (cpm != null) {
150        foreach (IItem tabuMove in attributes) {
151          ChangePositionMoveAttribute cpmAttr = (tabuMove as ChangePositionMoveAttribute);
152          if (cpmAttr.MoveQuality.Equals(moveQuality))
153            return true;
154          if (cpmAttr != null
155            && (!useAspiration
156                || maximization && moveQuality <= cpmAttr.MoveQuality
157                || !maximization && moveQuality >= cpmAttr.MoveQuality)) {
158            if (cpm.Index == cpmAttr.Index
159        || cpm.TargetIndex == cpmAttr.TargetIndex
160        || multiComponentVector.PackingInformations[cpm.Index].ItemIndex == cpmAttr.ItemIndex)
161              isTabu = true;
162          }
163          if (isTabu) break;
164        }
165      } else if (tm != null) {
166        foreach (IItem tabuMove in attributes) {
167          MCVTripleMoveAttribute tmAttr = (tabuMove as MCVTripleMoveAttribute);
168          if (tmAttr.MoveQuality.Equals(moveQuality))
169            return true;
170          if (tmAttr != null
171            && (!useAspiration
172                || maximization && moveQuality <= tmAttr.MoveQuality
173                || !maximization && moveQuality >= tmAttr.MoveQuality)) {
174                  if ((tm.Index == tmAttr.Index && tm.TargetIndex == tmAttr.TargetIndex)
175                      || tm.Index == tmAttr.Index
176                      || multiComponentVector.PackingInformations[tm.Index].ItemIndex == tmAttr.ItemIndex
177                    )
178              isTabu = true;
179          }
180          if (isTabu) break;
181        }
182      }
183
184     
185
186      return isTabu;
187    }
188  }
189}
Note: See TracBrowser for help on using the repository browser.