如何通过A *寻路避免偷工减料?

时间:2013-07-05 15:15:35

标签: c# path-finding

在我第二次尝试使用A *时,我设法计算了追溯所需的所有值。还用S标记起始细胞,用B阻断起始细胞,用F

标记靶细胞

enter image description here

现在,对于回溯,我只会从目标单元格开始跟随具有最低G值的单元格。

这里我将遵循G = 24 => G = 10 => S上。

正如您所看到的,这个解决方案会创建一个无效的路径,因为在这种情况下它会通过墙。

在计算网格值时,这与角切割一起挂起。正如你在这里看到的那样。人们会回溯:G = 50 => G = 40,接下来将采用G = 20。这导致了切角。

enter image description here

我认为在计算每个相邻单元格的值时会出现此问题。如果我在将相邻单元格添加到当前单元格时设置了一些限制,我可以避免这种情况吗?

public List<Cell> GetAdjacent(Cell _currentCell, List<Cell> _closedList, List<Cell> _gridList) 
    {
        List<Cell> adjacentList = new List<Cell>();
        List<Cell> gridList = _gridList;
        List<Cell> closedList = _closedList;
        Cell currentCell = _currentCell;

        foreach (Cell cell in gridList) 
        {
            bool containedInClosedList = closedList.Any(c => c.id == cell.id);

            if (!cell.blocked && !containedInClosedList && 
                ((cell.positionCR.X == currentCell.positionCR.X - 1 && cell.positionCR.Y == currentCell.positionCR.Y) ||
                (cell.positionCR.X == currentCell.positionCR.X + 1 && cell.positionCR.Y == currentCell.positionCR.Y) ||
                (cell.positionCR.X == currentCell.positionCR.X && cell.positionCR.Y == currentCell.positionCR.Y - 1) ||
                (cell.positionCR.X == currentCell.positionCR.X && cell.positionCR.Y == currentCell.positionCR.Y + 1) ||
                (cell.positionCR.X == currentCell.positionCR.X - 1 && cell.positionCR.Y == currentCell.positionCR.Y - 1) ||
                (cell.positionCR.X == currentCell.positionCR.X - 1 && cell.positionCR.Y == currentCell.positionCR.Y + 1) ||
                (cell.positionCR.X == currentCell.positionCR.X + 1 && cell.positionCR.Y == currentCell.positionCR.Y - 1) ||
                (cell.positionCR.X == currentCell.positionCR.X + 1 && cell.positionCR.Y == currentCell.positionCR.Y + 1)))
            {
                adjacentList.Add(cell);
            }

        }



        return adjacentList;
    }

我定义的自定义费用是否也存在问题?我对G = 10表示直线,G = 14表示对角线单元。

我认为这是阻止我完成算法的最后一件事,所以我期待任何帮助或建设性的输入。

提前致谢!

1 个答案:

答案 0 :(得分:2)

正如Eric在上面的评论中提到的那样,你可以生成一个包含八个可能的邻居的列表,并检查它们是否有效。这里有效不仅意味着检查它们是否被阻挡,您还应该在这里检查切角。