2010-10-28 128 views
4

所以我写了一个轮盘赌选择功能为我的遗传算法如下轮盘选择功能:的遗传算法

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

在什么情况下你将无法从循环中的语句返回?为什么会发生?放入一些调试线并查明。或者用调试器运行它。 – 2010-10-28 22:46:00

+0

此代码在最小化问题的情况下将失败。 – gpampara 2010-10-29 06:28:59

+0

我意识到我对这个派对有点晚了,但是用户所传递给这个功能的“健身”价值,是否是所有个人适合度的总和?只是好奇这是如何工作的。 – flavour404 2011-04-29 20:32:11

回答

0

我的猜测是,问题是你的fitness偶尔会比你的pop[i].fitness es的总和少。尝试在for循环之后放置return "ERROR: " + fitness + "/" + curFitness;行,但在if之内或其他类型的内容中查看返回的内容。

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(); 
} 

纰漏。