/**
  * return a random individual (other than i unless i is the only member in the population).
  *
  * @param individuals List // List<DPSOIndividual>
  * @param i int
  * @param gen int unused
  * @param params HashMap must contain an entry <"thread.id",Integer val>
  * @return DPSOIndividual
  */
 public DPSOIndividual getBestIndividual(List individuals, int i, int gen, HashMap params) {
   final int indsz = individuals.size();
   final int id = ((Integer) params.get("thread.id")).intValue();
   final RndUtil rndgen = RndUtil.getInstance(id);
   int j = rndgen.getRandom().nextInt(indsz);
   if (j == i) {
     if (i < indsz / 2) ++j;
     else if (i > 0) --j; // if i==0 && i>=indsz/2 ==> indsz <= 1 thus keep j=0
   }
   DPSOIndividual ret = (DPSOIndividual) individuals.get(j);
   return ret;
 }