经过这段时间的使用和研究,我发现点和点之间的最短路线并不是最优的。针对所有点的组合可能,
得到的最短路线才是最好的(也就是TSP方法),然后再结合点对点之间的距离进行比较,得到的才是相对最优方案。

举例:A、B、C、D四个点。自由组合,得到最短路线方案。
所有的组合路线应该是(此处我们只需要四个点的组合)
ABCD
ABDC
ACBD
ACDB
ADCB
ADBC
BACD
BADC
BCAD
BCDA
BDCA
BDAC
CBAD
CBDA
CABD
CADB
CDAB
CDBA
DBCA
DBAC
DCBA
DCAB
DACB
DABC
得到的结果是这样么多(24条路线);
n!=(n-1)!*n

A、B、C、D四个点。设定一个点为起点(我设置A为起点),不设定终点,得到最短路线方案
BCD
BDC
CBD
CDB
DCB
DBC

A为起点,BCD自由组合,则有6条路线;
现在对6个结果进行最短距离排序;根据高德的路线规划,得到一个最短路线;

然后对着一条路线进行规划,你会得到一个路线的所有途径点的集合,然后对途径地点之间的距离进行排序
,然后调整路线,进行显示就可以了。

下面开始上代码;

// 添加数据

if (start == null) {Toast.makeText(this, "请选择起点", Toast.LENGTH_SHORT).show();return;}if (throughList.size() == 0) {Toast.makeText(this, "请添加途径点", Toast.LENGTH_SHORT).show();return;}startTip = new LatLonPoint(new BigDecimal(start.getLat()).doubleValue(), new BigDecimal(start.getLon()).doubleValue());sortPoint(throughList, startTip);
  // 组合点,得到所有可能的路线
private void sortPoint(List<Bean> allList,LatLonPoint start) {String s = "";for (int i = 0; i < allList.size(); i++) {s += allList.get(i).getId();}char[] result = s.toCharArray();routes = TSPUtil.sortPoint(result, 0);for (int i = 0; i < routes.size(); i++) {plan(allList, routes.get(i),start);}
}
static List<String> list = new ArrayList<>();
public static List<String> sortPoint(char result[], int k){String s = "";if(k==result.length){for(int i=0;i<result.length;i++){s += result[i];}list.add(s);return list;}for(int i=k;i<result.length;i++){//交换{char t = result[k];result[k] = result[i];result[i] = t;}//递归,下一个数去排列sortPoint(result,k+1);//再归位数据{char t = result[k];result[k] = result[i];result[i] = t;}}return list;
}

// 开始路线规划

 private void plan(List<Bean> points,String s,LatLonPoint start) {char[] array = s.toCharArray();for (int i = 0; i < array.length; i++) {through1.clear();through2.clear();// 得到策略后所有点的集合for (int j = 0; j < points.size(); j++) {if (points.get(j).getId().equals(String.valueOf(array[i]))) {through2.add(points.get(j));}}// 填充规划集合for (int j = 0; j < through2.size(); j++) {through1.add(new LatLonPoint(new BigDecimal(through2.get(j).getLat()).doubleValue(),new BigDecimal(through2.get(j).getLon()).doubleValue()));}}AMapUtil.doRoutePlan(start,through1.get(through1.size()-1),through1,this,this);}
// 得到最短距离,根据最短距离得到最短路线,并展示地图@Overridepublic void onDriveRouteSearched(DriveRouteResult driveRouteResult, int i) {if (i == 1000) {if (driveRouteResult != null && driveRouteResult.getPaths() != null) {disList.add(Double.valueOf(driveRouteResult.getPaths().get(0).getTollDistance()));if (minDistance == 0) {minDistance = driveRouteResult.getPaths().get(0).getTollDistance();}else {if (minDistance > driveRouteResult.getPaths().get(0).getTollDistance()) {minDistance = driveRouteResult.getPaths().get(0).getTollDistance();}}if (disList.size() == routes.size()) {for (int j = 0; j < disList.size(); j++) {if (minDistance == disList.get(j)) {if (throughList.size() > j && throughList.get(j) != null) {minDisRoute = throughList.get(j);Bundle bundle = new Bundle();bundle.putString("start",GsonInstance.getInstance().toJson(start));bundle.putString("end",GsonInstance.getInstance().toJson(throughList.get(0)));bundle.putSerializable("list", (Serializable) throughList);startActivity(ShowRouteActivity.class,bundle,true);break;}}}}Log.d(TAG, "onDriveRouteSearched: 规划成果="+minDistance);}}}

下面就不说了,上一篇都已经讲到。传送阵

后面会有下载链接。完整demo,仅供参考。

完整demo

可下载demo运行测试。欢迎评论/私信

高德地图之路线规划 多点路线规划路线最短原则之二 TSP算法相关推荐

  1. 基于高德地图实现vue3的移动端物流路线相关功能

    基于高德地图实现vue3的移动端物流路线相关功能 自我记录 一.参考文档 高德地图开放平台: https://lbs.amap.com/ Web开发-JSAPI文档: https://lbs.amap ...

  2. VUE中使用高德地图.做个轨迹添加器,为路线规划做数据

    准备工作 使用前准备 : 高德地图key 使用插件: vue-amap 1.npm安装vue-amap npm install vue-amap --save 2 在mai.js中引入 import ...

  3. 高德地图API总结--Marker多点聚合

    Marker多点聚合计算 什么是多点聚合呢?所谓的多点聚合,就是计算地图上一定范围内的点的个数,然和讲所有的点统计的数量显示在范围内设置的marker上:我们需要解决的问题有:1.在地图上划定区域范围 ...

  4. js添加多marker 高德地图_高德地图点聚合--Marker多点聚合及多个marker点击事件

    本篇文章主要是高德地图的多点聚合,及多个marker点击事件 以下为简单的模拟数据 soogif (1).gif image.png 具体代码如下 点聚合 html, body, #container ...

  5. 快速接入高德地图SDK(地图+定位+标记+路线规划+搜索)

    文章目录 申请接入流程 显示高德地图 显示定位 Marker 显示地图标记 Route 路线规划 Search 搜索 申请接入流程 1.首先到 [ 高德地图API官网] 申请注册帐号 2.进入控制台, ...

  6. Android开发知识(十)快速接入高德地图SDK(地图+定位+标记+路线规划+搜索)

    文章目录 申请接入流程 显示高德地图 显示定位 Marker 显示地图标记 Route 路线规划 Search 搜索 申请接入流程 1.首先到 [ 高德地图API官网] 申请注册帐号 2.进入控制台, ...

  7. 高德地图记录跑步轨迹_高德地图周边跑步路线功能体验地图秒变运动利器

    跑步需要持之以恒,才能不断地给身体"充电",达到锻炼的目的.那么,怎样才能规划一条最适合跑步的路线,并且督促自己严格完成预设的目标呢?高德地图V8.0.8新增了"周边跑步 ...

  8. 高德地图哪个语音包最好_高德地图VS百度地图,哪个更靠谱?

    国庆出行选择一个好的导航是非常有必要的,百度地图和高德地图都是我们最常用的手机导航软件,那么它们到底哪个更靠谱,更适合我们呢? 1.界面设计 从首页来看,高德的画面更简洁易懂,搜索框在下面,子菜单有驾 ...

  9. vue 高德地图 不同区域显示不同颜色_高德地图车机版4.0解析:看不见的升级才是重点...

    近日,高德正式发布高德地图车机版(AMAP AUTO)4.0. 自2016年初高德地图车机版(AMAP AUTO)首次亮相后,此次正式推出的4.0版本,已经是该智能车载导航产品的第三次大升级. 在车云 ...

最新文章

  1. 具有absolute、relative、fixed的div设置宽度和高度的效果
  2. 云原生产业联盟成立 蚂蚁金服当选为理事单位
  3. CSS margin详解
  4. python 归并排序(详解)
  5. sklearn特征的提取(下)
  6. 网络调试指令ping、telnet、curl
  7. 【队列】Team Queue(luogu-UVA540/poj 2259)
  8. LeetCode 2169. 得到 0 的操作数
  9. 很感人的爱情故事——世界上最遥远的距离
  10. 使用windows的事件查看器(eventvwr),查看、电脑执行过的你不知道的操作・开机・关机时间
  11. 北大计算机最好的班叫什么,中国大学计算机最好的班,再次迎来“图灵奖”导师,赶超“姚班”...
  12. Java中遍历Set集合的三种方法
  13. Atitit 研发团队建设----福利法案--非物质福利与物质福利法案
  14. 斗鱼显示弹幕服务器连接失败,斗鱼看不到弹幕怎么办 斗鱼无法看到弹幕的解决方法...
  15. python 红黑树_手把手教你43行代码写红黑树(包括删除操作)
  16. poi怎么设置某个单元格为下拉框_java excel 多选下拉列表设置
  17. Python经典例题:跑马灯文字效应
  18. 人工智能机器人标准化建设的意义
  19. SPSS对个案值的计数功能解析
  20. FCKEDITOR编辑器的使用

热门文章

  1. 李彦宏、丁磊都表态要回国上市,A股将迎来新经济公司上市潮?
  2. SAAS系统架构之数据存储方案
  3. 虚拟机也能做服务器吗,虚拟机可以做服务器吗
  4. Linux 目录和文件权限总结
  5. wps word内表格与上面文字距离大
  6. 大自然发怒了…………超级病菌变种愈演愈烈
  7. Java递归小算法_若雪似风_新浪博客
  8. 外文翻译原文附在后面_600分求毕业论文中的外文翻译,要有外文原文和译文
  9. LeetCode刷题日记2022-1-15/1716. 计算力扣银行的钱-暴力求解
  10. 解决localhost:8080被占用