我正在尝试在java中执行类似TSP的操作,但我遇到了生成路径的问题。 我想用随机整数选择我的下一个“城市”,但是如果在我想重新随机化之前使用整数,而不是在索引唯一之前移动循环索引。
这就是我在代码中所拥有的。
int citynum = 10;
double maxdist = 0;
int ants = 10;
Random random = new Random(500);
Random ran = new Random(citynum);
double dist;
double pair = 0;
ArrayList<TestCity> cities = new ArrayList<>();
ArrayList<Integer> path = new ArrayList<>();
ArrayList<ArrayList<Integer>> used = new ArrayList<>();
ArrayList<Integer> bestpath = new ArrayList<>();
for (int i = 0; i < citynum; i++) {
dist = random.nextDouble();
cities.add(new TestCity(dist, i + 1));
}
/**
* generate paths
*/
for (int i = 0; i < ants; i++) {
for (int k = 0; k < cities.size(); k++) {
int j = ran.nextInt();
int[] usedNum = new int[citynum];
if (cities.get(j).isVisited() == false) {
cities.get(j).setVisited(true);
pair += cities.get(j).getDistance();
path.add(cities.get(j).getName());
}
}
used.add(path);
if(pair<maxdist){
maxdist=pair;
bestpath = path;
}
}
System.out.println(path);
我的问题是在spt中我在for()循环中使用随机数。我尝试使用整数数组来保持使用的随机数,但我只是迷失在循环中。 谁能告诉我怎么做?或者可能是一种更简单的方法,而不使用一些重大发布的algrithm?我不明白所有的数学。
答案 0 :(得分:1)
当您调用随机数/索引时,请使用HashSet。假设你有随机索引x。您现在检查它是否在HashSet中。如果不是,则将其添加到HashSet中,然后将其用作索引。如果它已经在HashSet中,则不使用它,并且只需要获取另一个随机索引y。
答案 1 :(得分:0)
如果已知城市数量 - 似乎是这种情况 - 您可以使用数字ArrayList<Integer>
填充另一个0
到cities.size()-1
(最大索引),然后使用java.util.Collections.shuffle(List<?>)
随机调整索引。然后你可以从头到尾迭代这个列表,你只需要获得每个索引一次。
对于下一个循环,您无需清除并重新填充索引列表,只需再次调用Collections.shuffle()
即可获得另一个订单。
Collection.shuffle(List<?>)
通过在随机基础上重新排序条目直接在列表上工作,并且应该非常快。