static DataMatrices ReadData(string path) { int[,] ParseMatrix(int size, IEnumerable <string> rawData) { int[,] matrix = new int[size, size]; int x = 0; foreach (var line in rawData) { var values = line.Split(' '); int y = 0; foreach (var value in values.Where(v => !string.IsNullOrEmpty(v))) { matrix[x, y] = int.Parse(value); y++; } x++; } return(matrix); } var data = File.ReadAllLines(path).Where(x => !string.IsNullOrEmpty(x)).ToArray(); var result = new DataMatrices(int.Parse(data[0].Trim())); data = data.Skip(1).ToArray(); var rawMatrixA = data.Take(result.MatricesSize); var rawMatrixb = data.Skip(result.MatricesSize); result.MatrixA = ParseMatrix(result.MatricesSize, rawMatrixA); result.MatrixB = ParseMatrix(result.MatricesSize, rawMatrixb); return(result); }
static float Score <T>(DataMatrices data, IEnumerable <T> permutation) { var permutationArray = permutation.Cast <int>().Select(x => x - 1).ToArray(); var score = 0f; var maxIndex = permutation.Count() - 1; foreach (var i in QapMath.Range(0, maxIndex)) { foreach (var j in QapMath.Range(0, maxIndex)) { score += data.MatrixA[i, j] * data.MatrixB[permutationArray[i], permutationArray[j]]; } } return(score); }