从方法中比较多个 returns

Comparing multiple returns from method

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

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

我有一个带有开放节点的 ArrayList,我必须找到 F 分数最低的节点,但我不知道该怎么做,开放的 arraylist 可以有 1 到 4 个节点,不允许 diaganol 移动.

我现在拥有的是一个 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 个节点添加到封闭列表,而不是唯一的最低节点。

我将其作为作业,因此我无法更改节点 class 中的任何代码,只能更改探路者 class。

当迭代列表时,您不能删除节点。您必须首先迭代 complete 列表;当你这样做的时候,你会搜索那些需要删除的。

然后,当您处理 所有 个节点时;并且您了解哪个具有真正的 "minimum" Fscore,然后删除 that 节点。

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

您可以通过跟踪 "current minimum fscore" 来做到这一点;以及具有 "current minimum".

的节点的 index
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 会告诉您要删除哪个索引!

改为使用以下内容:

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 的节点,然后将该节点从开放列表移至封闭列表。您的问题是您在查看整个列表之前尝试添加和删除。

跟踪最低FScore节点,并在迭代中不断将其与当前节点的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;