比较方法

时间:2016-10-04 19:11:31

标签: java path-finding a-star

我有一个包含多个节点的数组,每个节点都有H,G和F分数。

我从一个名为calculateGscore()和calculateHscore()的方法得到H和G分数,这两个方法都返回一个双倍,F分数是H + G;

我有一个带有开放节点的ArrayList,我必须找到F分数最低的节点,但我不知道怎么做,开放式arraylist可以有1到4个节点,不允许使用diaganol。< / p>

我现在拥有的是一个for循环:

 for(int i = 1; i < open.size(); i++){
            Gscore = open.get(i).getGscore(); // these methods are in the Node class.
            Hscore = open.get(i).getHscore();
            Fscore = Gscore + Hscore;

            if(Fscore < (calculateGscore(open.get(i-1)) + calculateHscore(open.get(i-1)))){          // these methods are in the pathFinder class.
                closed.add(open.get(i));
            }
            else{
                closed.add(open.get(i-1));
                open.remove(i-1);
            }
        }

但是如果打开列表中有4个节点,则它不起作用,然后它将2个节点添加到关闭列表而不是唯一最低的节点。

我将此作为一项作业,因此我无法更改Node类中的任何代码,只能在路径查找器类中。

3 个答案:

答案 0 :(得分:0)

您在迭代列表时无法删除 节点。您必须首先迭代完整列表;当你这样做时,你会搜索那些需要删除的东西。

然后,当您处理所有节点时;并且您了解哪个具有真正的“最小”Fscore,然后您删除那个节点。

您的代码正在尝试删除节点之前您可能知道其Fscore小于以下节点的Fscore!

你可以通过跟踪“当前最小fscore”来做到这一点;以及具有“当前最小值”的节点的索引

double currentMinimum = double max value (dont know the constant name right now)
int indexOfMinimum = 0;

for (int i=0; i < open.size(); i++) {
  if (fscore(open.get(i)) < currentMinimum) {
    currentMinimum = fscore(open.get(i));
    indexOfMinimum = i;
 }
}

和循环之后,indexOfMinimum告诉你要删除哪个索引!

答案 1 :(得分:0)

请改用以下内容:

double minFscore = open.get(0).getGscore() + open.get(0).getHscore();
Node minScoreNode = open.get(0);

for(int i = 1; i < open.size(); i++) {
    Gscore = open.get(i).getGscore(); // these methods are in the Node class.
    Hscore = open.get(i).getHscore();
    Fscore = Gscore + Hscore;

    if (Fscore < minFscore) {
         minScoreNode = open.get(i);
         minFscore = Fscore;
    }
}

open.remove(minScoreNode);
closed.add(minScoreNode);

这将遍历每个节点,找到具有最小fScore的节点,然后将该节点从打开列表移动到关闭列表。您的问题是您在查看整个列表之前尝试添加和删除。

答案 2 :(得分:0)

保持跟踪最低FS核心节点,并在迭代中将其与当前节点的FScore进行比较。

Node lowestFScoreNode = open.get(1);
for(int i = 1; i < open.size(); i++){
    Gscore = open.get(i).getGscore(); // these methods are in the Node class.
    Hscore = open.get(i).getHscore();
    Fscore = Gscore + Hscore;

    if(Fscore < (lowestFScoreNode.getGscore() + lowestFScoreNode.getHscore())) {
        lowestFScoreNode = open.get(i);
    }
}

return lowestFScoreNode;