在A *中获得接班人只需从左下方开始

时间:2013-11-19 19:04:48

标签: c# a-star

我在c#中找到一个方法实现获取A *中节点的后继 首先,用户将在10x10网格中输入起始位置和目标位置 方法获得后继者将获得目标,然后生成目标的后继者等等,直到它到达开始 我现在的问题是该方法采用对角线后继“角落”,我想只将上,下,左,右节点作为节点的后继节点。 这个方法

public ArrayList GetSuccessors()
    {
        ArrayList successors = new ArrayList ();

        for (int xd=-1;xd<=1;xd++)
        {
            for (int yd=-1;yd<=1;yd++)
            {

                if (Map.getMap (x+xd,y+yd) !=-1)
                {
                    Node n = new Node (this,this._goalNode ,Map.getMap (x+xd,y+yd) ,x+xd,y+yd);
                    if (!n.isMatch (this.parentNode) && !n.isMatch (this))
                        successors.Add (n);

                }
            }
        }
        return successors;
    }

假设我输入x = 0,y = 0作为开始 x = 5,y = 2作为目标

它将从目标位置开始 这将是x = 4,y = 1作为对角节点的第一个继承者!!

我知道问题出现在循环条件上,我如何修改条件以仅采用向左下方的后继条件。 不要担心getMab它只返回节点有1或-1,如果它是一个障碍。

谢谢

2 个答案:

答案 0 :(得分:1)

您的for循环当前遍历所有9个可能的操作(向8个可能的方向移动并保持不变)。 在第二个if循环中添加for语句,忽略您不想要的移动。像这样:

for (int xd=-1;xd<=1;xd++)
{
    for (int yd=-1;yd<=1;yd++)
    {
        // you want only up, down, left, or right moves
        // those are if one of xd or yd == 0
        if ((xd != 0 && yd != 0) || (xd == 0 && yd == 0))
            continue;
        if (Map.getMap (x+xd,y+yd) !=-1)
        {
            Node n = new Node (this,this._goalNode ,Map.getMap (x+xd,y+yd) ,x+xd,y+yd);
            if (!n.isMatch (this.parentNode) && !n.isMatch (this))
                successors.Add (n);

        }
    }
}

答案 1 :(得分:0)

对于x和y坐标,你的嵌套循环将采用-1,0,1的每个组合,其中包括对角线值(以及(0,0)处的当前节点,这也应该避免。)可能更容易手动检查你想要的4个基本方向而不是试图循环。

要做到这一点,只需取出你的内部if块并重复它为你想要的xd和yd的4种组合(0,1),(1,0),( - 1,0)和(0, - 1)。你可以将这个块重构为一个函数来缩短代码,这样你就不会重复代码了。

            if (Map.getMap (x+xd,y+yd) !=-1)
            {
                Node n = new Node (this,this._goalNode ,Map.getMap (x+xd,y+yd) ,x+xd,y+yd);
                if (!n.isMatch (this.parentNode) && !n.isMatch (this))
                    successors.Add (n);

            }