所以我为我的遗传算法编写了一个轮盘选择函数:
public String tournament(float fitness, Chromosome pop[], int selection)
{
// roulette
if (selection == 1)
{
Random random = new Random();
float slice = random.nextFloat() * fitness;
float curFitness = 0.0f;
for (int i = 0; i < initialPopulation; i++)
{
curFitness += pop[i].fitness;
if (curFitness >= slice)
return pop[i].bits;
}
}
return "";
}
问题是它有时会返回空白字符串,它只是放置它们以满足返回条件。这通常不是问题,但在某些运行期间,它会导致GA终止,因为下一步涉及交叉阶段。有什么想法吗?
答案 0 :(得分:2)
事实证明,变异函数偶尔会使我的某些位字符串无效,导致字符串包含空字符串。
之前,它看起来像这样:
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();
}
粗心的错误。
答案 1 :(得分:0)
我的猜测是,问题是您的fitness
偶尔会低于pop[i].fitness
es的总和。尝试在return "ERROR: " + fitness + " / " + curFitness;
循环之后但在for
之内放置一个if
行,或者那种性质的东西,并查看返回的内容。