qjh2375580241
2020-04-02 22:47:10
完
使用java写出旅行商问题,很难很难,求大佬们帮帮忙!
现在需要做一个TSP问题的解法,表示遇到了无奈的情况
问题描述:旅行商问题,已知N个城市的坐标或者距离邻接矩阵(int类型),从一个城市出发固定0城市或者固定1城市出发,经过且仅经过其余N-1个城市一次,回到出发城市。求最短距离,并且需要知道最短距离的途径路径。
测试样例:已知坐标的,最大有52个城市
已知距离邻接矩阵的,最大有58个城市
0、暴力法:城市顺序全排列,找到最短距离(纯属开玩笑,跑两天不知道行不行···
1、回溯法:运行了1个小时才能得到结果而且只是,表示未免也太慢了点吧。
2、分支定界法:空间消耗太大了,运行时间也难以保证。
3、动态规划法:空间复杂度要求太高了,城市稍微比较多的样例程序就会崩···,数量比较少的样例倒是没问题,自己写出来了
4、模拟退火算法,遗传算法,蚁群算法,看了半天的算法介绍,表示自己学不会怎么破···
5、其他算法:禁忌搜索?(其实这个觉得能写,但算法有点不理解····
想问问大神们,有什么好的方法可以过了那17个样例。真心感谢啊······
评论
所有回答列表(2)
lzj1239825268 LV2
2020年4月3日
就用tsp 算法啊,TSP还不简单么,给你个案例
package book; import java.util.Scanner; public class TSP { static int n,m;//n城市数量,m边数量 static int grh[][];//地图 static int curentlength,bestlength;//当前距离,最短距离 static int curent[],best[];//当前路线,最好的路线 static int Max=Integer.MAX_VALUE; public static void main(String[] args) { Scanner sc=new Scanner(System.in); n=sc.nextInt(); m=sc.nextInt(); grh=new int[n+1][n+1]; curent=new int[n+1]; best=new int[n+1]; curentlength=0; bestlength=-1; for(int i=1;i<=n;i++) { curent[i]=i; for(int j=1;j<=n;j++) { grh[i][j]=Max;//初始化地图,每个点之间的距离都是无穷大 } } for(int i=1;i<=m;i++) { int start = sc.nextInt(); int end = sc.nextInt(); int length = sc.nextInt(); grh[start][end]=length; grh[end][start]=length;//把所有的边存储起来 } backtrace(2); if(bestlength!=-1) { for(int i=1;i<=n;i++) { System.out.print(best[i]+" "); } System.out.println("1"); System.out.println(bestlength); }else { System.out.println("-1"); } } private static void backtrace(int t) { if(t==n) { if(grh[curent[n-1]][curent[n]]!=Max&&grh[curent[n]][1]!=Max&& (curentlength+grh[curent[n-1]][curent[n]]+grh[curent[n]][1]<bestlength||bestlength==-1)) { //1.当到准备去第n个城市的时候,首先要判断当前售货员与第n个点有没有路线,没有路线就剪掉 //2.要判断第n个点与起点1有没有路线,没有也要剪掉 //3.判断走完这条路线,回到原点的总距离是不是小于已经知道的最短距离,如果大于也剪掉 //如果都符合,就要做更新操作 for(int i=1;i<=n;i++) { best[i]=curent[i]; } bestlength=curentlength+grh[curent[n-1]][curent[n]]+grh[curent[n]][1]; } }else { for(int i=t;i<=n;i++) { if(grh[curent[t-1]][curent[i]]<Max&&(curentlength+grh[curent[t-1]][curent[i]]<bestlength||bestlength==-1)) { //上面的剪枝条件是,t-1表示现在售货员所在的城市,i表示他现在要准备去的城市,两者之间必须要有边 //bestlength=-1表示第一次走 //符合条件我们就需要交换 swap(t,i); curentlength=curentlength+grh[curent[t-1]][curent[t]]; backtrace(t+1); curentlength=curentlength-grh[curent[t-1]][curent[t]]; swap(t,i); } } } } private static void swap(int t, int i) { int temp=0; temp=curent[t]; curent[t]=curent[i]; curent[i]=temp; } }
评论(0)
最佳答案
- 等 最代码怎么获取牛币啊?
- 完 谁来告诉我最代码上线的时间,答对者给5牛币,先来先得
- 等 牛友们,大家好,你们做程序员多久了?现在还好吗?
- 完 在微信打开的页面里进行app下载
- 等 最代码2014年欢乐聚声会
- 完 mysql如何查询表数据并且对3个字段降序的SQL?
- 完 最代码牛币机制改革
- 完 成功的在bae上使用了自定义运行环境 jetty+nginx的组合,大家对jetty+nginx优化有哪些心得?
- 完 进来分享一下各位牛牛是如何加入最代码大家庭的?
- 等 为什么java BufferedImage类处理大图直接抛出内存溢出的异常?
- 等 最代码是否开发手机app客户端?
- 完 java程序员学习哪些java的技术?java有哪些框架?都能做哪方面的开发?
- 等 php格式网页文件怎么运行?
- 等 Java volatile值获取的问题
- 等 前端vue,拦截了登录后台后,返回的token,requests拦截token,但是发送请求的时候,就出现跨越异常
- 等 大专本科计算机科班怎么找到Java工作?
- 等 eclipse怎么把三个java swing游戏项目合成一个项目?
- 完 伙伴们,大家都有什么好的解压方式么,分享一下~
- 完 三四线城市,6、7k,运维工作,索然无味,想去辞职上培训,各位牛牛有什么建议嘛
- 等 jsp页面输入中文变成问号
- 等 JPA在线上运行一段时间后报错Caused by: java.lang.IncompatibleClassChangeError: null
- 等 PHP 这个规则用preg_match_all怎么写
- 等 大佬们,有没有知道Alfresco如何配置LDAP登录呢?
- 等 php的install目录是框架带的吗?
相关问答
最近浏览
WASDZZ LV13
2021年7月10日
admin-admin LV2
2021年4月22日
ld2805644085 LV1
2021年2月27日
是一个鸽子啊 LV17
2021年1月15日
liuxinying2002
2020年12月2日
暂无贡献等级
glyph LV10
2020年11月28日
ccbbll
2020年10月22日
暂无贡献等级
小罗话杨 LV2
2020年8月24日
xu_16888
2020年7月16日
暂无贡献等级
zhangtian1997 LV10
2020年7月13日