해결 : 죄송합니다. 나는 부적절하게 경로를 재구성하고 있었다. closedSet에는 처음부터 끝까지 모든 중간 지점이 있다고 생각했지만 다른 중간 지점도 있습니다. 나는 그 개념을 이해하지 못했다. 이제는 일하고있어!A-Star 나쁜 웨이 포인트를 선택하십시오.
나는 여전히 A *에 문제가 있습니다.
내 캐릭터가 경로를 찾고 있지만 때로는지도를 클릭하는 위치에 따라 알고리즘이 최단 경로 또는 경로를 찾지 만 선택하지 않아야하는 노드가 많습니다.
나는 초보자 구현을위한 위키 백과의 및 A * 길 찾기를 수행하려고했습니다,하지만 그들은 나에게 동일한 결과를 제공합니다. 발견 적 알고리즘인지 알고리즘인지는 모르겠지만 뭔가 잘못되었습니다.
그리고이 두 개의 서로 다른 노드를 클릭 문제의 예는 다음과 같습니다
import java.util.ArrayList;
import java.util.Collections;
import java.util.TreeSet;
public class Pathfind {
public Pathfind(){
}
public ArrayList<Node> findPath(Node start, Node end, ArrayList<Node> nodes){
ArrayList<Node> openSet = new ArrayList<Node>();
ArrayList<Node> closedSet = new ArrayList<Node>();
Node current;
openSet.add(start);
while(openSet.size() > 0){
current = openSet.get(0);
current.setH_cost(ManhattanDistance(current, end));
if(start == end) return null;
else if(closedSet.contains(end)){
System.out.println("Path found!");
return closedSet;
}
openSet.remove(current);
closedSet.add(current);
for(Node n : current.getNeigbours()){
if(!closedSet.contains(n)){
if(!openSet.contains(n) || (n.getG_cost() < (current.getG_cost()+10))){
n.setParent(current);
n.setG_cost(current.getG_cost()+10);
n.setH_cost(ManhattanDistance(n, end));
if(!openSet.contains(n))
openSet.add(n);
Collections.sort(openSet);
}
}
}
}
return null;
}
private int ManhattanDistance(Node start, Node end){
int cost = start.getPenalty();
int fromX = start.x, fromY = start.y;
int toX = end.x, toY = end.y;
return cost * (Math.abs(fromX - toX) + Math.abs(fromY - toY));
}
}
5 개의 if 문이 중첩되어 있습니다. 나는 bool을 반환하는 메서드를 사용하거나 조건부로 넣을 것을 권장합니다. – tehdoommarine
지도에 대한 자세한 내용을 입력하십시오. 맵의 유형에 따라, 다른 거리 메트릭이 경험적으로 사용될 수도 정확하지 않을 수도 있습니다. –
그냥 코멘트 -''ArrayList''로'closedSet'을 선택하는 것이 효율적이지 않다고 생각합니다. 각각의'contains()'op는'O (n)'(n은 닫힌 노드의 수)입니다. 보다 나은 성능을 위해'Set'을 사용해야합니다.'HashSet'은 현명한 선택이며, 삽입 순서를 유지하려면'LinkedHashSet'을 사용해야합니다. ('Node'의'equals()'와'hashCode()'메소드를 오버라이드해야합니다.) – amit