| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.zy.asrs.framework.common.SpringUtils; |
| | | import com.zy.asrs.framework.exception.CoolException; |
| | | import com.zy.asrs.wcs.core.model.NavigateNode; |
| | | import com.zy.asrs.wcs.system.entity.Dict; |
| | | import com.zy.asrs.wcs.system.service.DictService; |
| | |
| | | mapData.setLev(lev); |
| | | int[][] data = mapData.getDataFromRedis(mapType, whitePoints, shuttlePoints); |
| | | if (data == null) { |
| | | data = mapData.getData(mapType, whitePoints, shuttlePoints); |
| | | throw new CoolException("地图未载入!"); |
| | | } |
| | | this.map = data; |
| | | } |
| | |
| | | if (node.getX() == end.getX() && node.getY() == end.getY()) {//找到目标结点就返回 |
| | | //init_node操作把这个邻居结点的父节点设置为当前结点 |
| | | //并且计算出G, F, H等值 |
| | | node.setLastDistance(gCost); |
| | | node.init_node(current_node, end); |
| | | return node; |
| | | } |
| | | |
| | | //(对启发函数增加去拐点方案calcNodeExtraCost) |
| | | if (is_exist(node)) { |
| | | if (gCost < node.getG()) { |
| | | node.setFather(current_node); |
| | | node.setG(gCost); |
| | | node.setF(node.getG() + node.getH()); |
| | | } |
| | | }else { |
| | | //没出现过的结点加入到Open表中并且设置父节点 |
| | | //进行计算对G, F, H 等值 |
| | | node.init_node(current_node, end); |
| | | node.setG(gCost); |
| | | node.setH(calcNodeCost(node, end)); |
| | | node.setF(node.getG() + node.getH()); |
| | | //进行计算对G, F, H 等值 |
| | | node.setLastDistance(gCost); |
| | | node.init_node(current_node, end); |
| | | node.setH(calcNodeCost(node, end)); |
| | | node.setF(node.getG() + node.getH()); |
| | | |
| | | Open.add(node); |
| | | Exist.add(node); |
| | | } |
| | | Open.add(node); |
| | | Exist.add(node); |
| | | } |
| | | } |
| | | //如果遍历完所有出现的结点都没有找到最终的结点,返回null |
| | |
| | | } |
| | | |
| | | public boolean is_valid(int x, int y) { |
| | | try { |
| | | // 如果结点的位置小于0,则不合法 |
| | | if (map[x][y] < 0) return false; |
| | | for (NavigateNode node : Exist) { |
| | | //如果结点出现过,不合法 |
| | | if (node.getX() == x && node.getY() == y) { |
| | | return false; |
| | | } |
| | | if (is_exist(new NavigateNode(x, y))) { |
| | | return false; |
| | | } |
| | | } |
| | | //以上情况都没有则合法 |
| | | return true; |
| | | } catch (Exception e) { |
| | | if (x < 0 || x >= this.map.length |
| | | || y < 0 || y >= this.map[0].length) { |
| | | return false; |
| | | } |
| | | // 如果结点的位置小于0,则不合法 |
| | | if (map[x][y] < 0) return false; |
| | | NavigateNode navigateNode = new NavigateNode(x, y); |
| | | if (is_exist(navigateNode)) { |
| | | return false; |
| | | } |
| | | //以上情况都没有则合法 |
| | | return true; |
| | | } |
| | | |
| | | public boolean is_exist(NavigateNode node) |
| | |
| | | // 第一个点或直线点 |
| | | if (currNode.getFather() == null || nextNode.getX() == currNode.getFather().getX() |
| | | || nextNode.getY() == currNode.getFather().getY()) { |
| | | return 0; |
| | | return 1; |
| | | } |
| | | |
| | | // 拐向终点的点 |
| | | if (nextNode.getX() == endNode.getX() || nextNode.getY() == endNode.getY()) { |
| | | return 1; |
| | | return 2; |
| | | } |
| | | |
| | | // 普通拐点 |
| | |
| | | 拿到父节点和下一节点 |
| | | 通过判断父节点和下一节点的x数据和y数据都不相同时,则表明当前坐标是一个拐点 |
| | | */ |
| | | return 2; |
| | | return 3; |
| | | } |
| | | |
| | | //------------------A*启发函数-end------------------// |