| | |
| | | Integer maxAgvCountInLane = configService.getVal("maxAgvCountInLane", Integer.class); |
| | | |
| | | PriorityQueue<NavigateNode> openQueue = new PriorityQueue<>(); |
| | | ArrayList<NavigateNode> existNodes = new ArrayList<>(); |
| | | Set<NavigateNode> existNodes = new HashSet<>(); |
| | | |
| | | openQueue.add(start); |
| | | existNodes.add(start); |
| | |
| | | DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(null); |
| | | String[][] waveMatrix = mapDataDispatcher.getWaveMatrix(null); |
| | | |
| | | while (openQueue.size() > 0) { |
| | | while (!openQueue.isEmpty()) { |
| | | // 取优先队列顶部元素并且把这个元素从Open表中删除,取F值最小的节点 |
| | | NavigateNode currentNode = openQueue.poll(); |
| | | |
| | |
| | | } |
| | | |
| | | // 获取四周节点 |
| | | private ArrayList<NavigateNode> getNeighborNodes(NavigateNode currentNode, int[][] mapMatrix, List<NavigateNode> existNodes) { |
| | | private ArrayList<NavigateNode> getNeighborNodes(NavigateNode currentNode, int[][] mapMatrix, Set<NavigateNode> existNodes) { |
| | | //获取当前结点的x, y |
| | | int x = currentNode.getX(); |
| | | int y = currentNode.getY(); |
| | |
| | | ArrayList<NavigateNode> neighbourNodes = new ArrayList<>(); |
| | | |
| | | NavigateNode rightNode = extendNeighborNodes(currentNode, new NavigateNode(x, y + 1), mapMatrix, existNodes, null, null); |
| | | if (is_valid(currentNode, rightNode, mapMatrix, existNodes)) { |
| | | if (is_valid(currentNode, rightNode)) { |
| | | neighbourNodes.add(rightNode); |
| | | } |
| | | |
| | | NavigateNode leftNode = extendNeighborNodes(currentNode, new NavigateNode(x, y - 1), mapMatrix, existNodes, null, null); |
| | | if (is_valid(currentNode, leftNode, mapMatrix, existNodes)) { |
| | | if (is_valid(currentNode, leftNode)) { |
| | | neighbourNodes.add(leftNode); |
| | | } |
| | | |
| | | NavigateNode topNode = extendNeighborNodes(currentNode, new NavigateNode(x - 1, y), mapMatrix, existNodes, null, null); |
| | | if (is_valid(currentNode, topNode, mapMatrix, existNodes)) { |
| | | if (is_valid(currentNode, topNode)) { |
| | | neighbourNodes.add(topNode); |
| | | } |
| | | |
| | | NavigateNode bottomNode = extendNeighborNodes(currentNode, new NavigateNode(x + 1, y), mapMatrix, existNodes, null, null); |
| | | if (is_valid(currentNode, bottomNode, mapMatrix, existNodes)) { |
| | | if (is_valid(currentNode, bottomNode)) { |
| | | neighbourNodes.add(bottomNode); |
| | | } |
| | | |
| | | return neighbourNodes; |
| | | } |
| | | |
| | | private NavigateNode extendNeighborNodes(NavigateNode currentNode, NavigateNode extendNode, int[][] mapMatrix, List<NavigateNode> existNodes, Integer dx, Integer dy) { |
| | | private NavigateNode extendNeighborNodes(NavigateNode currentNode, NavigateNode extendNode, int[][] mapMatrix, Set<NavigateNode> existNodes, Integer dx, Integer dy) { |
| | | NavigateNode nextNode = null; |
| | | |
| | | if (null == dx || null == dy) { |
| | |
| | | |
| | | } else { |
| | | |
| | | if (isExist(nextNode, existNodes)) { |
| | | if (existNodes.contains(nextNode)) { |
| | | return null; |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | private boolean is_valid(NavigateNode currentNode, NavigateNode node, int[][] mapMatrix, List<NavigateNode> existNodes) { |
| | | private boolean is_valid(NavigateNode currentNode, NavigateNode node) { |
| | | if (null == node) { |
| | | return false; |
| | | } |
| | | // int x = node.getX(); |
| | | // int y = node.getY(); |
| | | // if (x < 0 || x >= mapMatrix.length |
| | | // || y < 0 || y >= mapMatrix[0].length) { |
| | | // return false; |
| | | // } |
| | | // |
| | | // // 如果结点的位置小于0,则不合法 |
| | | // if (mapMatrix[x][y] < 0) return false; |
| | | // |
| | | // if (is_exist(node, existNodes)) { |
| | | // return false; |
| | | // } |
| | | // |
| | | // // 判断通过性 |
| | | // String[][] codeMatrix = mapDataDispatcher.getCodeMatrix(null); |
| | | // String currentNodeCodeData = codeMatrix[currentNode.getX()][currentNode.getY()]; |
| | | // String nextNodeCodeData = codeMatrix[node.getX()][node.getY()]; |
| | | // node.setCodeData(nextNodeCodeData); |
| | | // |
| | | // Route route = routeService.findByCodeOfBoth( |
| | | // codeService.selectByData(currentNodeCodeData).getId(), |
| | | // codeService.selectByData(nextNodeCodeData).getId() |
| | | // ); |
| | | // if (null == route) { |
| | | // return false; |
| | | // } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | // private boolean is_exist(NavigateNode node, List<NavigateNode> existNodes) { |
| | | // for (NavigateNode exist_node : existNodes) { |
| | | // if (node.getX() == exist_node.getX() && node.getY() == exist_node.getY()) { |
| | | // return true; |
| | | // } |
| | | // } |
| | | // return false; |
| | | // } |
| | | |
| | | private boolean isExist(NavigateNode node, List<NavigateNode> existNodes) { |
| | | for (NavigateNode existNode : existNodes) { |
| | |
| | | // Code code1 = codeService.selectByData(node1.getCodeData()); |
| | | // Code code2 = codeService.selectByData(node2.getCodeData()); |
| | | // return (int) (Math.abs(code2.getX() - code1.getX()) + Math.abs(code2.getY() - code1.getY())); |
| | | |
| | | return Math.abs(node2.getX() - node1.getX()) + Math.abs(node2.getY() - node1.getY()); |
| | | } |
| | | |