Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/MultiComponentVector/Moves/ThreeWay/MultiComponentVectorMoveHardTabuCriterion.cs @ 9440

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

#1966: Implemented new encoding (MultiComponentVector/MCV); Implemented move-operators for MCV and GV encodings; Implemented new decoding-methods for PS, GV and MCV encodings (ExtremePoint-based packing);

File size: 7.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      SwapSequenceMove ssm = move as SwapSequenceMove;
99      var attributes = tabuList.FindAll(ta => ta.GetType().Equals(move.GetMoveAttributeType()));
100
101      if (sirm != null) {
102        foreach (IItem tabuMove in attributes) {
103          SingleItemRotationMoveAttribute sirmAttr = (tabuMove as SingleItemRotationMoveAttribute);
104          if (sirmAttr != null
105            && (!useAspiration
106                || maximization && moveQuality <= sirmAttr.MoveQuality
107                || !maximization && moveQuality >= sirmAttr.MoveQuality)) {
108                  if (sirm.ItemIndex == sirmAttr.ItemIndex || multiComponentVector.PackingInformations[sirm.ItemIndex].Rotated == sirmAttr.ItemRotation)
109                    isTabu = true;
110          }
111          if (isTabu) break;
112        }
113      } else if (sgm != null) {
114        foreach (IItem tabuMove in attributes) {
115          SingleGroupingMoveAttribute sgmAttr = (tabuMove as SingleGroupingMoveAttribute);
116          if (sgmAttr != null
117            && (!useAspiration
118                || maximization && moveQuality <= sgmAttr.MoveQuality
119                || !maximization && moveQuality >= sgmAttr.MoveQuality)) {
120                  if (sgm.ItemIndex == sgmAttr.ItemIndex || multiComponentVector.PackingInformations[sgm.ItemIndex].AssignedBin == sgmAttr.AssignedBin)
121                    isTabu = true;
122          }
123          if (isTabu) break;
124        }
125      } else if (ssm != null) {
126        foreach (IItem tabuMove in attributes) {
127          SwapSequenceMoveAttribute ssmAttr = (tabuMove as SwapSequenceMoveAttribute);
128          if (ssmAttr != null
129            && (!useAspiration
130                || maximization && moveQuality <= ssmAttr.MoveQuality
131                || !maximization && moveQuality >= ssmAttr.MoveQuality)) {
132                  if (ssm.Index1 == ssmAttr.Index1
133                    || ssm.Index2 == ssmAttr.Index2
134                    || multiComponentVector.PackingInformations[ssm.Index1].ItemIndex == ssmAttr.ItemIndex1
135                    || multiComponentVector.PackingInformations[ssm.Index2].ItemIndex == ssmAttr.ItemIndex2)
136              isTabu = true;
137          }
138          if (isTabu) break;
139        }
140      }
141
142     
143
144      return isTabu;
145    }
146  }
147}
Note: See TracBrowser for help on using the repository browser.