Сравнение нескольких возвратов из метода

У меня есть массив с несколькими узлами, каждый из которых имеет свои оценки H, G и F.

Я получаю оценки H и G из методов, называемых calculateGscore() и calculateHscore(), которые оба возвращают двойное значение, оценка F - H+G;

У меня есть ArrayList с открытыми узлами, и мне нужно найти узел с наименьшим показателем F, но я не знаю, как это сделать, открытый массив может иметь в нем от 1 до 4 узлов, движение диаганола не разрешено.

Теперь у меня есть цикл 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, только в классе pathfinder.


person Steven Spieler    schedule 04.10.2016    source источник


Ответы (3)


Вместо этого используйте следующее:

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, а затем перемещать этот узел из открытого списка в закрытый список. Ваша проблема заключалась в том, что вы пытались добавить и удалить, прежде чем просмотреть весь список.

person nhouser9    schedule 04.10.2016

Вы не можете удалить узел во время повторения списка. Вы должны сначала пройтись по полному списку; и пока вы это делаете, вы ищете те, которые нужно удалить.

И затем, когда вы обработали все узлы; и вы понимаете, какой из них имеет этот истинный «минимальный» 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 сообщает вам, какой индекс удалить!

person GhostCat    schedule 04.10.2016
comment
Да, я понимаю! Я просто не могу понять, как это сделать в цикле for, я пробовал все. - person Steven Spieler; 04.10.2016
comment
Я поместил пример кода в свой ответ. Надеюсь, это поможет. - person GhostCat; 04.10.2016

Следите за узлом с наименьшим 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;
person Pankaj Gadge    schedule 04.10.2016