Таким образом, оказывается, что функция мутации иногда обнуляла некоторые из моих битовых строк, из-за чего в населении содержались пустые строки.
Раньше это выглядело так:
public String mutate(String bits)
{
Random random = new Random();
StringBuffer buf = new StringBuffer(bits);
for (int i = 0; i < bits.length(); i++)
{
if (random.nextFloat() < mutationRate)
{
if (bits.charAt(i) == '1')
{
buf.setCharAt(i, '0');
return buf.toString();
}
else
{
buf.setCharAt(i, '1');
return buf.toString();
}
}
}
return "";
}
И я изменил это на следующее:
public String mutate(String bits)
{
Random random = new Random();
StringBuffer buf = new StringBuffer(bits);
for (int i = 0; i < bits.length(); i++)
{
if (random.nextFloat() < mutationRate)
{
if (bits.charAt(i) == '1')
{
buf.setCharAt(i, '0');
}
else
{
buf.setCharAt(i, '1');
}
}
}
return buf.toString();
}
Неосторожная ошибка.