Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/30/10 14:52:30 (14 years ago)
Author:
abeham
Message:

Updated inversion moves to respect different types of permutation #889

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/PreventRemovalInversionMoveTabuChecker.cs

    r3232 r3233  
    6565      Permutation permutation = PermutationParameter.ActualValue;
    6666      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       bool isTabu = (move.Index2 - move.Index1 >= length - 2); // doesn't change the solution
    72       if (!isTabu) {
    73         foreach (IItem tabuMove in tabuList) {
    74           InversionMoveAttribute attribute = (tabuMove as InversionMoveAttribute);
    75           if (attribute != null) {
    76             // if previously added Edge1Source-Edge2Source is deleted
    77             if (attribute.Edge1Source == E1S && attribute.Edge2Source == E1T || attribute.Edge1Source == E1T && attribute.Edge2Source == E1S
    78               || attribute.Edge1Source == E2S && attribute.Edge2Source == E2T || attribute.Edge1Source == E2T && attribute.Edge2Source == E2S
    79               // if previously added Edge1Target-Edge2Target is deleted
    80               || attribute.Edge1Target == E2S && attribute.Edge2Target == E2T || attribute.Edge1Target == E2T && attribute.Edge2Target == E2S
    81               || attribute.Edge1Target == E1S && attribute.Edge2Target == E1T || attribute.Edge1Target == E1T && attribute.Edge2Target == E1S) {
    82               isTabu = true;
    83               break;
     67      bool isTabu = false;
     68      foreach (IItem tabuMove in tabuList) {
     69        switch (permutation.PermutationType) {
     70          case PermutationTypes.RelativeUndirected: {
     71              int E1S = permutation.GetCircular(move.Index1 - 1);
     72              int E1T = permutation[move.Index1];
     73              int E2S = permutation[move.Index2];
     74              int E2T = permutation.GetCircular(move.Index2 + 1);
     75              InversionMoveRelativeAttribute relAttrib = (tabuMove as InversionMoveRelativeAttribute);
     76              if (relAttrib != null) {
     77                if (relAttrib.Edge1Source == E1S && relAttrib.Edge2Source == E1T || relAttrib.Edge1Source == E1T && relAttrib.Edge2Source == E1S
     78                  || relAttrib.Edge1Source == E2S && relAttrib.Edge2Source == E2T || relAttrib.Edge1Source == E2T && relAttrib.Edge2Source == E2S
     79                  // if previously added Edge1Target-Edge2Target is deleted
     80                  || relAttrib.Edge1Target == E2S && relAttrib.Edge2Target == E2T || relAttrib.Edge1Target == E2T && relAttrib.Edge2Target == E2S
     81                  || relAttrib.Edge1Target == E1S && relAttrib.Edge2Target == E1T || relAttrib.Edge1Target == E1T && relAttrib.Edge2Target == E1S) {
     82                  isTabu = true;
     83                }
     84              }
    8485            }
    85           }
     86            break;
     87          case PermutationTypes.RelativeDirected: {
     88              int E1S = permutation.GetCircular(move.Index1 - 1);
     89              int E1T = permutation[move.Index1];
     90              int E2S = permutation[move.Index2];
     91              int E2T = permutation.GetCircular(move.Index2 + 1);
     92              InversionMoveRelativeAttribute relAttrib = (tabuMove as InversionMoveRelativeAttribute);
     93              if (relAttrib != null) {
     94                if (relAttrib.Edge1Source == E1S && relAttrib.Edge2Source == E1T
     95                  || relAttrib.Edge1Source == E2S && relAttrib.Edge2Source == E2T
     96                  // if previously added Edge1Target-Edge2Target is deleted
     97                  || relAttrib.Edge1Target == E2S && relAttrib.Edge2Target == E2T
     98                  || relAttrib.Edge1Target == E1S && relAttrib.Edge2Target == E1T) {
     99                  isTabu = true;
     100                }
     101              }
     102            }
     103            break;
     104          case PermutationTypes.Absolute: {
     105              int i1 = move.Index1;
     106              int n1 = permutation[move.Index1];
     107              int i2 = move.Index2;
     108              int n2 = permutation[move.Index2];
     109              InversionMoveAbsoluteAttribute absAttrib = (tabuMove as InversionMoveAbsoluteAttribute);
     110              if (absAttrib != null) {
     111                if (absAttrib.Number1 == n1 || absAttrib.Number1 == n2
     112                  || absAttrib.Number2 == n2 || absAttrib.Number2 == n1)
     113                  isTabu = true;
     114
     115              }
     116            }
     117            break;
     118          default: {
     119              throw new InvalidOperationException(Name + ": Unknown permutation type.");
     120            }
    86121        }
     122        if (isTabu) break;
    87123      }
    88124      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
Note: See TracChangeset for help on using the changeset viewer.