在ArrayList中使用Random作为索引,如果之前使用过,则不移动

时间:2014-01-03 21:12:54

标签: java random arraylist

我正在尝试在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?我不明白所有的数学。

2 个答案:

答案 0 :(得分:1)

当您调用随机数/索引时,请使用HashSet。假设你有随机索引x。您现在检查它是否在HashSet中。如果不是,则将其添加到HashSet中,然后将其用作索引。如果它已经在HashSet中,则不使用它,并且只需要获取另一个随机索引y。

答案 1 :(得分:0)

如果已知城市数量 - 似乎是这种情况 - 您可以使用数字ArrayList<Integer>填充另一个0cities.size()-1(最大索引),然后使用java.util.Collections.shuffle(List<?>)随机调整索引。然后你可以从头到尾迭代这个列表,你只需要获得每个索引一次。

对于下一个循环,您无需清除并重新填充索引列表,只需再次调用Collections.shuffle()即可获得另一个订单。

Collection.shuffle(List<?>)通过在随机基础上重新排序条目直接在列表上工作,并且应该非常快。