我目前正在使用p5.js库开发一个爬山遗传算法程序。
该程序使用遗传算法格式来重建任何你想要的图像。它的工作原理类似于我在youtube上找到的this program视频。
我有一个基因类,它有一个名为'graphic‘的属性,一旦基因被创建,它就被设置为一个新的p5.raphic对象。
还有一个Population类,它有一个名为‘Gene’的属性,它是一个由10个基因对象组成的数组。Population类的方法getHealthiest()返回基因数组中的基因,该基因的图形看起来最像目标图像。此外,在Population类中,有一个evolve()方法。
这就是我的问题所在。在evolve()方法中,我想要1.确定最健康的基因,2.清空除最健康的基因之外的基因阵列,并用9个其他的基因重新填充它,这些基因是最健康的基因的变体。为此,我需要将新基因的图形属性设置为等于最健康基因的图形属性。
this.evolve = function() {
var healthiestGene = this.getHealthiest(); //sets a variable equal to the healthiest gene
this.genes = []; //clearing out the genes array of the population
for (var i=0; i < this.populationSize; i++) {
this.genes[i] = new Gene(this.target); //creating a new Gene object
//This is the problem area
this.genes[i].graphic.loadPixels();
for (var j=0; j < healthiestGene.numPixels; j++){
this.genes[i].graphic.pixels[j] = healthiestGene.graphic.pixels[j];
}
this.genes[i].graphic.updatePixels();
if (i!=0) {
this.genes[i].mutate(); //I mutate every Gene in the array but one
}
this.genes[i].evaluateFitness();
}
}
目前,我通过将两个像素阵列逐个像素设置为相等来实现此目的,但我想知道是否有更有效的方法来实现此目的。我试着简单地写下:
this.genes[i].graphic.pixels = healthiestGene.graphic.pixels;
但这并没有起到任何作用。我很乐意建议我如何将这两个像素阵列设置为彼此相等,而不必逐个像素地遍历它们。
谢谢!
发布于 2018-09-11 07:06:31
您可能不希望将新实例设置为与旧实例相等,因为如果这样做,您对子实例所做的任何更改也会影响父实例。相反,您可能想要复制一份。
您可以创建一个新的图形实例,然后将旧实例绘制到新实例。如下所示:
var pg2 = createGraphics(pg.width, pg.height);
pg2.image(pg, 0, 0);
此时,pg2
将包含pg
最初拥有的所有内容。
https://stackoverflow.com/questions/52266518
复制相似问题