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

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

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

从两张图可以判断,规划的结果相差将近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);
        }
    }

为了看的更直观,我用Android写了个demo ,(android apk下载地址:http://apk.hefan.space/NavTogether-release-v1.1-2-01080911.apk)集成了这个算法,我把源码放在一个Android开发分享的 navtogether 项目里,我会陆续发文章讲解里面所用的涉及三角关系的算法,有兴趣的朋友可以下载demo自己研究,不会Android 开发的可以下载项目中的utils代码来研究,注释写的很详细。本文相关的 源码地址 http://gitblit.hefan.space/summary/algorithms%2Fnavtogether.git

也可以加QQ群交流技术

最后推荐一个我自己写的MVVM开源项目《Open MVVM》
(想加扣扣讨论群请进入文章结尾查看群号)

有问题请私信,留言,或者发送邮件到我扣扣邮箱 qingingrunt2010

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值