Лабиринт
У меня есть программа под названием Лабиринт, и я хочу найти кратчайший маршрут к месту назначения. Поэтому я выбрал алгоритм A * для своей программы, но в его реализации есть логическая ошибка, которая вызывает ошибку «noSuchElementException» при выполнении. Я начал отладку, и это вызвало ошибку в открытом списке алгоритма A *, который соседствует. Он не добавляет текущую позицию к себе для просмотра, а после удаления первого усиления из открытого списка и добавления его в закрытый список и не добавляя соседей в список, он пуст. Поэтому я следовал своему коду и, к сожалению, не нашел свою ошибку, и мне показалось, что все верно. Поскольку в исходном коде слишком много строк, я не могу прикрепить здесь целое, поэтому исходный код метода Метод, связанный с этим, вызывает ваше присоединение.
noSuchElementException
![noSuchElementException](https://i.stack.imgur.com/25X2s.png)
Базовый метод
Этот метод работает с открытыми и закрытыми списками, сначала добавляя текущую позицию в открытый список, затем выбирая самый низкий оценка в открытом списке и присоединение к закрытому списку. Затем он проверяет своих соседей в отсутствие препятствия, и "манхэттенским" образом значение 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;
}