java 开发之 最近(最短)路线规划算法 迪杰斯特拉(Dijkstra)和个人研究的算法对比
最近公司的物流项目要做最短路线规划, 网上找了很多,描述和使用最多的就是地杰斯特拉(Dijkstra)算法,这个算法的逻辑是两点连接是以最近的路线规划,但实际规划出来的整条线在特定条件下并不是最近的,所以我自己又研究了一套算法进行对比。先上图吧
迪杰斯特拉的规划结果
我的算法结果
从两张图可以判断,规划的结果相差将近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);
}
}