jianghaiyue
6 天以前 4618bbf913912f85ee197ccd10644df29ad2f287
algo-zkd/src/main/java/com/algo/service/AStarPathPlanner.java
@@ -621,11 +621,7 @@
    }
    /**
     * 优化路径:去除空间上的重复点(避免来回走)
     * 检测并移除 A->B->A 模式的来回走,避免不必要的绕行
     *
     * @param codeList 原始路径代码列表
     * @return 优化后的路径代码列表
     * 优化路径
     */
    private List<PathCode> optimizePathByRemovingBacktrack(List<PathCode> codeList) {
        if (codeList == null || codeList.size() <= 2) {
@@ -638,27 +634,20 @@
        while (i < codeList.size()) {
            PathCode current = codeList.get(i);
            
            // 检查是否是来回走模式:A->B->A(连续三个点,第一个和第三个相同)
            // 如果出现来回走,跳过B和第二个A,直接到下一个不同的点
            if (i < codeList.size() - 2) {
                PathCode next = codeList.get(i + 1);
                PathCode nextNext = codeList.get(i + 2);
                
                // 检测来回走:当前位置 == 下下个位置,且中间位置不同
                if (current.getCode().equals(nextNext.getCode()) && 
                    !current.getCode().equals(next.getCode())) {
                    // 来回走:跳过B和第二个A,直接处理下一个不同的点
                    // 找到下一个与当前点不同的位置
                    int j = i + 2;
                    while (j < codeList.size() && codeList.get(j).getCode().equals(current.getCode())) {
                        j++;
                    }
                    // 如果找到了不同的点,或者到达末尾,跳过来回走的部分
                    if (j < codeList.size()) {
                        i = j; // 跳到下一个不同的点
                        i = j;
                        continue;
                    } else {
                        // 如果后面都是相同点,保留当前点(可能是目标点)
                        break;
                    }
                }
@@ -678,7 +667,7 @@
            }
        }
        
        // 重新计算方向(因为优化后跳过了中间点,方向需要更新)
        // 重新计算方向
        for (int k = 0; k < optimized.size(); k++) {
            PathCode code = optimized.get(k);
            if (k < optimized.size() - 1) {