0

我正在尝试编写一种方法来从我的人群中移除一条染色体。我写的方法如下。运行代码时出现越界错误。人口由ArrayList. 该getChromosomeFitness方法返回一个int值分数。有人能发现我的错误吗?

void removeWorst()
{   
  int worst = population.get(0).getChromosomeFitness();
  int temp = 0; 

  for(int i = 1; i < population.size(); i++)
  { 
    if (population.get(i).getChromosomeFitness() < population.get(worst).getChromosomeFitness())
    {
      worst = population.get(i).getChromosomeFitness();
      temp = i;
    }
  }
  Chromosome x = population.get(temp);
  population.remove(x);
}
4

5 回答 5

3

你可能应该改变

if (population.get(i).getChromosomeFitness() < population.get(worst).getChromosomeFitness())

if (population.get(i).getChromosomeFitness() < worst)
于 2012-04-30T12:52:10.390 回答
0

您不能保证在这一行population中有一个索引为 0 的元素:

int worst= population.get(0).getChromosomeFitness();

尝试将此添加到您的方法中:

void removeWorst() { 
   if (population.isEmpty()) {
      return;
   }
...
于 2012-04-30T12:49:13.403 回答
0

您的代码中有几个潜在问题:

int worst= population.get(0).getChromosomeFitness();

你需要确保这population.isEmpty()是错误的

population.get(worst).getChromosomeFitness()

同样的事情,你需要确保(worst >= 0 && worst < population.size()).

于 2012-04-30T12:51:35.350 回答
0

问题似乎是你得到了实际的适应度而不是物体本身。问题在于这一行:int worst= population.get(0).getChromosomeFitness();. 这将返回一个与列表尺寸无关的整数值,正如您所说,它是 chromozome 的适应度,它可能远远超过列表的大小。

这应该可以解决问题:

void removeWorst()
{  
  int temp=0;   

  for(int i=1; i <population.size();i++)
  { 
    if (population.get(i).getChromosomeFitness() < population.get(temp).getChromosomeFitness())
    {
      temp=i;
    }
  }
  Chromosome x= population.get(temp);
  population.remove(x);
}

话虽如此,这样做可能更简洁的方法是使用自定义比较器对列表进行排序,然后简单地删除最后一个元素。

于 2012-04-30T12:52:13.840 回答
-1

在尝试从中删除某些内容之前,确保人口中有一些内容?

于 2012-04-30T12:56:34.897 回答