Проблема реализации алгоритма Дейкстры в Java - PullRequest
0 голосов
/ 29 октября 2019

Я реализовал алгоритм Дейкстры в 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;
}

}

Я ценю помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...