Guest User

Untitled

a guest
Mar 23rd, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. package student;
  2.  
  3. import com.google.common.collect.Lists;
  4. import cz.cvut.atg.zui.astar.AbstractOpenList;
  5. import cz.cvut.atg.zui.astar.PlannerInterface;
  6. import cz.cvut.atg.zui.astar.RoadGraph;
  7. import eu.superhub.wp5.planner.planningstructure.GraphEdge;
  8. import eu.superhub.wp5.planner.planningstructure.GraphNode;
  9.  
  10. import java.util.*;
  11.  
  12. import static cz.cvut.atg.zui.astar.Utils.distanceInKM;
  13.  
  14. class OpenList extends AbstractOpenList<GraphNode> {
  15. private PriorityQueue<GraphNode> queue;
  16.  
  17. OpenList(GraphNode finish, Map<Long, Double> distances) {
  18. queue = new PriorityQueue<>(1000, Comparator.comparingDouble(a -> (distanceInKM(a, finish) / 120.00) + distances.get(a.getId())));
  19. }
  20.  
  21. @Override
  22. protected boolean addItem(GraphNode item) {
  23. queue.add(item);
  24. return true;
  25. }
  26.  
  27. public GraphNode pop() {
  28. return queue.remove();
  29. }
  30.  
  31. public boolean empty () {
  32. return queue.isEmpty();
  33. }
  34.  
  35. public void removeNode(GraphNode node){
  36. queue.remove(node);
  37. }
  38.  
  39. public void clear(){
  40. queue.clear();
  41. }
  42. }
  43.  
  44.  
  45. public class Planner implements PlannerInterface {
  46. private OpenList openList;
  47. public Planner() {}
  48.  
  49. @Override
  50. public List<GraphEdge> plan(RoadGraph graph, GraphNode origin, GraphNode destination) {
  51. Map<Long, GraphEdge> inEdge = new HashMap<>();
  52. Map<Long, Double> distanceFromOrigin = new HashMap<>();
  53. Map<Long, Boolean> closed = new HashMap<>();
  54. ArrayList<GraphEdge> path = new ArrayList<>();
  55. openList = new OpenList(destination, distanceFromOrigin);
  56.  
  57. distanceFromOrigin.put(origin.getId(), 0.0);
  58. openList.add(origin);
  59. while(!openList.empty()){
  60. final GraphNode curr = openList.pop();
  61. if(curr == destination){
  62. GraphNode tmp = curr;
  63. while(tmp != origin){
  64. path.add(inEdge.get(tmp.getId()));
  65. tmp = graph.getNodeByNodeId(inEdge.get(tmp.getId()).getFromNodeId());
  66. }
  67. break;
  68. }
  69. if(graph.getNodeOutcomingEdges(curr.getId()) == null){
  70. continue;
  71. }
  72. for (GraphEdge edge : graph.getNodeOutcomingEdges(curr.getId())) {
  73. double node_distance = (edge.getLengthInMetres() / 1000) / edge.getAllowedMaxSpeedInKmph();
  74. double tentative_g = distanceFromOrigin.get(curr.getId()) + node_distance;
  75. GraphNode nextnode = graph.getNodeByNodeId(edge.getToNodeId());
  76. if (!distanceFromOrigin.containsKey(nextnode.getId()) && !closed.containsKey(nextnode.getId())) {
  77. distanceFromOrigin.put(nextnode.getId(), tentative_g);
  78. inEdge.put(edge.getToNodeId(), edge);
  79. openList.add(nextnode);
  80. } else if (tentative_g < distanceFromOrigin.get(nextnode.getId()) && !closed.containsKey(nextnode.getId())) {
  81. openList.removeNode(nextnode);
  82. distanceFromOrigin.put(nextnode.getId(), tentative_g);
  83. inEdge.put(nextnode.getId(), edge);
  84. openList.add(nextnode);
  85. }
  86. }
  87. closed.put(curr.getId(), true);
  88. }
  89. if(path.isEmpty()){
  90. return null;
  91. }
  92. return Lists.reverse(path);
  93. }
  94.  
  95. @Override
  96. public AbstractOpenList getOpenList() {
  97. return openList;
  98. }
  99. }
Add Comment
Please, Sign In to add comment