从方法中比较多个 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;
我有一个包含多个节点的数组,每个节点都有自己的 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".
的节点的 indexdouble 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;