示例#1
0
        public void TravellingSalesman_Smoke_Test()
        {
            var graph = new WeightedDiGraph <int, int>();

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            graph.AddVertex(3);

            graph.AddEdge(0, 1, 1);
            graph.AddEdge(0, 2, 15);
            graph.AddEdge(0, 3, 6);

            graph.AddEdge(1, 0, 2);
            graph.AddEdge(1, 2, 7);
            graph.AddEdge(1, 3, 3);

            graph.AddEdge(2, 0, 9);
            graph.AddEdge(2, 1, 6);
            graph.AddEdge(2, 3, 12);

            graph.AddEdge(3, 0, 10);
            graph.AddEdge(3, 1, 4);
            graph.AddEdge(3, 2, 8);

            Assert.AreEqual(21, TravellingSalesman.GetMinWeight(graph));
        }
示例#2
0
        public void ThreeCitiesInATriangle_CorrectlyCalculatesDistances(params double[][] cityLocations)
        {
            var tsp = new TravellingSalesman("Test Triangle", cityLocations,
                                             DecisionVector.CreateFromArray(DecisionSpace.CreateForUniformIntArray(4, 0, 2), new[] { 0, 1, 2, 0 }));

            Assert.Equal(12.0, tsp.Evaluate(tsp.GetGlobalOptimum()).ElementAt(0));
        }
 public TravellingSalesmanSolver()
 {
     Problem    = new TravellingSalesman();
     population = new Population();
     population.NumberOfIndividuals = 100;
     population.NumberOfObjects     = 100;
 }
        public void TravellingSalesman_AdjacencyMatrixGraph_Smoke_Test()
        {
            var graph = new Advanced.Algorithms.DataStructures.Graph.AdjacencyMatrix.WeightedDiGraph <int, int>();

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            graph.AddVertex(3);

            graph.AddEdge(0, 1, 1);
            graph.AddEdge(0, 2, 15);
            graph.AddEdge(0, 3, 6);

            graph.AddEdge(1, 0, 2);
            graph.AddEdge(1, 2, 7);
            graph.AddEdge(1, 3, 3);

            graph.AddEdge(2, 0, 9);
            graph.AddEdge(2, 1, 6);
            graph.AddEdge(2, 3, 12);

            graph.AddEdge(3, 0, 10);
            graph.AddEdge(3, 1, 4);
            graph.AddEdge(3, 2, 8);

            var tsp = new TravellingSalesman <int, int>();

            Assert.AreEqual(21, tsp.FindMinWeight(graph, new TSPShortestPathOperators()));
        }
示例#5
0
        public void ConstructedFromFile_LoadsCorrectly()
        {
            var problemFilePath = Path.Combine(Directory.GetCurrentDirectory(),
                                               "SingleObjective", "Discrete", "Resources", "ulysses16.tsp");

            var tsp = TravellingSalesman.CreateFromFile(problemFilePath);

            Assert.Equal(17, tsp.GetGlobalOptimum().Count);
        }
        public void Init(Random gen)
        {
            this.gen = gen;

            problem = new TravellingSalesman();
            problem.LoadTownsFromFile(DataDir.Towns);

            solver = new RandomOptimization <List <Town> >(gen);
            solver.ProblemSpace = problem.Towns;
            solver.CycleLimit   = 1000;
            solver.Dice         = 3;
            solver.Max          = 300;

            solver.GenerateRandomStart = (towns) =>
            {
                var route = new List <Town>();

                foreach (var town in solver.ProblemSpace)
                {
                    var index = gen.Next(0, route.Count);
                    route.Insert(index, town);
                }

                return(route);
            };

            solver.TakeRandomStepWithinRange = (route, epsilon) =>
            {
                var alternativeRoute = new List <Town>(route);

                // take a random city, put it next to a close one
                var choice = alternativeRoute[gen.Next(0, alternativeRoute.Count)];
                alternativeRoute.Remove(choice);

                var inRange = route.Where(x => x.Distance(choice) <= epsilon).ToList();
                inRange.Remove(choice);
                var index = alternativeRoute.IndexOf(inRange.First());
                alternativeRoute.Insert(index, choice);

                return(alternativeRoute);
            };

            double acceptableLength = 10;

            solver.StopCondition = (route) =>
            {
                return(problem.Objective(route) < acceptableLength);
            };

            solver.Fitness = (route) =>
            {
                return(problem.Objective(route));
            };
        }
        public void GivenGraph_WhenGetCheapestPathIsInvoked_NullIsReturned(int graphNumber, string expectedPath, int expectedWeight)
        {
            // Arrange
            var graph = GetGraph(graphNumber);

            // Act
            var result = TravellingSalesman.GetCheapestPathThroughAllPoints(graph);

            // Assert
            Assert.Equal(expectedPath, result.Path);
            Assert.Equal(expectedWeight, result.Weight);
        }
        public float SolveTravelingSalesman()
        {
            var tsp = new TravellingSalesman();

            var pointsCount = _ys.Length;

            Vector2[] points = new Vector2[pointsCount];

            for (int i = 0; i < pointsCount; i++)
            {
                points[i] = new Vector2((float)_xs[i], (float)_ys[i]);
            }

            var(pathlength, optimalPath) = tsp.GetTourPathLengthToLastNode(points);
            return(pathlength);
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Travelling salesman.");

            var graph = new Dictionary <string, Dictionary <string, int> >();

            AddCity(graph);

            var stopwatch = new Stopwatch();

            for (var i = 1; i <= 10; i++)
            {
                AddCity(graph);

                stopwatch.Restart();
                var result = TravellingSalesman.GetCheapestPathThroughAllPoints(graph);
                stopwatch.Stop();
                Console.WriteLine($"Result with {graph.Count} cities: {result}.  Time taken: {stopwatch.ElapsedMilliseconds}");
            }

            Console.ReadLine();
        }
示例#10
0
        public void InvalidRoutes_ThrowError()
        {
            var correctDs = DecisionSpace.CreateForUniformIntArray(3, 0, 1);

            var tsp = new TravellingSalesman("A Tale of Two Cities", new List <double[]>()
            {
                new[] { 0.0, 0 }, new[] { 1.0, 0 }
            },
                                             DecisionVector.CreateFromArray(DecisionSpace.CreateForUniformIntArray(3, 0, 2), new[] { 0, 1, 0 }));

            // Empty route
            Assert.Throws <ArgumentOutOfRangeException>(() => tsp.Evaluate(DecisionVector.CreateForEmpty()));

            // Route that is too long with location (2) that doesn't exist
            Assert.Throws <ArgumentOutOfRangeException>(() => tsp.Evaluate(
                                                            DecisionVector.CreateFromArray(DecisionSpace.CreateForUniformIntArray(4, 0, 2),
                                                                                           new[] { 0, 2, 1, 0 })));

            // Route with location (2) that doesn't exist
            Assert.Throws <ArgumentOutOfRangeException>(() => tsp.Evaluate(
                                                            DecisionVector.CreateFromArray(correctDs,
                                                                                           new[] { 0, 2, 0 })));
        }