Java 遗传算法的轮盘选择函数
因此,我为我的遗传算法编写了一个轮盘选择函数,如下所示:Java 遗传算法的轮盘选择函数,java,genetic-algorithm,roulette-wheel-selection,Java,Genetic Algorithm,Roulette Wheel Selection,因此,我为我的遗传算法编写了一个轮盘选择函数,如下所示: public String tournament(float fitness, Chromosome pop[], int selection) { // roulette if (selection == 1) { Random random = new Random(); float slice = random.nextFloat() * fitness; f
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 "";
}
公开字符串比赛(浮动适应度、染色体pop[],整数选择)
{
//轮盘赌
如果(选择==1)
{
随机=新随机();
float slice=random.nextFloat()*适合度;
浮动电流适应度=0.0f;
对于(int i=0;i=切片)
返回pop[i].位;
}
}
返回“”;
}
问题是,有时返回空白字符串,只放置它们以满足返回条件。这通常不是问题,但在某些运行期间,它会导致GA终止,因为下一步涉及交叉阶段。有什么想法吗?
我猜问题在于你的健康状况
有时会低于你的pop[i]健康状况的总和。尝试输入一个return“错误:“+fitness+”/“+curFitness在for
循环后的行中,但在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 "";
}
公共字符串变异(字符串位)
{
随机=新随机();
StringBuffer buf=新的StringBuffer(位);
对于(int i=0;i
我把它改成这样:
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();
}
公共字符串变异(字符串位)
{
随机=新随机();
StringBuffer buf=新的StringBuffer(位);
对于(int i=0;i
粗心的错误。在什么情况下,循环中的语句无法返回?为什么会这样?输入一些调试行并找出答案。或者使用调试器运行它。如果出现最小化问题,此代码将失败。我意识到我参加这次聚会有点晚了,但是用户要向此函数传递的“适合度”值,是所有单独适合度的总和吗?只是好奇这是怎么回事。