Exemple #1
0
        public void TestLoopRestricted()
        {
            var graph = new Graph(1);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            graph.AddVertex(3);
            graph.AddVertex(4);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(1, 4, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(2, 3, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(3, 1, EdgeDataSerializer.Serialize(100, 1));

            var dykstra = new Dykstra(graph, (profile) => new Itinero.Profiles.Factor()
            {
                Direction = 0,
                Value     = 1
            }, (vertex) =>
            {
                if (vertex == 0)
                {
                    return(new uint[][] { new uint[] { 0, 1, 4 } });
                }
                return(null);
            },
                                      new EdgePath <float>[]
            {
                new EdgePath <float>(1, 50, 1, new EdgePath <float>()),
                new EdgePath <float>(0, 50, -1, new EdgePath <float>())
            }, float.MaxValue, false);

            dykstra.Run();

            Assert.IsTrue(dykstra.HasRun);
            Assert.IsTrue(dykstra.HasSucceeded);
            EdgePath <float> visit;

            Assert.IsTrue(dykstra.TryGetVisit(-1, out visit) && visit.Weight == 50);
            Assert.IsTrue(dykstra.TryGetVisit(1, out visit) && visit.Weight == 50);
            Assert.IsFalse(dykstra.TryGetVisit(-2, out visit));
            Assert.IsTrue(dykstra.TryGetVisit(2, out visit) && visit.Weight == 450);
            Assert.IsTrue(dykstra.TryGetVisit(-3, out visit) && visit.Weight == 350);
            Assert.IsTrue(dykstra.TryGetVisit(3, out visit) && visit.Weight == 150);
            Assert.IsTrue(dykstra.TryGetVisit(-4, out visit) && visit.Weight == 250);
            Assert.IsTrue(dykstra.TryGetVisit(4, out visit) && visit.Weight == 250);
            Assert.IsTrue(dykstra.TryGetVisit(-5, out visit) && visit.Weight == 150);
            Assert.IsTrue(dykstra.TryGetVisit(4, out visit) && visit.Weight == 250);
        }
Exemple #2
0
        public void TestOneEdge()
        {
            // build graph.
            var graph = new Graph(EdgeDataSerializer.Size);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, Itinero.Profiles.Factor> getFactor = (x) =>
            {
                return(new Itinero.Profiles.Factor()
                {
                    Direction = 0,
                    Value = 1.0f / speed
                });
            };

            // run algorithm.
            var algorithm = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(0) },
                                        float.MaxValue, false);

            algorithm.Run();

            Assert.IsTrue(algorithm.HasRun);
            Assert.IsTrue(algorithm.HasSucceeded);

            EdgePath <float> visit;

            Assert.IsTrue(algorithm.TryGetVisit(0, out visit));
            Assert.AreEqual(null, visit.From);
            Assert.AreEqual(0, visit.Vertex);
            Assert.AreEqual(0, visit.Weight);
            Assert.IsTrue(algorithm.TryGetVisit(1, out visit));
            Assert.AreEqual(0, visit.From.Vertex);
            Assert.AreEqual(1, visit.Vertex);
            Assert.AreEqual(100 / speed, visit.Weight);
        }
Exemple #3
0
        public void TestOneHopRestricted()
        {
            var graph = new Graph(1);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(100, 1));

            var dykstra = new Dykstra(graph, (profile) => new Itinero.Profiles.Factor()
            {
                Direction = 0,
                Value     = 1
            }, (vertex) =>
            {
                if (vertex == 1)
                {
                    return(new uint [][] { new uint[] { 1 } });
                }
                return(null);
            },
                                      new EdgePath <float>[]
            {
                new EdgePath <float>(0, 50, 1, new EdgePath <float>()),
                new EdgePath <float>(1, 50, -1, new EdgePath <float>())
            }, float.MaxValue, false);

            dykstra.Run();

            Assert.IsTrue(dykstra.HasRun);
            Assert.IsTrue(dykstra.HasSucceeded);
            EdgePath <float> visit;

            Assert.IsTrue(dykstra.TryGetVisit(-1, out visit));
            Assert.AreEqual(-1, visit.Edge);
            Assert.AreEqual(50, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(1, out visit));
            Assert.AreEqual(1, visit.Edge);
            Assert.AreEqual(50, visit.Weight);
            Assert.IsFalse(dykstra.TryGetVisit(2, out visit));
            Assert.IsFalse(dykstra.TryGetVisit(-2, out visit));
        }
Exemple #4
0
 /// <summary>
 /// Called when target was found.
 /// </summary>
 public bool TargetWasFound(uint vertex, float weight)
 {
     if (!this.HasSucceeded)
     { // not succeeded yet.
         // check forward search for the same vertex.
         EdgePath <float> forwardVisit;
         if (_sourceSearch.TryGetVisit(vertex, out forwardVisit))
         { // there is a status for this vertex in the source search.
             weight = weight + forwardVisit.Weight;
             if (weight < _bestWeight)
             { // this vertex is a better match.
                 _bestWeight       = weight;
                 _bestVertex       = vertex;
                 this.HasSucceeded = true;
             }
         }
     }
     return(false);
 }
Exemple #5
0
        /// <summary>
        /// Gets the path from source->target.
        /// </summary>
        /// <returns></returns>
        public EdgePath <float> GetPath()
        {
            if (!this.HasSucceeded)
            {
                throw new Exception("No results available, algorithm was not successful!");
            }

            EdgePath <float> fromSource;
            EdgePath <float> toTarget;

            if (_sourceSearch.TryGetVisit(_bestVertex, out fromSource) &&
                _targetSearch.TryGetVisit(_bestVertex, out toTarget))
            {
                return(fromSource.Append(toTarget));
            }
            throw new InvalidOperationException("No path could be found to/from source/target.");
        }
Exemple #6
0
        public void TestTriangle()
        {
            var graph = new Graph(1);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(100, 1));
            graph.AddEdge(2, 0, EdgeDataSerializer.Serialize(100, 1));

            var dykstra = new Dykstra(graph, (profile) => new Itinero.Profiles.Factor()
            {
                Direction = 0,
                Value     = 1
            }, null,
                                      new EdgePath <float>[]
            {
                new EdgePath <float>(0, 50, 1, new EdgePath <float>()),
                new EdgePath <float>(1, 50, -1, new EdgePath <float>())
            }, float.MaxValue, false);

            dykstra.Run();

            Assert.IsTrue(dykstra.HasRun);
            Assert.IsTrue(dykstra.HasSucceeded);
            EdgePath <float> visit;

            Assert.IsTrue(dykstra.TryGetVisit(-1, out visit));
            Assert.AreEqual(-1, visit.Edge);
            Assert.AreEqual(50, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(1, out visit));
            Assert.AreEqual(1, visit.Edge);
            Assert.AreEqual(50, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(2, out visit));
            Assert.AreEqual(2, visit.Edge);
            Assert.AreEqual(150, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(-2, out visit));
            Assert.AreEqual(-2, visit.Edge);
            Assert.AreEqual(250, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(3, out visit));
            Assert.AreEqual(3, visit.Edge);
            Assert.AreEqual(250, visit.Weight);
            Assert.IsTrue(dykstra.TryGetVisit(-3, out visit));
            Assert.AreEqual(-3, visit.Edge);
            Assert.AreEqual(150, visit.Weight);
        }
Exemple #7
0
 /// <summary>
 /// Called when source was found.
 /// </summary>
 public bool SourceWasFound(uint vertex, float weight)
 {
     if (_targets.Contains(vertex))
     {
         EdgePath <float> path;
         if (_search.TryGetVisit(vertex, out path))
         {
             for (var i = 0; i < _targetPaths.Length; i++)
             {
                 if (_targetPaths[i].Vertex == vertex &&
                     _targetPaths[i].Weight + weight < _bestWeight)
                 {
                     _best             = path;
                     _bestWeight       = _targetPaths[i].Weight + weight;
                     _bestVertex       = _targetPaths[i].Vertex;
                     this.HasSucceeded = true;
                 }
             }
         }
     }
     return(false);
 }
Exemple #8
0
        public void TestSourceBetween()
        {
            // build graph.
            var graph = new Graph(EdgeDataSerializer.Size);

            graph.AddVertex(0);
            graph.AddVertex(1);
            graph.AddVertex(2);
            graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));
            graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));
            graph.AddEdge(0, 2, EdgeDataSerializer.Serialize(new EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }));

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, Factor> getFactor = (x) =>
            {
                return(new Factor()
                {
                    Direction = 1,
                    Value = 1.0f / speed
                });
            };

            // run algorithm.
            var algorithm = new Dykstra(graph, getFactor, null, new EdgePath <float>[] {
                new EdgePath <float>(0, 10 / speed, new EdgePath <float>(uint.MaxValue)),
                new EdgePath <float>(1, 90 / speed, new EdgePath <float>(uint.MaxValue))
            },
                                        float.MaxValue, new List <uint>(), false);

            algorithm.Run();

            Assert.IsTrue(algorithm.HasRun);
            Assert.IsTrue(algorithm.HasSucceeded);

            EdgePath <float> visit;

            Assert.IsTrue(algorithm.TryGetVisit(0, out visit));
            Assert.IsNotNull(visit.From);
            Assert.AreEqual(uint.MaxValue, visit.From.Vertex);
            Assert.AreEqual(0, visit.Vertex);
            Assert.AreEqual(10 / speed, visit.Weight);
            Assert.IsTrue(algorithm.TryGetVisit(1, out visit));
            Assert.IsNotNull(visit.From);
            Assert.AreEqual(uint.MaxValue, visit.From.Vertex);
            Assert.AreEqual(1, visit.Vertex);
            Assert.AreEqual(90 / speed, visit.Weight);
            Assert.IsTrue(algorithm.TryGetVisit(2, out visit));
            Assert.IsNotNull(visit.From);
            Assert.AreEqual(0, visit.From.Vertex);
            Assert.AreEqual(2, visit.Vertex);
            Assert.AreEqual(110 / speed, visit.Weight);
        }