DijkstraShortestPath在连接的图形上没有返回路径jgrpaht

时间:2017-02-10 08:56:11

标签: java graph dijkstra jgrapht

我正在java jgrapht中构建道路的加权图。

我试图使用Dijkstra算法找到最短路径,但函数返回顶点之间没有路径。但至于道路问题,图表是连通的。

似乎行路径=新的dijkstra ......什么也没做。调试器只是将它运行到下一行,任何想法?

你可以帮忙找出原因吗?

import org.jgrapht.alg.DijkstraShortestPath;
import org.jgrapht.graph.DefaultWeightedEdge;

public String getDistancesBEtweenCars(List<ConcreteData> placedCars){
    ArrayList<DijkstraShortestPath<RoadData, DefaultWeightedEdge>> current1;
    current1 = new ArrayList<>();
    Map<ConcreteData, ConcreteData> m;
    m = new HashMap<>();
    double maxLength = 0;
    List <Double> distances;
    distances = new ArrayList<>();
    StringBuilder str = new StringBuilder();
    int i = 0;


    for (ConcreteData p : placedCars){
        for (ConcreteData p1 : placedCars){
            if ((m.get(p) != null && m.get(p).equals(p1))){
                continue;}
            if ((m.get(p1) != null && m.get(p1).equals(p)))
                continue;
            if (p.equals(p1))
                continue;
            DijkstraShortestPath path = new DijkstraShortestPath(rg.getGrpah(), ConversionBetweenPlacemnetandRoadData((PoliceCarsPlacement)p),
                    ConversionBetweenPlacemnetandRoadData((PoliceCarsPlacement) p1));
            current1.add(path);
            double dist = current1.get(i).getPathLength();

            if (dist == Double.POSITIVE_INFINITY)
                continue;

            distances.add(dist);
            if (dist > maxLength)
               maxLength = dist;
            i++;
            m.put(p, p1);
            }
        }

    str.append("max distance between cars: ")
            .append(String.valueOf(Math.round(maxLength))).append(" average distance: ").
            append(String.valueOf(Math.round(this.s.getMean(distances)))).append(" standard deviation: ").
            append(String.valueOf(Math.round(this.s.getStdDev(distances))));

    numberOfCollisions(current1);

    return str.toString();
}

图表的类:

public class RoadGraph {
private WeightedGraph<RoadData, DefaultWeightedEdge> graph; 

/**
 * Class Constructor
 */
public RoadGraph(){
    graph = new SimpleDirectedWeightedGraph<>(DefaultWeightedEdge.class);
}

/**
 * this function adds vertexes
 * @param r - road data from the list
 */
public void AddVertex(RoadData r){
    this.graph.addVertex(r);
}

/**
 * this function adds edges
 * i/e connection between roads
 * @param r - from road segment
 * @param t - to road segment
 */
public void AddeEdge(RoadData r, RoadData t){
    if (this.graph.getAllEdges(r,t).isEmpty()==true)
        this.graph.addEdge(r, t);
    this.graph.setEdgeWeight(this.graph.getEdge(r, t), returnMin(r.getSegmentStartingPoint(),
            r.getSegementEndingPoint(), t.getSegmentStartingPoint(), t.getSegementEndingPoint()));
}

向图表添加veterx和边的函数:

/**
 * 
 * @param rd - RoadData list - to save all the roads segments 
 */
protected void createGraph(List<RoadData> rd){
    rg = new RoadGraph();
    int i,j;

    for (i = 0; i < roadList.get(0).size(); i++)
        rg.AddVertex((RoadData) roadList.get(0).get(i));
    for (i = 0; i < roadList.get(0).size(); i++){
        RoadData r1 = (RoadData) roadList.get(0).get(i);
        rd.add(r1);
        for (j = 0; j < roadList.get(0).size(); j++){
            if (i != j){
               RoadData r2 = (RoadData) roadList.get(0).get(j);
               if (r1.getFrom().equals(r2.getFrom()) || r1.getTo().equals(r2.getFrom()) 
                       || r1.getFrom().equals(r2.getTo()) || r1.getTo().equals(r2.getTo()))
                   rg.AddeEdge(r1, r2);
            }                    
        }
    }
}

0 个答案:

没有答案