/// <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)); }
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)); }