java 开发之 最近(最短)路线规划算法 迪杰斯特拉(Dijkstra)和个人研究的算法对比

最近公司的物流项目要做最短路线规划, 网上找了很多,描述和使用最多的就是地杰斯特拉(Dijkstra)算法,这个算法的逻辑是两点连接是以最近的路线规划,但实际规划出来的整条线在特定条件下并不是最近的,所以我自己又研究了一套算法进行对比。先上图吧

java 物理路径 java 路径规划_最短距离


java 物理路径 java 路径规划_Android_02


迪杰斯特拉的规划结果

java 物理路径 java 路径规划_Android_03


我的算法结果

从两张图可以判断,规划的结果相差将近700.所以 迪杰斯特拉算法还是有缺陷的,因为他只是计算与当前点的最短距离,并没有考虑整体路线的距离。本文不再赘述Dijkstra算法了,有兴趣的可以搜一下,相关文章有很多,讲的也很详细

算法逻辑

其实我的算法逻辑很原始,就是将“甲乙丙丁午己庚辛壬癸”这些点规划出所有可能的路线来进行计算,算出最短的哪一条,从动态图中可看出来此算法很消耗性能,地点数量越多耗时时间越长
接下来放一下算法代码

ArrayList<ArrayList<PathPlan.Place>> arrayLists = new ArrayList<>();//路线记录
    /**
     * 自定义规划路线算法
     * @param start 起始地点
     * @param end   末尾地点
     */
    public  ArrayList<ArrayList<PathPlan.Place>> initCustomPathPlan(  PathPlan.Place start,PathPlan.Place end){
        arrayLists.clear();//清空记录
        ArrayList<PathPlan.Place > places = new ArrayList<>(distances.keySet());//所有地点集合
        for(int i=1;i<=places.size();i++){
            sortPlace(places,new ArrayList<PathPlan.Place>(),i,start,end);
        }
        return arrayLists;

    }
    //最短距离
    double dist = -1;


/**
     * 组合
     * @param datas  地点数据
     * @param target 整理的新路线
     * @param num   循环的下标位置,即路线规划的地点数量
     * @param start 起始
     * @param end   末尾
     */
    private void sortPlace(ArrayList<PathPlan.Place>  datas, ArrayList<PathPlan.Place>  target,int num,PathPlan.Place start,PathPlan.Place end) {
        if (target.size() == num) {
            ArrayList newDatas = new ArrayList( );
            ArrayList<PathPlan.Place > places = new ArrayList<>(distances.keySet());
            //数量不够,起始和末尾不对应
            if(places.size()> num || start!=null && !target.get(0).equals(start) || end!=null && !target.get(target.size()-1).equals(end)){
                return;
            }
            double tempDist = 0 ;
            for (PathPlan.Place obj : target) {
                //复制对象
                PathPlan.Place place = new PathPlan.Place(obj);
                //距离
                place.distance = newDatas.size() == 0 ?0: distances.get(obj).distanceMap.get(newDatas.get(newDatas.size() - 1));
                tempDist+=place.distance;
                newDatas.add(place);
            }
            //记录最短距离
            if(dist == -1 || dist >= tempDist){
                if(dist > tempDist){
                    arrayLists.clear();//清除之前的数据
                }
                dist = tempDist;
                arrayLists.add(newDatas);
            }else if(dist < tempDist){ //当前距离不是最短
                return;
            }
            return;
        }
        for (int i = 0; i < datas.size(); i++) {
            ArrayList newDatas = new ArrayList(datas);
            ArrayList newTarget = new ArrayList(target);
            newTarget.add(newDatas.get(i));
            newDatas.remove(i);
            sortPlace(newDatas, newTarget,num,start,end);
        }
    }