Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现thorugh Dijkstra*算法_Java_Dijkstra_A Star - Fatal编程技术网

Java 实现thorugh Dijkstra*算法

Java 实现thorugh Dijkstra*算法,java,dijkstra,a-star,Java,Dijkstra,A Star,我正在编写一个Java应用程序,它解析一个打开的街道地图文件,并绘制不同的元素来创建地图。该应用程序基本上是谷歌地图的克隆。此外,我还有一个路由搜索算法,它利用Algs4 Dijkstra算法从搜索字段中创建两个地址之间的路由。 
OSM文件由节点、路径和关系组成,我创建路由的方式是创建一个图形,该图形在创建地图时被实例化。此地图包含一个高速公路数组列表,这些高速公路被转换为有向边,因为该图是一个边加权有向图 现在,我想实现A*-算法,这让我有点麻烦。任何帮助都将不胜感激。这是我的Dijkstr

我正在编写一个Java应用程序,它解析一个打开的街道地图文件,并绘制不同的元素来创建地图。该应用程序基本上是谷歌地图的克隆。此外,我还有一个路由搜索算法,它利用Algs4 Dijkstra算法从搜索字段中创建两个地址之间的路由。 
OSM文件由节点、路径和关系组成,我创建路由的方式是创建一个图形,该图形在创建地图时被实例化。此地图包含一个高速公路数组列表,这些高速公路被转换为有向边,因为该图是一个边加权有向图

现在,我想实现A*-算法,这让我有点麻烦。任何帮助都将不胜感激。这是我的Dijkstra课程:

    public class Graph implements Serializable {

    private static final long serialVersionUID = 1L;

    private final int vertices;
    private final ArrayList<DirectedEdge>[] adj;

    public Graph(int vertices, List<OSMWay> highways) {
        this.vertices = vertices;
        adj = new ArrayList[vertices];

        for (OSMWay way : highways) {
            String road = way.getRoad();

            boolean bike = way.isBike();
            boolean walk = way.isWalk();
            boolean car = way.isCar();
            double speed = way.getSpeed();
            boolean onewayCar = way.isOnewayCar();
            boolean onewayBike = way.isOnewayBike();
            boolean onewayWalk = way.isOnewayWalk();
            boolean roundabout = way.isRoundabout();

            for (int i = 0; i < way.getNodes().size() - 1; i++) {
                OSMNode node = way.getNodes().get(i);
                OSMNode node1 = way.getNodes().get(i + 1);
                int from = node.getNumberForGraph();
                int to = node1.getNumberForGraph();

                double x1 = node.getLon();
                double y1 = node.getLat();
                double x2 = node1.getLon();
                double y2 = node1.getLat();

                double distance = Math.sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));

                if (!onewayCar && !onewayBike && !onewayWalk) {
                    addEdge(from, to, speed, distance, bike, walk, car, roundabout, road, node.getLon(), node.getLat(), node1.getLon(), node1.getLat());
                    addEdge(to, from, speed, distance, bike, walk, car, roundabout, road, node1.getLon(), node1.getLat(), node.getLon(), node.getLat());
                } else if (onewayCar && !onewayBike && !onewayWalk) {
                    addEdge(from, to, speed, distance, bike, walk, car, roundabout, road, node.getLon(), node.getLat(), node1.getLon(), node1.getLat());
                    addEdge(to, from, speed, distance, bike, walk, false, roundabout, road, node1.getLon(), node1.getLat(), node.getLon(), node.getLat());
                } else if (onewayCar && onewayBike && !onewayWalk) {
                    addEdge(from, to, speed, distance, bike, walk, car, roundabout, road, node.getLon(), node.getLat(), node1.getLon(), node1.getLat());
                    addEdge(from, to, speed, distance,false, true, false, roundabout, road, node1.getLon(), node1.getLat(), node.getLon(), node.getLat());
                } else if (onewayCar && onewayBike && onewayWalk) {
                    addEdge(from, to, speed, distance, bike, walk, car, roundabout, road, node.getLon(), node.getLat(), node1.getLon(), node1.getLat());
                }
            }
        }
    }
    
    // Adds a new edge to the graph.
    private void addEdge(int from, int to, double speed, double distance, boolean bike, boolean walk, boolean car, boolean roundabout, String road, float x1, float y1, float x2, float y2) {
        DirectedEdge edge = new DirectedEdge(from, to, speed, distance, bike, walk, car, roundabout, road, x1, y1, x2, y2);
        if (adj[from] == null) {
            adj[from] = new ArrayList<>();
        }
        adj[from].add(edge);
    }
    
    /** Returns an iterable over v's adjacent edges. */
    public Iterable<DirectedEdge> adja(int v) {
        return adj[v];
    }
    
    /** Returns the number of outgoing edges from v. */
    public int numberOfOutgoingEdges(int v) {
        int y = 0;
        for (DirectedEdge edge : adj[v]) {
            y++;
        }
        return y;
    }

    public int getVertices() {
        return vertices;
    }
}
. 请准确描述问题所在,问题的帖子。包括测试数据。A*是一种“改良的迪克斯特拉”,所以改变应该不会太困难。。请准确描述问题所在,问题的帖子。包括测试数据。A*是一种“改良的迪克斯特拉”,所以改变应该不会太难。
        private void searchAction() {
        view.getSearchedDrawables().clear();
        view.getRouteDrawables().clear();

        String addressTo = view.getToSearchField().getText();
        String addressFrom = view.getFromSearchField().getText();

        OSMNode nodeTo = null;
        OSMNode nodeFrom = null;

        if (!addressTo.isEmpty() || !addressFrom.isEmpty()) {
            for (OSMNode node : model.getAddressNodes()) {
                if (node.getAddress().equals(addressTo)) {
                    nodeTo = node;
                }
                if (node.getAddress().equals(addressFrom)) {
                    nodeFrom = node;
                }
            }
        }

        try {
            view.paintPoints(nodeTo, nodeFrom);
        } catch (NoAddressMatchException ex) {
            if ((!addressTo.isEmpty() && !addressFrom.isEmpty()) ||
                    ((nodeFrom == null && nodeTo == null) &&
                            (!addressTo.isEmpty() || !addressFrom.isEmpty()))) {
                Alert alert = new Alert(AlertType.INFORMATION);
                alert.setTitle("Ingen adresse fundet");
                alert.setHeaderText(null);
                alert.setContentText(ex.getMessage());
                alert.showAndWait();
            }
        }

        if (nodeFrom != null && nodeTo != null) {
            if (!routeEdges.isEmpty()) {
                routeEdges.clear();
            }

            if (view.getHelicopter().isSelected()) {
                DirectedEdge route = new DirectedEdge(nodeFrom.distance(nodeTo), nodeFrom.getLon(), nodeFrom.getLat(), nodeTo.getLon(), nodeTo.getLat());
                routeEdges.add(route);
                view.paintRoute(routeEdges);
                view.openRouteDescription();
                return;
            }

            Vehicle vehicle;

            if (view.getCar().isSelected()) {
                vehicle = new Car();
            } else if (view.getBike().isSelected()) {
                vehicle = new Bike();
            } else {
                vehicle = new Walk();
            }

            OSMWay nearestTo = model.getHighwayTree().nearest(nodeTo.getLon(), nodeTo.getLat(), true, view.getTransform());
            OSMWay nearestFrom = model.getHighwayTree().nearest(nodeFrom.getLon(), nodeFrom.getLat(), true, view.getTransform());

            Point2D pointTo = new Point2D(nodeTo.getLon(), nodeTo.getLat());
            OSMNode nearestToNode = model.getHighwayTree().nodeDistance(pointTo, nearestTo);

            Point2D pointFrom = new Point2D(nodeFrom.getLon(), nodeFrom.getLat());
            OSMNode nearestFromNode = model.getHighwayTree().nodeDistance(pointFrom, nearestFrom);

            try {
                if (!lastSearchFrom.equals(view.getFromSearchField().getText())) {
                    dijkstra = new Dijkstra(model.getRouteGraph(), nearestFromNode.getNumberForGraph(), vehicle);

                } else {
                    if (lastVehicle == null || (!lastVehicle.isSameVehicleAs(vehicle))) {
                        dijkstra = new Dijkstra(model.getRouteGraph(), nearestFromNode.getNumberForGraph(), vehicle);
                    }
                }

                routeEdges = dijkstra.pathTo(nearestToNode.getNumberForGraph(), vehicle);

            } catch (NoRouteException ex) {
                Alert alert = new Alert(AlertType.INFORMATION);
                alert.setTitle("Ingen rute fundet");
                alert.setHeaderText(null);
                alert.setContentText(ex.getMessage());
                alert.showAndWait();
            }

            view.paintRoute(routeEdges);
            view.openRouteDescription();
            lastSearchFrom = addressFrom;
            lastVehicle = vehicle;
        }
    }