Beispiel #1
0
        /// <summary>
        /// Создает экземпляр класса NetworkModel по описанию сети обслуживания
        /// </summary>
        /// <returns>The network model.</returns>
        /// <param name="Description">Описание сети обслуживания</param>
        public static NetworkModel CreateNetworkModel(DescriptionOFJQN Description, Random rand)
        {
            InfoNode Info = new InfoNode();

            Info.SetCurentTime(0);

            var Nodes = new Node[Description.Theta.Dimention];

            //Источник требований
            Nodes[0] = new SourceNode(0, rand, new ExponentialVariable(rand, Description.Lambda0), Nodes, Info, Description.Theta.RoutingRow(0, 0));
            //Базовые системы
            for (int i = 0; i < Description.S.Length; i++)
            {
                Nodes[Description.S[i]] = new ServiceNode(Description.S[i], rand, new RandomVariables.ExponentialVariable(rand, Description.mu[i]),
                                                          new QueueFCFS(), Description.kappa[i], Nodes, Info, Description.Theta.RoutingMatrixForNode(Description.S[i]));
            }
            //Дивайдеры
            for (int k = 0; k < Description.F.Length; k++)
            {
                Nodes[Description.F[k]] = new ForkNode(Description.F[k], k + 1, rand, Nodes, Info, Description.Theta.RoutingRow(Description.F[k], k + 1));
            }
            //Интеграторы
            for (int k = 0; k < Description.J.Length; k++)
            {
                Nodes[Description.J[k]] = new JoinNode(Description.J[k], rand, Nodes, Info, Description.Theta.RoutingMatrixForNode(Description.J[k]));
            }



            return(new NetworkModel(Nodes, Info, rand));
        }
Beispiel #2
0
        public static void RunModel()
        {
            //Создание описания сети
            DescriptionOFJQN Description = new DescriptionOFJQN(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/msu.txt");

            OFJQN.CreateNetworkModel(Description, new Random()).Run(1000000);
        }
        public static PhaseTypeVarible ResponseTimeForBaseNetwork(DescriptionOFJQN Description)
        {
            int L = Description.Theta.Dimention - 1;
            PhaseTypeVarible ph = new PhaseTypeVarible(new Matrix(L, L), new double[L]);

            for (int i = 0; i < L; i++)
            {
                ph.InitialDistribution[i] = Description.Theta[0][0, i + 1];
            }

            for (int i = 0; i < L; i++)
            {
                for (int j = 0; j < L; j++)
                {
                    ph.SubGenerator[i, j] = Description.mu[i] * Description.Theta[0][i + 1, j + 1];
                    if (i == j)
                    {
                        ph.SubGenerator[i, j] = -Description.mu[i];
                    }
                }
            }


            return(ph);
        }
        public static PhaseTypeVarible ResponseTimeDistribution(DescriptionOFJQN Description)
        {
            PhaseTypeVarible ph = new PhaseTypeVarible();

            //Находим первую элементарную подсеть
            int k = FindTrivialNetwork(Description.F, Description.Theta);

#if (DEBUG)
            Console.WriteLine("Найдена подсеть H{0} в качестве элемнтарной", k);
#endif

            DescriptionOFJQN ReducedNetwork = Description;

            //Пока вся сеть не стала элементарной
            while (k != 0)
            {
                //Выполняем редукцию
                ReducedNetwork = ReduceTrivialSubNetwork(ReducedNetwork, k);

                //Поиск новой элементарной подсети
                k = FindTrivialNetwork(ReducedNetwork.F, ReducedNetwork.Theta);
            }

            ph = ResponseTimeForBaseNetwork(ReducedNetwork);
#if debug
            Console.WriteLine("Порядок матрицы {0}", ph.NumberOfPhases);
            Console.WriteLine("Число элементов в матрице {0}", ph.NumberOfPhases * ph.NumberOfPhases);
            Console.WriteLine("Число ненулевых  элементов в матрице {0} ({1:f4})", ph.Generator.NonZeroElements(),
                              (double)ph.NumberOfPhases * ph.NumberOfPhases / ph.Generator.NonZeroElements());
#endif
            return(ph);
        }
        /// <summary>
        /// Выполние редукции относительно элементарной подсети k
        /// </summary>
        /// <param name="Network"></param>
        /// <param name="k">Номер элементарной подсети</param>
        /// <returns></returns>
        public static DescriptionOFJQN ReduceTrivialSubNetwork(DescriptionOFJQN Description, int k)
        {
            //Генерация фазового распределения для элементраной сети
#if (DEBUG)
            Console.WriteLine("Выполнение редукции");
#endif
            PhaseTypeVarible TrivialPH = ResponseTimeDistributionForTrivialSubNetwork(Description.S, Description.F, Description.J, Description.Theta, Description.mu, k);

            int Y     = TrivialPH.NumberOfPhases;
            var A     = TrivialPH.SubGenerator;
            var alpha = TrivialPH.InitialDistribution;
            //Число всех систем в сети
            int L = Description.Theta.Dimention - 1;

            //2) Множества номеров базовых систем, дивайдеров, интеграторов для новой сети
            List <int> S = new List <int>();
            //Вектор интенсивностей осблуживания для новой сети
            List <double> mu = new List <Double>();
            for (int i = 0; i < Description.S.Length; i++)
            {
                mu.Add(Description.mu[i]);
                S.Add(Description.S[i]);
            }
            for (int i = 0; i < Y; i++)
            {
                mu.Add(-A[i, i]);
                S.Add(L + i + 1);
            }
            //Дивайдеры и интеграторы для новой сети
            List <int> F = new List <int>();
            List <int> J = new List <int>();
            for (int i = 0; i < Description.F.Length; i++)
            {
                F.Add(Description.F[i]);
                J.Add(Description.J[i]);
            }

            //3) Создаем новую матрицу передачи
            RoutingMatrix ReducedTheta = new RoutingMatrix(Y + Description.Theta.Dimention, Description.Theta.CountForker);
            //Копирование исходной матрицы в матрицу для новой сети
            for (int l = 0; l < Description.Theta.CountForker; l++)
            {
                for (int i = 0; i < Description.Theta.Dimention; i++)
                {
                    for (int j = 0; j < Description.Theta.Dimention; j++)
                    {
                        ReducedTheta[l][i, j] = Description.Theta[l][i, j];
                    }
                }
            }

            //Переходы между новыми базовыми системами
            for (int l = 0; l < ReducedTheta.CountForker; l++)
            {
                //Возможность перехода для l-фрагмента в элементарную подсеть H_k (т.е. в дивайдер F_k)
                bool transition = false;
                for (int i = 0; i < Description.Theta.Dimention; i++)
                {
                    if (Description.Theta[l][i, Description.F[k - 1]] > 0)
                    {
                        transition = true;
                        break;
                    }
                }
                if (transition == false)
                {
                    continue;
                }
                for (int i = 1; i <= Y; i++)
                {
                    for (int j = 1; j <= Y; j++)
                    {
                        if (i != j)
                        {
                            ReducedTheta[l][i + L, j + L] = -A[i - 1, j - 1] / A[i - 1, i - 1];
                        }
                    }
                }
            }

            //вероятности перехода в подсеть и выхода из подсети
            for (int l = 0; l < ReducedTheta.CountForker; l++)
            {
                for (int i = 0; i <= L; i++)
                {
                    for (int j = 1; j <= Y; j++)
                    {
                        ReducedTheta[l][i, L + j] = alpha[j - 1] * Description.Theta[l][i, Description.F[k - 1]];
                    }
                }
            }

            for (int l = 0; l < ReducedTheta.CountForker; l++)
            {
                for (int i = 1; i <= Y; i++)
                {
                    for (int j = 0; j <= L; j++)
                    {
                        double a_star = -A.Row(i - 1).Sum();
                        ReducedTheta[l][L + i, j] = -a_star / A[i - 1, i - 1] * Description.Theta[l][Description.J[k - 1], j];
                    }
                }
            }

            //Удаление строк и столбцов
            ReducedTheta.DeleteMatrix(k, F[k - 1], J[k - 1]);

            int xF = F[k - 1];
            F.RemoveAt(k - 1); //Удаление дивайдера
            Reorder(F, xF);
            Reorder(S, xF);
            Reorder(J, xF);

            int xJ = J[k - 1];
            J.RemoveAt(k - 1);//Удаление интегратора
            Reorder(F, xJ);
            Reorder(S, xJ);
            Reorder(J, xJ);

            //Здесь нужно убрать все недостижимые базовые системы



            return(new DescriptionOFJQN(S.ToArray(), F.ToArray(), J.ToArray(), mu.ToArray(), null,
                                        ReducedTheta, Description.Lambda0));
        }