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/PreventReaddInversionMoveTabuChecker.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 deleted Edge1Source-Target is readded
    77             if (attribute.Edge1Source == E1S && attribute.Edge1Target == E2S || attribute.Edge1Source == E2S && attribute.Edge1Target == E1S
    78               || attribute.Edge1Source == E1T && attribute.Edge1Target == E2T || attribute.Edge1Source == E2T && attribute.Edge1Target == E1T
    79               // if previously deleted Edge2Source-Target is readded
    80               || attribute.Edge2Source == E1T && attribute.Edge2Target == E2T || attribute.Edge2Source == E2T && attribute.Edge2Target == E1T
    81               || attribute.Edge2Source == E1S && attribute.Edge2Target == E2S || attribute.Edge2Source == E2S && 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 previously deleted Edge1Source-Target is readded
     78                if (relAttrib.Edge1Source == E1S && relAttrib.Edge1Target == E2S || relAttrib.Edge1Source == E2S && relAttrib.Edge1Target == E1S
     79                  || relAttrib.Edge1Source == E1T && relAttrib.Edge1Target == E2T || relAttrib.Edge1Source == E2T && relAttrib.Edge1Target == E1T
     80                  // if previously deleted Edge2Source-Target is readded
     81                  || relAttrib.Edge2Source == E1T && relAttrib.Edge2Target == E2T || relAttrib.Edge2Source == E2T && relAttrib.Edge2Target == E1T
     82                  || relAttrib.Edge2Source == E1S && relAttrib.Edge2Target == E2S || relAttrib.Edge2Source == E2S && relAttrib.Edge2Target == E1S) {
     83                  isTabu = true;
     84                }
     85              }
    8486            }
    85           }
     87            break;
     88          case PermutationTypes.RelativeDirected: {
     89              int E1S = permutation.GetCircular(move.Index1 - 1);
     90              int E1T = permutation[move.Index1];
     91              int E2S = permutation[move.Index2];
     92              int E2T = permutation.GetCircular(move.Index2 + 1);
     93              InversionMoveRelativeAttribute relAttrib = (tabuMove as InversionMoveRelativeAttribute);
     94              if (relAttrib != null) {
     95                if (relAttrib.Edge1Source == E1S && relAttrib.Edge1Target == E2S
     96                  || relAttrib.Edge1Source == E1T && relAttrib.Edge1Target == E2T
     97                  // if previously deleted Edge2Source-Target is readded
     98                  || relAttrib.Edge2Source == E1T && relAttrib.Edge2Target == E2T
     99                  || relAttrib.Edge2Source == E1S && relAttrib.Edge2Target == E2S) {
     100                  isTabu = true;
     101                }
     102              }
     103            }
     104            break;
     105          case PermutationTypes.Absolute: {
     106              int i1 = move.Index1;
     107              int n1 = permutation[move.Index1];
     108              int i2 = move.Index2;
     109              int n2 = permutation[move.Index2];
     110              InversionMoveAbsoluteAttribute absAttrib = (tabuMove as InversionMoveAbsoluteAttribute);
     111              if (absAttrib != null) {
     112                if ((absAttrib.Index1 == i1 || absAttrib.Index1 == i2) && (absAttrib.Number1 == n1 || absAttrib.Number1 == n2)
     113                  || (absAttrib.Index2 == i2 || absAttrib.Index2 == i1) && (absAttrib.Number2 == n2 || absAttrib.Number2 == n1))
     114                  isTabu = true;
     115
     116              }
     117            }
     118            break;
     119          default: {
     120              throw new InvalidOperationException(Name + ": Unknown permutation type.");
     121            }
    86122        }
     123        if (isTabu) break;
    87124      }
    88125      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
Note: See TracChangeset for help on using the changeset viewer.