public void crateErrorsEquation() { shortest_path.shortest_path my_shortest_path = new shortest_path.shortest_path(pathNum, pointNum, pointNum_K, pointName); for (int i = 0; i < pathNum; i++) { my_shortest_path.createObservation(i, my_observation[i].starName, my_observation[i].stopName, my_observation[i].length); } my_shortest_path.createGraph(); for (int i = 0; i < pointNum - pointNum_K; i++) { my_shortest_path.Dijkstra(i + pointNum_K); singlePath = my_shortest_path.getmixPath(); singleDistance = my_shortest_path.getmixDistance(); for (int j = 0; j < pointNum_K; j++) { mixPath[i, j] = singlePath[j]; mixDistance[i, j] = singleDistance[j]; if (mixDistance[i, j] != 0.0) { Console.Write("mixPath[{0}]:{1} ", j, mixPath[i, j]); Console.Write("mixDistance[{0}]:{1}", j, mixDistance[i, j]); Console.Write("\n"); } } Console.WriteLine("/////////////////////////////////////////////////////////////"); Array.Clear(singlePath, 0, pointNum); Array.Clear(singleDistance, 0, pointNum); } Console.WriteLine("/////////////////////////////////////////////////////////////"); for (int i = 0; i < pointNum - pointNum_K; i++) { double tempMix = mixDistance[i, 0]; indexMix[i] = 0; if (pointNum_K != 1) { for (int j = 0; j < pointNum_K - 1; j++) { if (mixDistance[i, j + 1] < tempMix) { indexMix[i] = j + 1; tempMix = mixDistance[i, j + 1]; } } } Console.WriteLine("indexMix[{0}]:{1}", i, indexMix[i]); } Console.WriteLine("/////////////////////////////////////////////////////////////"); for (int i = 0; i < pointNum - pointNum_K; i++) { for (int j = 0; j < pointNum_K; j++) { if (j == indexMix[i]) { pathMix[i] = mixPath[i, j]; } } Console.WriteLine("pathMix[{0}]:{1}", i, pathMix[i]); } Console.WriteLine("/////////////////////////////////////////////////////////////"); for (int i = 0; i < pointNum - pointNum_K; i++) { int[] digitPath = getDigitPath(pathMix[i]); for (int j = 0; j < digitPath.Length; j++) { Console.WriteLine("digitPath[{0}]:{1}", j, digitPath[j]); } double Height = 0.0; my_point[i + pointNum_K].Hcirca = my_point[digitPath[digitPath.Length - 1]].Hexact; for (int j = digitPath.Length - 1; j > 0; j--) { double singleHeight = 0.0; for (int k = 0; k < pathNum; k++) { if (my_point[digitPath[j]].name == my_observation[k].starName && my_point[digitPath[j - 1]].name == my_observation[k].stopName) { singleHeight = my_observation[k].Height; k = pathNum; } else if (my_point[digitPath[j]].name == my_observation[k].stopName && my_point[digitPath[j - 1]].name == my_observation[k].starName) { singleHeight = -(my_observation[k].Height); k = pathNum; } } Height += singleHeight; } my_point[i + pointNum_K].Hcirca += Height; Console.WriteLine("my_point[{0}]:{1}", i + pointNum_K, my_point[i + pointNum_K].Hcirca); Console.WriteLine("/////////////////////////////////////////////////////////////"); } Console.WriteLine("/////////////////////////////////////////////////////////////"); for (int i = 0; i < pathNum; i++) { int starIndex = Array.IndexOf(pointName, my_observation[i].starName); int stopIndex = Array.IndexOf(pointName, my_observation[i].stopName); for (int j = 0; j < pointNum - pointNum_K; j++) { if (j + pointNum_K == starIndex || j + pointNum_K == stopIndex) { if (j + pointNum_K == starIndex) { singlePolynomial[i, j] = -1; //my_polynomial[i].single[j] = -1; } else { singlePolynomial[i, j] = 1; //my_polynomial[i].single[j] = 1; } } //Console.WriteLine("my_polynomial[{0}].single[{1}]: {2}", i, j, my_polynomial[i].single[j]); Console.WriteLine("singlePolynomial[{0}][{1}]: {2}", i, j, singlePolynomial[i, j]); } //my_polynomial[i].constant = -1000 * Math.Round((my_point[stopIndex].Hcirca - my_point[starIndex].Hcirca - my_observation[i].Height), 3); constantPolynomial[i] = -1000 * (my_point[stopIndex].Hcirca - my_point[starIndex].Hcirca - my_observation[i].Height); //Console.WriteLine("my_polynomial[{0}].constant: {1}", i, my_polynomial[i].constant); Console.WriteLine("constantPolynomial[{0}]: {1}", i, constantPolynomial[i].ToString("0")); Console.WriteLine("/////////////////////////////////////////////////////////////"); } Console.WriteLine("/////////////////////////////////////////////////////////////"); for (int i = 0; i < pathNum; i++) { for (int j = 0; j < pointNum - pointNum_K; j++) { MatrixB[i, j] = singlePolynomial[i, j]; } } for (int i = 0; i < pathNum; i++) { MatrixL[0, i] = constantPolynomial[i]; } for (int i = 0; i < pathNum; i++) { for (int j = 0; j < pathNum; j++) { if (j == i) { MatrixP[i, j] = 1.0 / my_observation[i].length; } else { MatrixP[i, j] = 0.0; } } } }
static void Main(string[] args) { int Hn = 0; int Un = 0; int Kn = 0; string strData = String.Empty; string[] strTemp; int dataIdx = 0; FileStream aFile = new FileStream("示例数据.txt", FileMode.Open); StreamReader streamReader = new StreamReader(aFile); while (streamReader.Peek() != -1) { dataIdx++; //"strData"存储剔除空格逐行读取文档的当前行所有字符, // "strTemp"以数组形式存储当前行,以逗号分隔 strData = streamReader.ReadLine().Trim(); strTemp = strData.Trim().Split(','); if (dataIdx == 1) { Kn = Convert.ToInt16(strTemp[0]); Un = Convert.ToInt16(strTemp[1]); Hn = Convert.ToInt16(strTemp[2]); Pname = new string[Kn + Un]; my_observation = new observation[Hn]; } else if (dataIdx == 2) { for (int i = 0; i < Kn + Un; i++) { Pname[i] = Convert.ToString(strTemp[i]); } } else { my_observation[dataIdx - 3].Be = Convert.ToString(strTemp[0]); my_observation[dataIdx - 3].En = Convert.ToString(strTemp[1]); my_observation[dataIdx - 3].S = Convert.ToDouble(strTemp[2]); } } Console.WriteLine(" 数据读入成功 !!! "); Console.WriteLine("/////////////////////////////////////////////////////////////"); Console.WriteLine(" Hn = {0}, Kn = {1}, Un = {2} ", Hn, Kn, Un); Console.WriteLine("/////////////////////////////////////////////////////////////"); for (int i = 0; i < Kn + Un; i++) { Console.WriteLine("第 {0} 点 :{1}", i + 1, Pname[i]); } Console.WriteLine("/////////////////////////////////////////////////////////////"); for (int i = 0; i < Hn; i++) { Console.WriteLine("起点 :{0} 终点 :{1} 距离 :{2}", my_observation[i].Be, my_observation[i].En, my_observation[i].S.ToString("0.0000")); } Console.WriteLine("/////////////////////////////////////////////////////////////"); string[] singlePath = new string[Kn + Un]; string[,] mixPath = new string[Kn + Un, Kn + Un]; double[] singleDistance = new double[Kn + Un]; double[,] mixDistance = new double[Kn + Un, Kn + Un]; shortest_path.shortest_path my_shortest_path = new shortest_path.shortest_path(Hn, Kn + Un, Kn, Pname); for (int i = 0; i < Hn; i++) { my_shortest_path.createObservation(i, my_observation[i].Be, my_observation[i].En, my_observation[i].S); } my_shortest_path.createGraph(); for (int i = 0; i < Un; i++) { my_shortest_path.Dijkstra(i + Kn); singlePath = my_shortest_path.getmixPath(); singleDistance = my_shortest_path.getmixDistance(); for (int j = 0; j < Kn + Un; j++) { mixPath[i, j] = singlePath[j]; mixDistance[i, j] = singleDistance[j]; if (mixDistance[i, j] != 0.0) { Console.Write("mixPath[{0}]:{1} ", j, mixPath[i, j]); Console.Write("mixDistance[{0}]:{1}", j, mixDistance[i, j]); Console.Write("\n"); } } Array.Clear(singlePath, 0, Kn + Un); Array.Clear(singleDistance, 0, Kn + Un); } Console.ReadKey(); Console.ReadKey(); Console.ReadKey(); }