方法中的变量范围

时间:2014-04-16 18:55:03

标签: javascript

前几天,我正在教自己如何制作二进制遗传算法。目标是使其匹配随机生成的35长度二进制字符串。我遇到了一个问题,其中方法正在编辑我认为不属于其范围的变量。这导致我的解决方案慢慢降低适应性而不是增加!在我发现这发生的地方后,我通过newP [0] .join('')修复了它。分裂('')以便newP [0]本身不会编辑。为方便起见,我在评论中标出了问题所在的位置。

虽然我已经解决了这个问题,但我希望能够理解为什么会发生这种情况,并且还可以防止不加入/分裂愚蠢。

以下是代码:

var GeneticAlgorithm = function () {};

GeneticAlgorithm.prototype.mutate = function(chromosome, p) {
  for(var i = 0; i < chromosome.length; i++) {
    if(Math.random() < p) {
      chromosome[i] = (chromosome[i] == 0) ? 1 : 0;
    }
  }
  return chromosome;
};

GeneticAlgorithm.prototype.crossover = function(chromosome1, chromosome2) {
  var split = Math.round(Math.random() * chromosome1.length);
  var c1 = chromosome1;
  var c2 = chromosome2;

  for(var i = 0; i < split; i++) {
    c1[i] = chromosome2[i];
    c2[i] = chromosome1[i];
  }

  return [c1, c2];
};

// fitness = function for finding fitness score of an individual/chromosome (0-1)
// length = length of string (35)
// p_c = percentage chance of crossover (0.6)
// p_m = percentage change of mutation (0.002)
GeneticAlgorithm.prototype.run = function(fitness, length, p_c, p_m, iterations) {
  var iterations   = 100;
  var size         = 100;

  // p = population, f = fitnesses
  var p = [];
  var f = [];
  for(var i = 0; i < size; i++) {
    p.push(this.generate(length));
    f.push(fitness(p[i].join('')));
  }

  while( iterations > 0 && Math.max.apply(Math, f) < 0.999 ) {
    var mates  = [];
    var newP   = [];
    var newF   = [];

    mates = this.select(p, f);
    newP.push(mates[0], mates[1]);

     while(newP.length < size) {

      /*-------------------> Problem! <-------------------*/
      mates = [newP[0].join('').split(''), newP[1].join('').split('')];
      /*
       *   If I passed newP[0] when mates[0] changed newP[0] would also change 
       */

      if(Math.random() < p_c) {
        mates = this.crossover(mates[0], mates[1]);
      }

      mates[0] = this.mutate(mates[0], p_m);
      mates[1] = this.mutate(mates[1], p_m);

      newP.push(mates[0], mates[1]);
    }

    for(var i = 0; i < size; i++) {
      newF.push(fitness(newP[i].join('')));
    }

    p = newP;
    f = newF;

    iterations--;
  }

  return p[f.indexOf(Math.max.apply(Math, f))].join('');
};

0 个答案:

没有答案