//#region License Information ///* HeuristicLab // * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL) // * // * This file is part of HeuristicLab. // * // * HeuristicLab is free software: you can redistribute it and/or modify // * it under the terms of the GNU General Public License as published by // * the Free Software Foundation, either version 3 of the License, or // * (at your option) any later version. // * // * HeuristicLab is distributed in the hope that it will be useful, // * but WITHOUT ANY WARRANTY; without even the implied warranty of // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // * GNU General Public License for more details. // * // * You should have received a copy of the GNU General Public License // * along with HeuristicLab. If not, see . // */ //#endregion //using System; //using HeuristicLab.Common; //using HeuristicLab.Core; //using HeuristicLab.Data; //using HeuristicLab.Encodings.PermutationEncoding; //using HeuristicLab.Random; //using Microsoft.VisualStudio.TestTools.UnitTesting; //namespace HeuristicLab.Problems.PTSP.Tests { // /// // ///This is a test class for PTSP move evaluators // /// // [TestClass()] // public class PTSPMoveEvaluatorTest { // private const int ProblemSize = 10; // private const int RealizationsSize = 100; // private static DoubleMatrix coordinates; // private static DistanceMatrix distances; // private static Permutation tour; // private static MersenneTwister random; // private static ItemList realizations; // private static DoubleArray probabilities; // [ClassInitialize] // public static void MyClassInitialize(TestContext testContext) { // random = new MersenneTwister(); // coordinates = new DoubleMatrix(ProblemSize, 2); // distances = new DistanceMatrix(ProblemSize, ProblemSize); // for (var i = 0; i < ProblemSize; i++) { // coordinates[i, 0] = random.Next(ProblemSize * 10); // coordinates[i, 1] = random.Next(ProblemSize * 10); // } // for (var i = 0; i < ProblemSize - 1; i++) { // for (var j = i + 1; j < ProblemSize; j++) { // distances[i, j] = Math.Round(Math.Sqrt(Math.Pow(coordinates[i, 0] - coordinates[j, 0], 2) + Math.Pow(coordinates[i, 1] - coordinates[j, 1], 2))); // distances[j, i] = distances[i, j]; // } // } // probabilities = new DoubleArray(ProblemSize); // for (var i = 0; i < ProblemSize; i++) { // probabilities[i] = random.NextDouble(); // } // realizations = new ItemList(RealizationsSize); // for (var i = 0; i < RealizationsSize; i++) { // var countOnes = 0; // var newRealization = new BoolArray(ProblemSize); // while (countOnes < 4) { //only generate realizations with at least 4 cities visited // countOnes = 0; // for (var j = 0; j < ProblemSize; j++) { // newRealization[j] = random.NextDouble() < probabilities[j]; // if (newRealization[j]) countOnes++; // } // } // realizations.Add(newRealization); // } // tour = new Permutation(PermutationTypes.RelativeUndirected, ProblemSize, random); // } // [TestMethod] // [TestCategory("Problems.ProbabilisticTravelingSalesman")] // [TestProperty("Time", "short")] // public void InversionMoveEvaluatorTest() { // Func distance = (a, b) => distances[a, b]; // double variance; // var beforeMatrix = EstimatedProbabilisticTravelingSalesmanProblem.Evaluate(tour, distance, realizations, out variance); // for (var i = 0; i < 500; i++) { // var move = StochasticInversionSingleMoveGenerator.Apply(tour, random); // var moveMatrix = PTSPEstimatedInversionMoveEvaluator.EvaluateMove(tour, move, distance, realizations); // InversionManipulator.Apply(tour, move.Index1, move.Index2); // var afterMatrix = EstimatedProbabilisticTravelingSalesmanProblem.Evaluate(tour, distance, realizations, out variance); // Assert.IsTrue(Math.Abs(moveMatrix).IsAlmost(Math.Abs(afterMatrix - beforeMatrix)), // string.Format(@"Inversion move is calculated with quality {0}, but actual difference is {4}. //The move would invert the tour {1} between values {2} and {3}.", // moveMatrix, tour, tour[move.Index1], tour[move.Index2], Math.Abs(afterMatrix - beforeMatrix))); // beforeMatrix = afterMatrix; // } // } // [TestMethod] // [TestCategory("Problems.ProbabilisticTravelingSalesman")] // [TestProperty("Time", "short")] // public void InsertionMoveEvaluatorTest() { // Func distance = (a, b) => distances[a, b]; // double variance; // var beforeMatrix = EstimatedProbabilisticTravelingSalesmanProblem.Evaluate(tour, distance, realizations, out variance); // for (var i = 0; i < 500; i++) { // var move = StochasticTranslocationSingleMoveGenerator.Apply(tour, random); // var moveMatrix = PTSPEstimatedInsertionMoveEvaluator.EvaluateMove(tour, move, distance, realizations); // TranslocationManipulator.Apply(tour, move.Index1, move.Index1, move.Index3); // var afterMatrix = EstimatedProbabilisticTravelingSalesmanProblem.Evaluate(tour, distance, realizations, out variance); // Assert.IsTrue(Math.Abs(moveMatrix).IsAlmost(Math.Abs(afterMatrix - beforeMatrix)), // string.Format(@"Insertion move is calculated with quality {0}, but actual difference is {4}. //The move would invert the tour {1} between values {2} and {3}.", // moveMatrix, tour, tour[move.Index1], tour[move.Index2], Math.Abs(afterMatrix - beforeMatrix))); // beforeMatrix = afterMatrix; // } // } // } //}