示例#1
0
        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;
                    }
                }
            }
        }
示例#2
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();
        }