Я работаю над генетическим алгоритмом, который воссоздает картины с использованием треугольников. В настоящий момент мой метод, используемый для заселения детей, меняет ценности родителей, и я не могу понять, почему.
public void populate()
{
System.out.println("pre: " + Arrays.toString(triangles[0][0]));
for(int drawNum = 2; drawNum < 12; drawNum ++)
{
for(int triNum = 0; triNum < numTriangles; triNum ++)
{
double pChooser = Math.random();
if (pChooser < .45)
{
triangles[drawNum][triNum] = triangles[0][triNum];
}
else if (pChooser < .9)
{
triangles[drawNum][triNum] = triangles[1][triNum];
}
else
{
triangles[drawNum][triNum] = randomTriangle();
}
}
}
genNum ++;
System.out.println("pst: " + Arrays.toString(triangles[0][0]));
}
private int[] randomTriangle()
{
int[] result = new int[9];
for(int i = 0; i < 9; i++)
{
result[i] = (int) (Math.random() * 256);
}
return result;
}
triangles - это трехмерный массив int, который содержит каждый рисунок, каждый треугольник на рисунке и каждое значение конечных точек и цвет треугольника в форме triangles[drawingNumber][triangleNumber][values]. triangles[0] и triangles[1] - это два родителя. Операторы print печатают значения первого треугольника в первом родительском элементе до и после формирования дочерних элементов. Однако операторы до и после печати возвращают разные результаты, что означает, что triangles[0][0] был изменен где-то в коде, но я не могу понять, где это.
треугольники - это int [] [] []. Он содержит текущие ценности родителей и детей. @Carcigenicate
Учитывая индексы ваших циклов, для triangles[0][0] не представляется возможным назначить другой массив int[] в этих циклах, поэтому это должен быть тот же массив. Возможно ли, что ваш метод randomTriangle() записывает в существующий массив triangles[i][j]?
Можете выложить код randomTriangle()? Он вообще пишет на triangles?
@Joffrey randomTriangle() просто создает и возвращает int[], который содержит значения для нового треугольника.
Как генерируется triangles?
@Ishamael первые родители генерируются случайным образом, а остальные заполняются с помощью populate()
Думаю, мой вопрос заключался в том, как создается массив, а не как вычисляются значения.
@Ishamael это общедоступная глобальная переменная, созданная как public int[][][] triangles = new int[12][numTriangles][9]
Еще два вопроса: все ли однопоточно, и вы когда-нибудь меняли элементы нижнего уровня triangles (например, треугольники [a] [b] [c])
@JoshCzopek, похоже, нам просто не хватает информации, чтобы помочь вам. Попробуйте предоставить MCVE, чтобы мы могли видеть, что происходит. Здесь, если все однопоточное, если мы удалим genNum ++; и добавим инициализацию triangles, похоже, что у нас есть минимальный рабочий код. Это воспроизводит вашу проблему (поскольку два оператора печати печатают разные вещи)?




Какого типа элементы в массиве
triangles?