public void Mutate(float mutationRate) { for (var rowIndex = 0; rowIndex < rowCount; rowIndex++) { for (var columnIndex = 0; columnIndex < columnCount; columnIndex++) { var rand = SyncRandom.NextFloat(); if (rand < mutationRate) { // Debug.WriteLine(string.Format("mutated {0}:{1}", rowIndex, columnIndex)); matrix[rowIndex, columnIndex] += SyncRandom.NextGaussian() / 5; if (matrix[rowIndex, columnIndex] > 1) { matrix[rowIndex, columnIndex] = 1; } else if (matrix[rowIndex, columnIndex] < -1) { matrix[rowIndex, columnIndex] = -1; } } } } }
public void Randomize() { for (var rowIndex = 0; rowIndex < rowCount; rowIndex++) { for (var columnIndex = 0; columnIndex < columnCount; columnIndex++) { matrix[rowIndex, columnIndex] = SyncRandom.NextFloat(-1, 1); } } }
public Matrix Crossover(Matrix partner) { var child = new Matrix(rowCount, columnCount); var randomRow = SyncRandom.NextInt(0, rowCount); var randomColumn = SyncRandom.NextInt(0, columnCount); for (var rowIndex = 0; rowIndex < rowCount; rowIndex++) { for (var columnIndex = 0; columnIndex < columnCount; columnIndex++) { child.matrix[rowIndex, columnIndex] = (rowIndex < randomRow) || (rowIndex == randomRow && columnIndex <= randomColumn) ? matrix[rowIndex, columnIndex] : partner.matrix[rowIndex, columnIndex]; } } return(child); }
private Runner GetRandomRunner(Runner[] fromRunners) => fromRunners[SyncRandom.NextInt(0, fromRunners.Length)].Clone();