的遗传算法
问题描述:
所以我写了一个轮盘赌选择功能为我的遗传算法如下轮盘选择功能:的遗传算法
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终止,因为下一步涉及交叉阶段。有任何想法吗?
答
我的猜测是,问题是你的fitness
偶尔会比你的pop[i].fitness
es的总和少。尝试在for
循环之后放置return "ERROR: " + fitness + "/" + curFitness;
行,但在if
之内或其他类型的内容中查看返回的内容。
答
因此,事实证明,突变函数偶尔会使我的一些位串无效,导致群体包含空字符串。
之前,它是这样的:
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();
}
纰漏。
在什么情况下你将无法从循环中的语句返回?为什么会发生?放入一些调试线并查明。或者用调试器运行它。 – 2010-10-28 22:46:00
此代码在最小化问题的情况下将失败。 – gpampara 2010-10-29 06:28:59
我意识到我对这个派对有点晚了,但是用户所传递给这个功能的“健身”价值,是否是所有个人适合度的总和?只是好奇这是如何工作的。 – flavour404 2011-04-29 20:32:11