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()); }
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(); }
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(); }