public sealed override IOperation InstrumentedApply()
        {
            if (UseDistanceMatrixParameter.ActualValue.Value)
            {
                Permutation    p  = PermutationParameter.ActualValue;
                DistanceMatrix dm = DistanceMatrixParameter.ActualValue;

                if (dm == null) // calculate distance matrix
                {
                    lock (locker) {
                        dm = DistanceMatrixParameter.ActualValue;
                        if (dm == null) // check again to avoid race condition
                        {
                            DoubleMatrix c = CoordinatesParameter.ActualValue;
                            if (c == null)
                            {
                                throw new InvalidOperationException("Neither a distance matrix nor coordinates were given.");
                            }
                            dm = new DistanceMatrix(c.Rows, c.Rows);
                            for (int i = 0; i < dm.Rows; i++)
                            {
                                for (int j = 0; j < dm.Columns; j++)
                                {
                                    dm[i, j] = CalculateDistance(c[i, 0], c[i, 1], c[j, 0], c[j, 1]);
                                }
                            }
                            DistanceMatrixParameter.ActualValue = (DistanceMatrix)dm.AsReadOnly();
                        }
                    }
                }

                double length = 0;
                for (int i = 0; i < p.Length - 1; i++)
                {
                    length += dm[p[i], p[i + 1]];
                }
                length += dm[p[p.Length - 1], p[0]];
                QualityParameter.ActualValue = new DoubleValue(length);
            }
            else
            {
                Permutation  p = PermutationParameter.ActualValue;
                DoubleMatrix c = CoordinatesParameter.ActualValue;
                if (c == null)
                {
                    throw new InvalidOperationException("No coordinates were given.");
                }
                double length = 0;
                for (int i = 0; i < p.Length - 1; i++)
                {
                    length += CalculateDistance(c[p[i], 0], c[p[i], 1], c[p[i + 1], 0], c[p[i + 1], 1]);
                }
                length += CalculateDistance(c[p[p.Length - 1], 0], c[p[p.Length - 1], 1], c[p[0], 0], c[p[0], 1]);
                QualityParameter.ActualValue = new DoubleValue(length);
            }
            return(base.InstrumentedApply());
        }
예제 #2
0
        private DistanceMatrix CalculateDistanceMatrix(DoubleMatrix c)
        {
            DistanceMatrix distanceMatrix = new DistanceMatrix(c.Rows, c.Rows);

            for (int i = 0; i < distanceMatrix.Rows; i++)
            {
                for (int j = 0; j < distanceMatrix.Columns; j++)
                {
                    distanceMatrix[i, j] = CalculateDistance(c[i, 0], c[i, 1], c[j, 0], c[j, 1]);
                }
            }
            return((DistanceMatrix)distanceMatrix.AsReadOnly());
        }
        private void AfterDeserialization()
        {
            // BackwardsCompatibility3.3
            #region Backwards compatible code (remove with 3.4)
            OptionalValueParameter <DoubleMatrix> oldDistanceMatrixParameter = Parameters["DistanceMatrix"] as OptionalValueParameter <DoubleMatrix>;
            if (oldDistanceMatrixParameter != null)
            {
                Parameters.Remove(oldDistanceMatrixParameter);
                Parameters.Add(new OptionalValueParameter <DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
                DistanceMatrixParameter.GetsCollected = oldDistanceMatrixParameter.GetsCollected;
                DistanceMatrixParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
                if (oldDistanceMatrixParameter.Value != null)
                {
                    DoubleMatrix   oldDM = oldDistanceMatrixParameter.Value;
                    DistanceMatrix newDM = new DistanceMatrix(oldDM.Rows, oldDM.Columns, oldDM.ColumnNames, oldDM.RowNames);
                    newDM.SortableView = oldDM.SortableView;
                    for (int i = 0; i < newDM.Rows; i++)
                    {
                        for (int j = 0; j < newDM.Columns; j++)
                        {
                            newDM[i, j] = oldDM[i, j];
                        }
                    }
                    DistanceMatrixParameter.Value = (DistanceMatrix)newDM.AsReadOnly();
                }
            }

            ValueParameter <DoubleMatrix> oldCoordinates = (Parameters["Coordinates"] as ValueParameter <DoubleMatrix>);
            if (oldCoordinates != null)
            {
                Parameters.Remove(oldCoordinates);
                Parameters.Add(new OptionalValueParameter <DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities.", oldCoordinates.Value)
                {
                    GetsCollected = oldCoordinates.GetsCollected
                });
            }

            if (Operators.Count == 0)
            {
                InitializeOperators();
            }
            #endregion
            RegisterEventHandlers();
        }
예제 #4
0
 private DistanceMatrix CalculateDistanceMatrix(DoubleMatrix c) {
   DistanceMatrix distanceMatrix = new DistanceMatrix(c.Rows, c.Rows);
   for (int i = 0; i < distanceMatrix.Rows; i++) {
     for (int j = 0; j < distanceMatrix.Columns; j++)
       distanceMatrix[i, j] = CalculateDistance(c[i, 0], c[i, 1], c[j, 0], c[j, 1]);
   }
   return (DistanceMatrix)distanceMatrix.AsReadOnly();
 }
    public sealed override IOperation InstrumentedApply() {
      if (UseDistanceMatrixParameter.ActualValue.Value) {
        Permutation p = PermutationParameter.ActualValue;
        DistanceMatrix dm = DistanceMatrixParameter.ActualValue;

        if (dm == null) {  // calculate distance matrix
          lock (locker) {
            dm = DistanceMatrixParameter.ActualValue;
            if (dm == null) {  // check again to avoid race condition
              DoubleMatrix c = CoordinatesParameter.ActualValue;
              if (c == null) throw new InvalidOperationException("Neither a distance matrix nor coordinates were given.");
              dm = new DistanceMatrix(c.Rows, c.Rows);
              for (int i = 0; i < dm.Rows; i++) {
                for (int j = 0; j < dm.Columns; j++)
                  dm[i, j] = CalculateDistance(c[i, 0], c[i, 1], c[j, 0], c[j, 1]);
              }
              DistanceMatrixParameter.ActualValue = (DistanceMatrix)dm.AsReadOnly();
            }
          }
        }

        double length = 0;
        for (int i = 0; i < p.Length - 1; i++)
          length += dm[p[i], p[i + 1]];
        length += dm[p[p.Length - 1], p[0]];
        QualityParameter.ActualValue = new DoubleValue(length);
      } else {
        Permutation p = PermutationParameter.ActualValue;
        DoubleMatrix c = CoordinatesParameter.ActualValue;
        if (c == null) throw new InvalidOperationException("No coordinates were given.");
        double length = 0;
        for (int i = 0; i < p.Length - 1; i++)
          length += CalculateDistance(c[p[i], 0], c[p[i], 1], c[p[i + 1], 0], c[p[i + 1], 1]);
        length += CalculateDistance(c[p[p.Length - 1], 0], c[p[p.Length - 1], 1], c[p[0], 0], c[p[0], 1]);
        QualityParameter.ActualValue = new DoubleValue(length);
      }
      return base.InstrumentedApply();
    }