В настоящее время я работаю над программой генетического алгоритма подъема в гору с использованием библиотеки p5.js.

Программа использует формат генетического алгоритма для воссоздания любого изображения, которое вы хотите. Она работает аналогично этой программе, видео о которой я нашел на YouTube.

У меня есть класс Gene, который, помимо прочего, имеет атрибут под названием «графика», который устанавливается равным новому объекту p5.graphic после создания гена.

Существует также класс Population с атрибутом под названием «гены», который представляет собой массив из 10 объектов Gene. Метод getHealthiest () класса Population возвращает Gene в массиве генов, графический объект которого больше всего похож на целевое изображение. Также в классе 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;

Но это ничего не дало. Я хотел бы получить любое предложение о том, как я могу установить эти два массива пикселей равными друг другу, не просматривая их пиксель за пикселем.

Благодарность!

2
Alex Medoff 11 Сен 2018 в 01:54

1 ответ

Лучший ответ

Вероятно, вы не хотите просто устанавливать новый экземпляр равным старому, потому что тогда любые изменения, которые вы вносите в дочерний элемент, также повлияют на родительский. Вместо этого вы, вероятно, захотите сделать копию.

Вы можете создать новый экземпляр графики, а затем перетянуть старый экземпляр к новому. Что-то вроде этого:

var pg2 = createGraphics(pg.width, pg.height);
pg2.image(pg, 0, 0);

На этом этапе pg2 будет содержать все, что изначально было у pg.

1
Kevin Workman 10 Сен 2018 в 23:06