public static double EvaluateByCoordinates(Permutation permutation, TranslocationMove move, DoubleMatrix coordinates, TSPTranslocationMovePathEvaluator evaluator) {
      if (move.Index1 == move.Index3
        || move.Index2 == permutation.Length - 1 && move.Index3 == 0
        || move.Index1 == 0 && move.Index3 == permutation.Length - 1 - move.Index2) return 0;

      int edge1source = permutation.GetCircular(move.Index1 - 1);
      int edge1target = permutation[move.Index1];
      int edge2source = permutation[move.Index2];
      int edge2target = permutation.GetCircular(move.Index2 + 1);
      int edge3source, edge3target;
      if (move.Index3 > move.Index1) {
        edge3source = permutation.GetCircular(move.Index3 + move.Index2 - move.Index1);
        edge3target = permutation.GetCircular(move.Index3 + move.Index2 - move.Index1 + 1);
      } else {
        edge3source = permutation.GetCircular(move.Index3 - 1);
        edge3target = permutation[move.Index3];
      }
      double moveQuality = 0;
      // remove three edges
      moveQuality -= evaluator.CalculateDistance(coordinates[edge1source, 0], coordinates[edge1source, 1],
        coordinates[edge1target, 0], coordinates[edge1target, 1]);
      moveQuality -= evaluator.CalculateDistance(coordinates[edge2source, 0], coordinates[edge2source, 1],
        coordinates[edge2target, 0], coordinates[edge2target, 1]);
      moveQuality -= evaluator.CalculateDistance(coordinates[edge3source, 0], coordinates[edge3source, 1],
        coordinates[edge3target, 0], coordinates[edge3target, 1]);
      // add three edges
      moveQuality += evaluator.CalculateDistance(coordinates[edge3source, 0], coordinates[edge3source, 1],
        coordinates[edge1target, 0], coordinates[edge1target, 1]);
      moveQuality += evaluator.CalculateDistance(coordinates[edge2source, 0], coordinates[edge2source, 1],
        coordinates[edge3target, 0], coordinates[edge3target, 1]);
      moveQuality += evaluator.CalculateDistance(coordinates[edge1source, 0], coordinates[edge1source, 1],
        coordinates[edge2target, 0], coordinates[edge2target, 1]);
      return moveQuality;
    }
        public override IOperation Apply()
        {
            var    permutation = PermutationParameter.ActualValue;
            double relativeQualityDifference = 0;
            var    distanceMatrix            = DistanceMatrixParameter.ActualValue;

            if (distanceMatrix == null)
            {
                throw new InvalidOperationException("The distance matrix is not given.");
            }
            var move = TranslocationMoveParameter.ActualValue;

            relativeQualityDifference = TSPTranslocationMovePathEvaluator.EvaluateByDistanceMatrix(permutation, move, distanceMatrix);

            var moveQuality = MoveQualityParameter.ActualValue;

            if (moveQuality == null)
            {
                MoveQualityParameter.ActualValue = new DoubleValue(QualityParameter.ActualValue.Value + relativeQualityDifference);
            }
            else
            {
                moveQuality.Value = QualityParameter.ActualValue.Value + relativeQualityDifference;
            }
            return(base.Apply());
        }
 protected TSPTranslocationMovePathEvaluator(TSPTranslocationMovePathEvaluator original, Cloner cloner) : base(original, cloner) { }
Example #4
0
        public static double EvaluateByCoordinates(Permutation permutation, TranslocationMove move, DoubleMatrix coordinates, TSPTranslocationMovePathEvaluator evaluator)
        {
            if (move.Index1 == move.Index3 ||
                move.Index2 == permutation.Length - 1 && move.Index3 == 0 ||
                move.Index1 == 0 && move.Index3 == permutation.Length - 1 - move.Index2)
            {
                return(0);
            }

            int edge1source = permutation.GetCircular(move.Index1 - 1);
            int edge1target = permutation[move.Index1];
            int edge2source = permutation[move.Index2];
            int edge2target = permutation.GetCircular(move.Index2 + 1);
            int edge3source, edge3target;

            if (move.Index3 > move.Index1)
            {
                edge3source = permutation.GetCircular(move.Index3 + move.Index2 - move.Index1);
                edge3target = permutation.GetCircular(move.Index3 + move.Index2 - move.Index1 + 1);
            }
            else
            {
                edge3source = permutation.GetCircular(move.Index3 - 1);
                edge3target = permutation[move.Index3];
            }
            double moveQuality = 0;

            // remove three edges
            moveQuality -= evaluator.CalculateDistance(coordinates[edge1source, 0], coordinates[edge1source, 1],
                                                       coordinates[edge1target, 0], coordinates[edge1target, 1]);
            moveQuality -= evaluator.CalculateDistance(coordinates[edge2source, 0], coordinates[edge2source, 1],
                                                       coordinates[edge2target, 0], coordinates[edge2target, 1]);
            moveQuality -= evaluator.CalculateDistance(coordinates[edge3source, 0], coordinates[edge3source, 1],
                                                       coordinates[edge3target, 0], coordinates[edge3target, 1]);
            // add three edges
            moveQuality += evaluator.CalculateDistance(coordinates[edge3source, 0], coordinates[edge3source, 1],
                                                       coordinates[edge1target, 0], coordinates[edge1target, 1]);
            moveQuality += evaluator.CalculateDistance(coordinates[edge2source, 0], coordinates[edge2source, 1],
                                                       coordinates[edge3target, 0], coordinates[edge3target, 1]);
            moveQuality += evaluator.CalculateDistance(coordinates[edge1source, 0], coordinates[edge1source, 1],
                                                       coordinates[edge2target, 0], coordinates[edge2target, 1]);
            return(moveQuality);
        }
Example #5
0
 protected TSPTranslocationMovePathEvaluator(TSPTranslocationMovePathEvaluator original, Cloner cloner) : base(original, cloner)
 {
 }