Advertisement
Infiniti_Inter

badCode

May 20th, 2020
1,160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.48 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <vector>
  5. #include <random>
  6. #include <string>
  7.  
  8. using namespace std;
  9.  
  10. void connectFilesToStandardInputOutputStreams()
  11. {
  12.     freopen("input.txt", "r", stdin);
  13.     freopen("output.txt", "w", stdout);
  14.     ios_base::sync_with_stdio(false);
  15.     cin.tie(0);
  16.     cout.tie(0);
  17. }
  18. random_device rnd;
  19. mt19937 mersenne(rnd());
  20. int randomSign()
  21. {
  22.     return (mersenne() % 2 == 0 ? 1 : -1);
  23. }
  24. double generateSmallNumber(int N = 100)
  25. //функция возвращает случайное значение от [-9;9]/N
  26. //можно использовать для изменения начальных условий
  27. //и наблюдением за системой
  28. {
  29.     double res = (mersenne() % 10) / (N);
  30.     return res * randomSign();
  31. }
  32. struct params
  33. {
  34.     int K;
  35.     int N;
  36.     params(int k, int n)
  37.     {
  38.         K = max(k, 3);
  39.         N = max(n, 3);
  40.     }
  41. };
  42. vector< vector< long double > > calcPij
  43. (double lambda, params par, vector<double> mu)
  44. {
  45.     int N = par.N;
  46.     int K = par.K;
  47.     double p0 = 1;
  48.     vector< vector< long double > > P
  49.     (K + 1, vector<long double>(N + 1));
  50.     for (int i = 1; i <= K; ++i)
  51.         for (int j = 1; j <= N; ++j)
  52.             P[i][j] = 0;
  53.     P[1][N] = lambda / mu[N];
  54.     P[1][N - 1] = ((lambda + mu[N]) / mu[N - 1])*P[1][N];
  55.     for (int i = N - 1; i > 1; --i)
  56.         P[1][i - 1] = (lambda + mu[i]) / mu[i - 1] * P[1][i];
  57.     P[2][N] = (lambda + mu[1]) / mu[N] * P[1][1] - lambda / mu[N];
  58.     for (int i = 2; i <= K - 1; ++i)
  59.     {
  60.         P[i][N - 1] = (lambda + mu[N]) / mu[N - 1] * P[i][N]
  61.             - (lambda / mu[N - 1]) * P[i - 1][N];
  62.         for (int j = N - 1; j >= 2; --j)
  63.             P[i][j - 1] = (lambda + mu[j]) / mu[j - 1] * P[i][j]
  64.             - (lambda / mu[j - 1]) * P[i - 1][j];
  65.         P[i + 1][N] = (lambda + mu[1]) / mu[N] * P[i][1]
  66.             - (lambda / mu[N]) * P[i - 1][1];
  67.     }
  68.     P[K][N - 1] = mu[N] / mu[N - 1] * P[K][N]
  69.         - (lambda / mu[N - 1]) * P[K - 1][N];
  70.     for (int i = N - 1; i >= 2; --i)
  71.     {
  72.         P[K][i - 1] = mu[i] / mu[i - 1] * P[K][i]
  73.             - (lambda / mu[i - 1]) * P[K - 1][i];
  74.     }
  75.     long double sumP = 0;
  76.     for (int i = 1; i <= K; ++i)
  77.         for (int j = 1; j <= N; ++j)
  78.             sumP += P[i][j];
  79.     p0 = 1 / (p0 + sumP);
  80.     for (int i = 1; i <= K; ++i)
  81.         for (int j = 1; j <= N; ++j)
  82.             P[i][j] *= p0;
  83.     P[0][0] = p0;
  84.     return P;
  85. }
  86.  
  87. struct features
  88. {
  89.     int cntLambda;
  90.     double lambda;
  91.     vector<double> mu;
  92.     double p0;
  93.     double X;
  94.     double gamma;
  95.     double p;
  96.     double Ploss;
  97.     double Ek;
  98.     double Ekq;
  99.     double W;
  100.     double Wq;
  101.     double U;
  102.     features() {}
  103.     features(int cntLambda, double lambda, vector<double> mu, double p0, double X,
  104.         double gamma, double p, double Ploss, double Ek, double Ekq, double W,
  105.         double Wq, double U) : cntLambda(cntLambda), lambda(lambda), mu(mu), p0(p0), X(X),
  106.         gamma(gamma), p(p), Ploss(Ploss), Ek(Ek), Ekq(Ekq), W(W), Wq(Wq), U(U)
  107.     {}
  108.  
  109.     void Show()
  110.     {
  111.         string line = string(30, '-');
  112.         line += "\n";
  113.         cout << line;
  114.         cout << "Test #" << cntLambda << endl;
  115.         cout << line;
  116.         cout << "lambda = " << lambda <<endl;
  117.         cout << "mu [] = ";
  118.         for (auto v : mu)
  119.             cout << v << "\t";
  120.         cout << line;      
  121.         cout << "U = " << U << endl;
  122.         cout << "gamma = " << gamma << endl;
  123.         cout << "p0 = " << p0 << endl;
  124.         cout << "p = " << p << endl;
  125.         cout << "E[K] = " << Ek << endl;
  126.         cout << "E[Kq] = " << Ekq << endl;
  127.         cout << "W = " << W << endl;
  128.         cout << "Wq = " << Wq << endl;
  129.         cout << "X = " << X << endl;
  130.  
  131.         cout << "\n====================================\n";
  132.     }
  133.     static void ShowInfoAboutSystem()
  134.     {
  135.         cout << "K - размер системы,\n";
  136.         cout << "N - количество этапов в системе,\n";
  137.         cout << "cntLambda - количество различных лямбда"
  138.             << "(корень квадратный из количества экспериментов) ,\n";
  139.         cout << "lambda[i] - интенсивность потока на iм эксперементе,\n";
  140.         cout << "mu[i] - вектор интенсивности обслуживания на iм эксперементе,\n";
  141.         cout << "lambdaMin - минимальное значение lambda,\n";
  142.         cout << "deltaLambda - разница lambda между двумя последующими экспериментами,\n";
  143.         cout << "coefficientMu - коэффициент роста интенсивности Mu,\n";
  144.         cout << "gamma - пропускная способность,\n";
  145.         cout << "Ploss - вероятность потери,\n";
  146.         cout << "p - коэффициент использования,\n";
  147.         cout << "X - м.о. длительности обслуживания,\n";
  148.         cout << "Ek - м.о. числа требований в системе,\n";
  149.         cout << "Ekq - м.о. числа требований в очереди,\n";
  150.         cout << "W - м.о. длительности пребывания требований в системе,\n";
  151.         cout << "Wq - м.о. длительности пребывания требований в очереди,\n";
  152.         cout << "U - rоэффициент использования системы.";
  153.     }
  154. };
  155.  
  156.  
  157.  
  158. int main() {
  159.     connectFilesToStandardInputOutputStreams();
  160.     params par(8, 5);
  161.     int cntLambda = 15;
  162.     vector<double> lambda(cntLambda);
  163.     vector<vector<double> > mu(cntLambda, vector<double>(par.N + 1));
  164.     double lambdaMin = 0.0002;
  165.     double deltaLambda = 0.019990;
  166.     double coefficientMu = 1.1;
  167.     for (int i = 0; i < cntLambda; ++i)
  168.     {
  169.         lambda[i] = (i == 0 ? lambdaMin : lambda[i - 1] + deltaLambda);
  170.  
  171.         for (int j = 0; j < par.N; ++j)
  172.             mu[i][j + 1] = coefficientMu*(i + 1);
  173.     }
  174.     cout << setprecision(3);
  175.     vector<features> result(cntLambda * cntLambda);
  176.     int cnt = 0;
  177.     for (int f = 0; f < cntLambda; f++)
  178.     {
  179.         for (int i = 0; i < cntLambda; ++i)
  180.         {
  181.             vector<double> Mu = mu[f];
  182.             vector<vector<long double> > P
  183.                 = calcPij(lambda[i], par, mu[f]);                  
  184.             double p0 = P[0][0];
  185.             double SumPkN = 0;
  186.             for (int k = 1; k <= par.K; ++k)
  187.                 SumPkN += P[k][par.N];
  188.             double X = 0;
  189.             for (int n = 1; n <= par.N; ++n)
  190.                 X += 1 / Mu[n];
  191.             double gamma = (1. - p0) / X;
  192.             double p = lambda[i] * X;
  193.             double Ploss = (p0 + p - 1) / p;
  194.             double SumPKn = 0;
  195.             double Ek = 0;
  196.             for (int k = 1; k <= par.K; ++k)
  197.                 for (int n = 1; n <= par.N; ++n)
  198.                     Ek += P[k][n] * k;
  199.             double Ekq = Ek - (1 - p0);
  200.             double W = Ek / gamma;
  201.             double Wq = Ekq / gamma;
  202.             double U = gamma * X;
  203.             result[cnt++] = features(cnt, lambda[i], Mu, p0, X, gamma, p, Ploss,
  204.                 Ek, Ekq, W, Wq, U);        
  205.         }
  206.         for (auto v : result)
  207.             v.Show();
  208.         features::ShowInfoAboutSystem();
  209.     }
  210.     return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement