【算法设计与分析基础】8、穷举 旅行商问题
2017-04-27 16:53
531 查看
package cn.xf.algorithm.ch03; import java.util.LinkedList; import org.apache.commons.lang.StringUtils; import org.junit.Test; /** * * 功能:穷举 旅行商问题 * @author xiaofeng * @date 2017年4月26日 * @fileName TravelingSalesmanProblem.java * */ public class TravelingSalesmanProblem { /** * 递归穷举所有路径,路径可以但是和不对!!!,求高手指点???? * @param data * @param points * @param paths * @param count * @param pre * @param current */ public static void getPathAndCount(int data[][], LinkedList<Character> points, String paths, String pathCount, int count, char pre, char current) { if (points.size() == 0) { System.out.println( paths.toString() + " count:" + pathCount.substring(0, pathCount.length() - 2) + "=" + count); } else { int len = points.size(); String seq = "abcd"; // 保存当前路径节点 // char oldpre = new Character(current); pre = new Character(current); pathCount = new String(pathCount); for (int i = 0; i < len; ++i) { // 这个是浅拷贝 LinkedList<Character> newPoints = (LinkedList<Character>) points.clone(); // pre = current; current = new Character(newPoints.get(i)); newPoints.remove(i); int index1 = seq.indexOf(pre); int index2 = seq.indexOf(current); String newPaths = new String(paths); if (pre != current) { newPaths += "->" + current; if (index1 != -1 && index2 != -1) { count += data[index1][index2]; pathCount += data[index1][index2] + " + "; } } getPathAndCount(data, newPoints, newPaths, pathCount, count, pre, current); } } } /** * 换个说法,就是吧这个几个城市的全排列枚举出来 * @param data * @param points * @param paths * @param pathCount * @param count * @param pre * @param current */ public static void getPathAndCount2(int data[][], LinkedList<Character> points, String paths) { if(points.size() == 0){ String seq = "abcd"; String resultPath[] = paths.split("->"); //在这个时候进行统计数据和 String countPath = ""; int count = 0; String pre = resultPath[0]; String cur; for(int j = 1; j < resultPath.length; ++j){ if(!StringUtils.isEmpty(countPath)){ //如果是空,那么说明没有加入数据 countPath += " + " ; } //统计和路径 cur = resultPath[j]; countPath += data[seq.indexOf(pre)][seq.indexOf(cur)]; //求和 count += data[seq.indexOf(pre)][seq.indexOf(cur)]; pre = resultPath[j]; } System.out.println(paths + " count:" + countPath + " = " + count); return; } int len = points.size(); for(int i = 0; i < len; ++i){ //递归到节点全部加入,这里不能直接把原本的节点加入,应该是对一个新的链表操作,深拷贝 LinkedList<Character> newPoints = (LinkedList<Character>) points.clone(); String newPaths = new String(paths); Character cur = points.get(i); if(StringUtils.isNotEmpty(paths)){ //如果路径非空,说明已经有节点 newPaths += "->" + cur; } else { newPaths += cur; } newPoints.remove(i); //移除当前加入路径的节点 getPathAndCount2(data, newPoints, newPaths); } } @Test public void testGetPathAndCount(){ int data[][] = {{0,2,5,7},{2,0,8,3},{5,8,0,1},{7,3,1,0}}; LinkedList<Character> points = new LinkedList<Character>(); points.add('a');points.add('b');points.add('c');points.add('d'); String paths = ""; String pathCount = " "; int count = 0; char pre = '0'; char current = '0'; TravelingSalesmanProblem.getPathAndCount2(data, points, paths); // TravelingSalesmanProblem.getPathAndCount(data, points, paths, pathCount, count, pre, current); } public static void main(String[] args) { String seq = "abcd"; int data[][] = {{0,2,5,7},{2,0,8,3},{5,8,0,1},{7,3,1,0}}; System.out.println(seq.indexOf('a')); } }
第二个方法执行结果:
相关文章推荐
- 算法分析与设计基础(1)汉诺塔问题
- 【算法设计与分析基础】8、背包问题
- Java面向对象基础--类的设计及分析问题的方法---用户登录例子
- 网络分析优化旅行商问题TSP算法资源
- 算法分析与设计实验三 回溯法 24点问题 n皇后问题
- 算法分析与设计基础
- 【算法与设计分析基础】大整数乘法int[]版+分治法求幂
- 【算法设计与分析】最大子段和问题
- 【算法设计与分析】7、0/1背包问题,动态规划
- 【算法基础】由插入排序来看如何分析和设计算法
- 算法设计与分析--N皇后问题实现程…
- 计算机算法设计与分析之棋盘覆盖问题
- 算法分析与设计——矩阵连乘问题
- 用递归法:设计算法求解汉诺塔问题,并编程实现。 (1) Hanoi(汉诺)塔问题分析 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,C
- 算法设计与分析--小算法问题总结
- 【算法设计与分析】递归与分治----2.4 排列问题
- 算法分析与设计基础 学习笔记 第一章
- 算法分析与设计基础 (清华版)
- 关于算法分析的基础问题
- 算法分析与设计矩阵连乘问题