private static Matix InvertMatrix(Matix matix) { foreach (var matrixNode in matix) { var x = matrixNode.X; matrixNode.X = matrixNode.Y; matrixNode.Y = x; if (matrixNode.X == matrixNode.Y) { matrixNode.Value = 1; } } foreach (var matrixNode in matix) { if (matrixNode.Value.HasValue) { continue; } var oneNodeValue = matix.FindEqualNodeXElement(matrixNode.Y); var firstOrDefault = matix[matrixNode.Y, matrixNode.X]; if (oneNodeValue == null || firstOrDefault == null) { continue; } var value = (oneNodeValue.Value / firstOrDefault.Value); matrixNode.Value = (double?)Math.Round((value ?? 0), 3); } return(matix); }
private static Matix NormalBestValues(Matix basematrix, Matix matix, bool plus) { Matix matix1 = new Matix(basematrix.Xcount, 1); foreach (MatrixNode matrixNode in matix1) { double sum = 0; List <MatrixNode> equalNodesXElement = basematrix.FindEqualNodesXElement(matrixNode.X); if (plus) { foreach (MatrixNode node in equalNodesXElement) { double sumrow = ((node.Value ?? 0) - (matix[1, node.Y].Value ?? 0)); sum += Math.Pow(sumrow, 2); } } else { foreach (MatrixNode node in equalNodesXElement) { double sumrow = ((node.Value ?? 0) - (matix[1, node.Y].Value ?? 0)); sum += Math.Pow(sumrow, 2); } } double val = Math.Sqrt(sum); matrixNode.Value = (double?)val; } return(matix1); }
private static Matix PrepareMatrix(Dictionary <string, double> dictionary) { dictionary = dictionary.OrderByDescending(x => x.Value).ToDictionary(f => f.Key, f => f.Value); var mastermatix = new Matix(1, dictionary.Count); var matix = new Matix(dictionary.Count, dictionary.Count); var yIndex = 1; foreach (var keyValuePair in dictionary) { mastermatix[1, yIndex].Value = keyValuePair.Value; mastermatix[1, yIndex].Key = keyValuePair.Key; yIndex++; } foreach (var cell in matix) { double?value = null; if (cell.X < cell.Y) { var matrixNode = mastermatix[1, cell.X]; if (matrixNode != null) { var node = mastermatix[1, cell.Y]; if (node != null) { value = (matrixNode.Value - node.Value) + 1; } } } matix[cell.X, cell.Y].Value = value; matix[cell.X, cell.Y].Key = mastermatix[1, cell.Y].Key; } return(InvertMatrix(matix)); }
private static List <TopSisReturnModel> FinalResult(List <TopSisModel> sisModels, Matix dplus, Matix dmin) { Matix matrixNodes = new Matix(dplus.Xcount, 1); foreach (MatrixNode matrixNode in matrixNodes) { double f = ((dplus[matrixNode.X, 1].Value ?? 0) + (dmin[matrixNode.X, 1].Value ?? 0)); double value = (dmin[matrixNode.X, 1].Value ?? 0) / f; matrixNode.Value = (double)Math.Round(value, 3); } List <TopSisReturnModel> outdictionary = new List <TopSisReturnModel>(); int grad = 1; foreach (MatrixNode matrixNode in matrixNodes.Where(x => x.Value > 0).OrderByDescending(x => x.Value).ToList()) { outdictionary.Add(new TopSisReturnModel() { RefId = sisModels[matrixNode.X - 1].RefId, Rank = grad, Score = Math.Round(matrixNode.Value ?? 0, 3), }); grad++; } foreach (MatrixNode matrixNode in matrixNodes.Where(x => x.Value == null || x.Value <= 0).ToList()) { outdictionary.Add(new TopSisReturnModel() { RefId = sisModels[matrixNode.X - 1].RefId, Rank = outdictionary.Max(x => x.Rank) + 1, Score = matrixNode.Value, }); } return(outdictionary); }
private static void MatrixNormal(Matix matix) { Matix matix1 = new Matix(matix.Xcount, matix.YCount); foreach (MatrixNode matrixNode in matix) { List <MatrixNode> findEqualNodesYElement = matix.FindEqualNodesYElement(matrixNode.Y); double sum = 0; foreach (MatrixNode node in findEqualNodesYElement) { sum += Math.Pow(node.Value ?? 0, 2); } double pow = Math.Sqrt(sum); double value = matrixNode.Value ?? 0; if (value > 0) { double result = value / pow; matix1[matrixNode.X, matrixNode.Y].Value = (double?)result; } else { matix1[matrixNode.X, matrixNode.Y].Value = 0; } } foreach (MatrixNode matrixNode in matix1) { matix[matrixNode.X, matrixNode.Y].Value = matrixNode.Value; } }
private static Matix GetBestValueColum(Matix matix, bool plus) { Matix matix1 = new Matix(1, matix.YCount); foreach (MatrixNode matrixNode in matix1) { List <MatrixNode> equalNodesYElement = matix.FindEqualNodesYElement(matrixNode.Y); matrixNode.Value = plus ? equalNodesYElement.Max(x => x.Value) : equalNodesYElement.Min(x => x.Value); } return(matix1); }
private static Matix NormalScores(Dictionary <string, double> formScores) { List <KeyValuePair <string, double> > keyValuePairs = formScores.ToList(); Matix matix1 = new Matix(formScores.Count, formScores.Count); for (int i = 1; i <= matix1.Xcount; i++) { for (int j = 1; j <= matix1.YCount; j++) { matix1[i, j].Key = keyValuePairs[j - 1].Key; matix1[i, j].Value = i == j ? keyValuePairs[j - 1].Value : 0; } } return(matix1); }
private static Matix MultiplicationMatrix(Matix matixa, Matix matixb) { Matix matix1 = new Matix(matixa.Xcount, matixb.YCount); foreach (MatrixNode matrixNode in matix1) { List <MatrixNode> equalNodesXElement = matixa.FindEqualNodesXElement(matrixNode.X); List <MatrixNode> findEqualNodesYElement = matixb.FindEqualNodesYElement(matrixNode.Y); double val = 0; for (int i = 0; i < matixa.YCount; i++) { double f = (equalNodesXElement[i].Value ?? 0) * (findEqualNodesYElement[i].Value ?? 0); val += f; } matrixNode.Value = (double?)val; } return(matix1); }
public static List <TopSisReturnModel> CalcTopsis(List <TopSisModel> dictionary, Dictionary <string, double> formScores) { Matix matrixa = PrepareMatrix(dictionary); if (formScores.Count != matrixa.YCount) { throw new Exception("data is not valid"); } Matix matrixb = NormalScores(formScores); Matix basematrix = MultiplicationMatrix(matrixa, matrixb); Matix aplus = GetBestValueColum(basematrix, true); Matix amin = GetBestValueColum(basematrix, false); Matix dplus = NormalBestValues(basematrix, aplus, true); Matix dmin = NormalBestValues(basematrix, amin, false); return(FinalResult(dictionary, dplus, dmin)); }
private static Matix PrepareMatrix(List <TopSisModel> dictionary) { int max = 1; for (int i = 1; i <= dictionary.Count; i++) { if (dictionary[i - 1].Scoreses.Count > max) { max = dictionary[i - 1].Scoreses.Count; } } Matix matix = new Matix(dictionary.Count, max); for (int i = 1; i <= dictionary.Count; i++) { for (int j = 1; j <= max; j++) { matix[i, j].Value = dictionary[i - 1].Scoreses.ToList()[j - 1].Value; matix[i, j].Key = dictionary[i - 1].Scoreses.ToList()[j - 1].Key; } } MatrixNormal(matix); return(matix); }