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); }
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); }
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)); }
/// <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); }
/// <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."); }
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); }
/// <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); }
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); }