Соседи не добавляют в openList (алгоритм *) и получают исключение noSuchElement - PullRequest
0 голосов
/ 02 марта 2020

Лабиринт

У меня есть программа под названием Лабиринт, и я хочу найти кратчайший маршрут к месту назначения. Поэтому я выбрал алгоритм A * для своей программы, но в его реализации есть логическая ошибка, которая вызывает ошибку «noSuchElementException» при выполнении. Я начал отладку, и это вызвало ошибку в открытом списке алгоритма A *, который соседствует. Он не добавляет текущую позицию к себе для просмотра, а после удаления первого усиления из открытого списка и добавления его в закрытый список и не добавляя соседей в список, он пуст. Поэтому я следовал своему коду и, к сожалению, не нашел свою ошибку, и мне показалось, что все верно. Поскольку в исходном коде слишком много строк, я не могу прикрепить здесь целое, поэтому исходный код метода Метод, связанный с этим, вызывает ваше присоединение.


noSuchElementException

noSuchElementException


Базовый метод

Этот метод работает с открытыми и закрытыми списками, сначала добавляя текущую позицию в открытый список, затем выбирая самый низкий оценка в открытом списке и присоединение к закрытому списку. Затем он проверяет своих соседей в отсутствие препятствия, и "манхэттенским" образом значение H вычисляется с каждым шагом основного l oop значения шага для каждого соседа G. Основная проблема с Hankam вызов метода, который находит наименьшую оценку в открытом списке из-за отсутствия добавленных в этот список MazeNodes. Я даже изучил три последовательных члена в алгоритме (isInClist и isInOlist), и они работали правильно.

List<Character> find(){
    List<Character> directions = new ArrayList<Character>();
    int sizeXsize = (int) Math.pow(maze.getSize(), 2);
    MazeNode<Character> start = new MazeNode<Character>(' ', 0,0,0, 0, sizeXsize);
    boolean[] freePlaces = new boolean[4]; // left, top, right, bottom -> [0], [1], [2], [3]
    openList.addLast(start);
    while (!maze.isWin()){
        MazeNode S = FindBestOList();
        maze.move((Character) S.getData());
        System.out.println(S.getData());
        closeList.addLast(S);
        openList.remove(S);
        this.step++;
        freePlaces = maze.calculateValidAspect(); // to calculate obstacles and prevent coming in finding path algorithm
        int xHolder = S.getPosX();
        int yHolder = S.getPosY();
        nextCondition:
        for(byte i = 0; i < 4; i++){
            if (freePlaces[i] == true){
                char direction = convertToDirection(i);
                maze.setX(xHolder);
                maze.setY(yHolder);
                maze.move(direction);
                int x = maze.getX();
                int y = maze.getY();
                MazeNode neighbor = new MazeNode(direction, x, y, step, sizeXsize - (x+y));
                S.addChild(neighbor);
                System.out.println("haha: " + isInOList(neighbor));
                if (isInCList(neighbor)){ continue nextCondition;}
                else if (!isInOList(neighbor)){
                    openList.addLast(neighbor);
                    System.out.println("hello motherfucker");
                } else {
                    MazeNode exist = openList.get(findSameOList(neighbor));
                    if (exist.getF() > neighbor.getF()){
                        exist.setParent(S);
                        exist.setG(neighbor.getG());
                        exist.setH(neighbor.getH());
                    }
                }
            }
        }

    }
    Iterator<MazeNode> iterator = closeList.iterator();
    while (iterator.hasNext()){
        MazeNode current = iterator.next();
        directions.add((Character) current.getData());
    }
    return directions;
}

}

И вот здесь отладчик находит ошибку из-за отсутствия открытого списка элемент

private MazeNode FindBestOList(){
    MazeNode result = openList.getLast();
    Iterator<MazeNode> iterator = openList.iterator();
    int f = openList.getLast().getF();
    while (iterator.hasNext()){
        MazeNode current = iterator.next();
        if (current.getF() <= f){
            f = current.getF();
            result = current;
        }
    }
    return result;
}
...