Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在对象数组上顺序/单独应用相同的函数?_Javascript_Algorithm_Iteration - Fatal编程技术网

Javascript 如何在对象数组上顺序/单独应用相同的函数?

Javascript 如何在对象数组上顺序/单独应用相同的函数?,javascript,algorithm,iteration,Javascript,Algorithm,Iteration,在将遗传算法成功应用于单个项目之后,我想优化对象数组的值 为了做到这一点,我尝试通过以下方式使用forEach循环: function getOptimalValues(req, res){ mdl.getItems({limit: 5}, function(err, items){//this function retrieves 5 items from database items.forEach(function (elem) { var queryObj = {

在将遗传算法成功应用于单个项目之后,我想优化对象数组的值

为了做到这一点,我尝试通过以下方式使用forEach循环:

function getOptimalValues(req, res){
mdl.getItems({limit: 5}, function(err, items){//this function retrieves 5 items from database
    items.forEach(function (elem) {
        var queryObj = {
            properties: elem,
            targetEnergy: req.targetEnergy
        };

        genetic.getOptimalQuantities(queryObj, function (err, optimalValues) {
            geneticResults.push(optimalValues);
            if (geneticResults.length == items.length) {
                res(null, geneticResults);
            }
        });
    });
});
}
genetic.GetOptimal数量定义如下:

function getOptimalQuantities(req, res){
var properties = req.properties;
var targetEnergy = req.targetEnergy;

var targetValues = {energy: targetEnergy, properties: properties};

var Task = require('genetic').Task;
var options = { getRandomSolution : getCandidateQuantities  // previously described to produce random solution
    , popSize : 100  // population size
    , stopCriteria : stopCriteria  // previously described to act as stopping criteria for entire process (set to 100 generations)
    , fitness : getFitnessValue  // previously described to measure how good your solution is
    , minimize : false  // whether you want to minimize fitness function. default is `false`, so you can omit it
    , mutateProbability : 0.1  // mutation chance per single child generation
    , mutate : mutate  // previously described to implement mutation
    , crossoverProbability : 0.3 // crossover chance per single child generation
    , crossover : crossoverFunction // previously described to produce child solution by combining two parents
};
var t = new Task(options);
t.targetValues = targetValues;
//t.on('mutate', function () { console.log('MUTATION!') });
t.on('statistics', function (statistics) {
    console.log('statistics',statistics.maxScore);
});
t.on('iteration start', function (generation) {
    console.log('iteration start - ',generation)
});
t.run(function (stats) {
    var dataObj = {quantities: stats.max, items: t.bestCombination}
    res(null, dataObj);
});
}
运行此过程时,我得到以下输出:

iteration start -  1
statistics 0.008126878121533886
iteration start -  1
iteration start -  1
statistics 0.007777620410591467
statistics 0.007777620410591467
iteration start -  1
iteration start -  1
iteration start -  1
statistics 0.008133385505205764
statistics 0.008133385505205764
statistics 0.008133385505205764
iteration start -  1
iteration start -  1
iteration start -  1
iteration start -  1
statistics 0.0093968469349952
statistics 0.0093968469349952
statistics 0.0093968469349952
statistics 0.0093968469349952
iteration start -  1
iteration start -  1
iteration start -  1
iteration start -  1
iteration start -  1
statistics 0.008431076204956763
statistics 0.008431076204956763
statistics 0.008431076204956763
statistics 0.008431076204956763
statistics 0.008431076204956763
iteration start -  2
iteration start -  2
iteration start -  2
iteration start -  2
iteration start -  2
...
对于传递给函数getOptimizationQuantilities的五个项中的每一项,应该有100次迭代,并且每次迭代中每个项的适应值(输出为统计值)应该是不同的(所有元素相等的可能性接近于零)。因此,通过观察输出,我猜遗传算法并不是针对本例中传递的5项中的每一项单独运行的

有人知道如何确保函数(在这种情况下是遗传算法)不会弄乱来自多个输入的数据吗?直观地说,很容易分别想象每个调用的顺序执行(这就是为什么要求顺序执行的原因),但一般来说,任何建议的方法,无论是顺序的还是并行的,都会非常有用

我感谢你的帮助


Niko

我相信这是您正在使用的库中的一个bug。它的类继承自节点的类,该类包含一个名为
init
的方法,该方法设置每个对象的侦听器哈希。但是,
Task
用它自己的
init
方法覆盖此方法:

Task.prototype.init = function (callback) {
  var self = this
  self.emit('init start')
  async.until(function () { return (self.population.length == self.popSize)}
    , function (callback) { self.getRandomSolution(function (solution) { self.population.push(solution); callback() }) }
    , function (err) { 
        if (err!=null) { self.emit('error', err) }
        else { 
          self.emit('init end', self.population)
      callback()
        }
      }
  )
}
这意味着不会调用
EventEmitter.init()
,这意味着
Task
的每个实例都没有自己的侦听器数据结构,而是使用相同的全局侦听器数据结构。当您只有一个
任务
实例时,这种方法可以很好地工作,但一旦同时处理了多个实例,那么它们中的每一个都将添加到同一个事件侦听器哈希中,并且每当它们中的任何一个发出事件时,都会收到通知