从人群中删除染色体?

时间:2012-04-30 12:45:50

标签: java arraylist genetic-algorithm

我正在尝试编写一种从我的人群中删除染色体的方法。我写的方法如下。我运行代码时出错了。人口用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);
}

5 个答案:

答案 0 :(得分:3)

你应该改变

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

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

答案 1 :(得分:0)

您不能确保此行population中的元素的索引为0:

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

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

void removeWorst() { 
   if (population.isEmpty()) {
      return;
   }
...

答案 2 :(得分:0)

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

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

您需要确保population.isEmpty()为假

population.get(worst).getChromosomeFitness()

同样,您需要确保(worst >= 0 && worst < population.size())

答案 3 :(得分:0)

问题似乎是你获得了实际的适应性而不是对象本身。问题出在这一行:int worst= population.get(0).getChromosomeFitness();。这是返回一个与List的尺寸无关的整数值,如你所说,它是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);
}

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

答案 4 :(得分:-1)

在尝试从中删除某些内容之前,确保群体中有某些内容?