我正在尝试编写一种从我的人群中删除染色体的方法。我写的方法如下。我运行代码时出错了。人口用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);
}
答案 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)
在尝试从中删除某些内容之前,确保群体中有某些内容?