我有一个包含多个节点的数组,每个节点都有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类中的任何代码,只能在路径查找器类中。
答案 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;