Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/PreventDeleteThreeOptTabuMoveEvaluator.cs @ 3221

Last change on this file since 3221 was 3221, checked in by abeham, 14 years ago

updated permutation moves, fixed 3-opt #889

File size: 5.6 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 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;
23using HeuristicLab.Core;
24using HeuristicLab.Data;
25using HeuristicLab.Operators;
26using HeuristicLab.Optimization;
27using HeuristicLab.Parameters;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29
30namespace HeuristicLab.Encodings.PermutationEncoding {
31  [Item("ThreeOptPreventEdgeRemoval", "Prevents deleting of previously added edges.")]
32  [StorableClass]
33  public class PreventDeleteThreeOptTabuMoveEvaluator : SingleSuccessorOperator, IThreeOptPermutationMoveOperator, ITabuMoveEvaluator {
34    public override bool CanChangeName {
35      get { return false; }
36    }
37    public ILookupParameter<ThreeOptMove> ThreeOptMoveParameter {
38      get { return (LookupParameter<ThreeOptMove>)Parameters["ThreeOptMove"]; }
39    }
40    public ILookupParameter<Permutation> PermutationParameter {
41      get { return (LookupParameter<Permutation>)Parameters["Permutation"]; }
42    }
43    public ILookupParameter<ItemList<IItem>> TabuListParameter {
44      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
45    }
46    public ILookupParameter<BoolValue> MoveTabuParameter {
47      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
48    }
49    private ScopeParameter CurrentScopeParameter {
50      get { return (ScopeParameter)Parameters["CurrentScope"]; }
51    }
52
53    public PreventDeleteThreeOptTabuMoveEvaluator()
54      : base() {
55      Parameters.Add(new LookupParameter<ThreeOptMove>("ThreeOptMove", "The move to evaluate."));
56      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
57      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
58      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
59      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope."));
60    }
61
62    public override IOperation Apply() {
63      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
64      ThreeOptMove move = ThreeOptMoveParameter.ActualValue;
65      Permutation permutation = PermutationParameter.ActualValue;
66      int length = permutation.Length;
67      int E1S = permutation.GetCircular(move.Index1 - 1);
68      int E1T = permutation[move.Index1];
69      int E2S = permutation[move.Index2];
70      int E2T = permutation.GetCircular(move.Index2 + 1);
71      int E3S, E3T;
72      if (move.Index3 > move.Index1) {
73        E3S = permutation.GetCircular(move.Index3 + move.Index2 - move.Index1);
74        E3T = permutation.GetCircular(move.Index3 + move.Index2 - move.Index1 + 1);
75      } else {
76        E3S = permutation.GetCircular(move.Index3 - 1);
77        E3T = permutation[move.Index3];
78      }
79      bool isTabu = (move.Index1 == move.Index3
80        || move.Index2 - move.Index1 >= permutation.Length - 2
81        || move.Index1 == permutation.Length - 1 && move.Index3 == 0
82        || move.Index3 == permutation.Length - 1 && move.Index1 == 0);
83      if (!isTabu) {
84        foreach (IItem tabuMove in tabuList) {
85          ThreeOptTabuMoveAttribute attribute = (tabuMove as ThreeOptTabuMoveAttribute);
86          if (attribute != null) {
87            // if previously added Edge3Source-Edge1Target is deleted
88            if (attribute.Edge3Source == E1S && attribute.Edge1Target == E1T || attribute.Edge3Source == E1T && attribute.Edge1Target == E1S
89              || attribute.Edge3Source == E2S && attribute.Edge1Target == E2T || attribute.Edge3Source == E2T && attribute.Edge1Target == E2S
90              || attribute.Edge3Source == E3S && attribute.Edge1Target == E3T || attribute.Edge3Source == E3T && attribute.Edge1Target == E3S
91              // if previously added Edge2Source-Edge3Target is deleted
92              || attribute.Edge2Source == E1S && attribute.Edge3Target == E1T || attribute.Edge2Source == E1T && attribute.Edge3Target == E1S
93              || attribute.Edge2Source == E2S && attribute.Edge3Target == E2T || attribute.Edge2Source == E2T && attribute.Edge3Target == E2S
94              || attribute.Edge2Source == E3S && attribute.Edge3Target == E3T || attribute.Edge2Source == E3T && attribute.Edge3Target == E3S
95              // if previously added Edge1Source-Edge2Target is deleted
96              || attribute.Edge1Source == E1S && attribute.Edge2Target == E1T || attribute.Edge1Source == E1T && attribute.Edge2Target == E1S
97              || attribute.Edge1Source == E2S && attribute.Edge2Target == E2T || attribute.Edge1Source == E2T && attribute.Edge2Target == E2S
98              || attribute.Edge1Source == E3S && attribute.Edge2Target == E3T || attribute.Edge1Source == E3T && attribute.Edge2Target == E3S) {
99              isTabu = true;
100              break;
101            }
102          }
103        }
104      }
105      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
106      return base.Apply();
107    }
108  }
109}
Note: See TracBrowser for help on using the repository browser.