From 6ad007492c672ebf9a1993eeab34b979f7f3082f Mon Sep 17 00:00:00 2001 From: OmidRezaei Date: Mon, 13 May 2019 11:31:23 +0430 Subject: [PATCH] Dijkstra Dijkstra Tests And Implementation Finished --- .../Dijkstra/DijkstraAlgorithm.java | 22 +++++++++---------- .../Dijkstra/DijkstraAlgorithmTest.java | 20 +++++++++++++++++ .../src/algorithms/Dijkstra/GraphBuilder.java | 2 +- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/Graph/src/algorithms/Dijkstra/DijkstraAlgorithm.java b/Graph/src/algorithms/Dijkstra/DijkstraAlgorithm.java index e1718b2..7b6645a 100644 --- a/Graph/src/algorithms/Dijkstra/DijkstraAlgorithm.java +++ b/Graph/src/algorithms/Dijkstra/DijkstraAlgorithm.java @@ -29,18 +29,18 @@ public static PathDataObject FindShortestPath(GraphObject graph, NodeGraphObject ArrayList navigatedNodes = new ArrayList<>(); PathDataObject pathData = new PathDataObject(nodes, sourceNode, targetNode); - NodeGraphObject leastDistantNode = pathData.GetClosestNode(nodes); - - nodes.remove(leastDistantNode); - navigatedNodes.add(leastDistantNode); - - for (NodeGraphObject adjacentNode : leastDistantNode.getAttachedNodes().keySet()) { - double currentDistance = pathData.GetDistanceToNode(leastDistantNode) + leastDistantNode.getAttachedNodes().get(adjacentNode).getWeight(); - if (currentDistance < pathData.GetDistanceToNode(adjacentNode)) { - pathData.distances.put(adjacentNode, currentDistance); - adjacentNode.setPreviousNodeInPath(leastDistantNode); + do { + NodeGraphObject leastDistantNode = pathData.GetClosestNode(nodes); + nodes.remove(leastDistantNode); + navigatedNodes.add(leastDistantNode); + for (NodeGraphObject adjacentNode : leastDistantNode.getAttachedNodes().keySet()) { + double currentDistance = pathData.GetDistanceToNode(leastDistantNode) + leastDistantNode.getAttachedNodes().get(adjacentNode).getWeight(); + if (currentDistance < pathData.GetDistanceToNode(adjacentNode)) { + pathData.distances.put(adjacentNode, currentDistance); + adjacentNode.setPreviousNodeInPath(leastDistantNode); + } } - } + } while (!nodes.isEmpty()); return pathData; } diff --git a/Graph/src/algorithms/Dijkstra/DijkstraAlgorithmTest.java b/Graph/src/algorithms/Dijkstra/DijkstraAlgorithmTest.java index c041773..f42d124 100644 --- a/Graph/src/algorithms/Dijkstra/DijkstraAlgorithmTest.java +++ b/Graph/src/algorithms/Dijkstra/DijkstraAlgorithmTest.java @@ -70,6 +70,26 @@ void GraphWith3Nodes_StartIs0_DistanceIs2_All() { Assertions.assertEquals(0, pathData.GetDistanceToNode(graph.getNode("0"))); Assertions.assertEquals(2, pathData.GetDistanceToNode(graph.getNode("1"))); Assertions.assertEquals(2, pathData.GetDistanceToNode(graph.getNode("2"))); + } + + @Test + void GraphWith6Nodes_StartIs1To5_Some() { + String[] sourceIDs = {"1", "1", "0", "4", "3", "3", "3", "2", "2"}; + String[] targetIDs = {"0", "3", "4", "0", "0", "4", "5", "3", "5"}; + double[] weights = {4, 1, 2, 3, 5, 2, 1, 3, 4}; + graph = GraphBuilder.Build().WithNodes(6).SomeConnected(sourceIDs, targetIDs, weights).getGraph(); + PathDataObject pathData = DijkstraAlgorithm.FindShortestPath(graph, "1", "5"); + + Assertions.assertEquals(6, pathData.distances.size()); + Assertions.assertEquals(Double.POSITIVE_INFINITY, pathData.GetDistanceToNode(graph.getNode("2"))); + Assertions.assertEquals(4, pathData.GetDistanceToNode(graph.getNode("0"))); + Assertions.assertEquals(0, pathData.GetDistanceToNode(graph.getNode("1"))); + Assertions.assertEquals(1, pathData.GetDistanceToNode(graph.getNode("3"))); + Assertions.assertEquals(3, pathData.GetDistanceToNode(graph.getNode("4"))); + Assertions.assertEquals(2, pathData.GetDistanceToNode(graph.getNode("5"))); + NodeGraphObject[] nodes = {graph.getNode("1"), graph.getNode("3"), graph.getNode("5")}; + Assertions.assertArrayEquals(nodes, pathData.GetPathNodesToNode(graph.getNode("5")).toArray()); + Assertions.assertArrayEquals(nodes, pathData.GetPathNodesToTargetNode().toArray()); } } \ No newline at end of file diff --git a/Graph/src/algorithms/Dijkstra/GraphBuilder.java b/Graph/src/algorithms/Dijkstra/GraphBuilder.java index 02702bf..444ed6b 100644 --- a/Graph/src/algorithms/Dijkstra/GraphBuilder.java +++ b/Graph/src/algorithms/Dijkstra/GraphBuilder.java @@ -29,7 +29,7 @@ public GraphBuilder AllConnected(double weight) { return this; } - public GraphBuilder SomeConnected(String[] sourceIDs, String[] targetIDs, int... weights) { + public GraphBuilder SomeConnected(String[] sourceIDs, String[] targetIDs, double... weights) { if (sourceIDs.length != targetIDs.length || targetIDs.length != weights.length) throw new IllegalArgumentException("Lengths Are Not Equal");