Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过*寻路避免走捷径?_C#_Path Finding - Fatal编程技术网

C# 如何通过*寻路避免走捷径?

C# 如何通过*寻路避免走捷径?,c#,path-finding,C#,Path Finding,在我第二次尝试使用*时,我成功地计算了回溯所需的所有值。还用S标记起始单元格,用B阻塞,用F标记目标单元格 现在,对于回溯,我只需从目标单元格开始,跟踪G值最低的单元格 这里我将遵循G=24=>G=10=>S 正如您所看到的,此解决方案将创建一条无效的路径,因为在这种情况下它会穿过一堵墙 在计算栅格的值时,这与切角挂起。正如你在这里看到的。我们将回溯:G=50=>G=40,接下来我们将取G=20。这导致了拐弯 我认为在计算每个相邻单元格的值时会出现此问题。如果我在向当前单元格添加相邻单元格时

在我第二次尝试使用*时,我成功地计算了回溯所需的所有值。还用S标记起始单元格,用B阻塞,用F标记目标单元格

现在,对于回溯,我只需从目标单元格开始,跟踪G值最低的单元格

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

正如您所看到的,此解决方案将创建一条无效的路径,因为在这种情况下它会穿过一堵墙

在计算栅格的值时,这与切角挂起。正如你在这里看到的。我们将回溯:G=50=>G=40,接下来我们将取G=20。这导致了拐弯

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

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;
    }
public List getnext(单元格_currentCell,列表_closedList,列表_gridList)
{
列表邻接列表=新列表();
List gridList=\u gridList;
列表关闭列表=_closedList;
Cell currentCell=_currentCell;
foreach(网格列表中的单元格)
{
bool containedClosedList=closedList.Any(c=>c.id==cell.id);
如果(!cell.blocked&!containedClosedList&&)
((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)))
{
添加(单元格);
}
}
返回邻接列表;
}
我定义的定制成本也会有问题吗?直线单元格取G=10,对角线单元格取G=14

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


提前谢谢

正如Eric在上面的评论中提到的,你可以列出八个可能的邻居,并检查他们是否有效。此处有效不仅意味着检查它们是否堵塞,还应检查此处是否存在切角。

您的成本指标10表示直线移动,14表示对角线移动是合理的,但存在一个小的潜在问题。
A*
算法要求其正确性,即近似度量低估了到目标的距离。如果您使用欧几里德度量作为近似值,那么您可能高估了根2的14到10倍之间的差值,即大约1%。如此微小的高估不太可能产生真正糟糕的结果,但至少值得思考的是,是否有更好的权重来保持指标的可接受性?它们只有四个,所以你应该能够很容易地列举它们。所以这可能是一个重要的问题?你的切入点问题不是一个重要的问题。事实上,你完全允许这一步。您有一个确定相邻节点的方法;如果一个相邻的节点会抄近路,不要将其添加到列表中。生成一个包含八个可能的邻居的列表,然后检查每个邻居是否有效——在黑板上,而不是抄近路,等等。这样你就过滤了八个东西,而不是一百万个东西。