Я реализовал алгоритм Дейкстры в Java (см. Ниже), но у меня возникают проблемы при возвращении желаемого пути. Я использую алгоритм, чтобы найти ближайшего солдата на игровом поле, и пытаюсь использовать алгоритм, чтобы вернуть путь к вершине солдата;однако, если я попытаюсь найти путь к ближайшему вражескому солдату, Дейкстра не сможет вернуть путь, так как у вершины солдата нет ребра. Я хотел бы, чтобы алгоритм возвращал вершину прямо перед настоящим вражеским солдатом, но в алгоритме мне нужно указать конечную вершину, и я не уверен, где будет последняя вершина пути перед солдатом.
Поэтому я хочу, чтобы Дейкстра вычислял путь, пока не будет достигнуто определенное условие. Например, он может начать строить путь, а затем, когда обнаружит, что в следующем проверяемом пространстве содержится солдат, он вернет путь, ведущий к этой вершине. Как я должен подходить к решению этого в Java? Кроме того, я хотел бы, чтобы путь, по которому он вернулся, был путем к ближайшему вражескому солдату.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.PriorityQueue;
public class DijkstraShortestPath {
public void computeShortestPaths(Vertex sourceVertex){
sourceVertex.setDistance(0);
PriorityQueue<Vertex> priorityQueue = new PriorityQueue<>();
priorityQueue.add(sourceVertex);
sourceVertex.setVisited(true);
while( !priorityQueue.isEmpty() ){
// Getting the minimum distance vertex from priority queue
Vertex actualVertex = priorityQueue.poll();
for(Edge edge : actualVertex.getAdjacenciesList()){
Vertex v = edge.getTargetVertex();
if(!v.isVisited())
{
double newDistance = actualVertex.getDistance() + edge.getWeight();
if( newDistance < v.getDistance() ){
priorityQueue.remove(v);
v.setDistance(newDistance);
v.setPredecessor(actualVertex);
priorityQueue.add(v);
}
}
}
actualVertex.setVisited(true);
}
}
public List<Vertex> getShortestPathTo(Vertex targetVertex){
List<Vertex> path = new ArrayList<>();
for(Vertex vertex=targetVertex;vertex!=null;vertex=vertex.getPredecessor()){
path.add(vertex);
}
Collections.reverse(path);
return path;
}
}
Я ценю помощь!