|  |  |  | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|