Advertisement
Guest User

laba2_part1.m

a guest
Dec 4th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Octave 5.89 KB | None | 0 0
  1. function laba2_part1
  2.     % Открытие файла для вывода:
  3.     file = fopen('out_part1.txt', 'wt');
  4.     % Данные варианта:
  5.     lambda       = 50.04;
  6.     mu           = 9.75;
  7.     nChannels    = 10;
  8.     % Массивы для хранения Таблицы 1:
  9.     t_event  = zeros(1, 100);
  10.     t_min    = zeros(1, 100);
  11.     t_wait   = zeros(1, 100);
  12.     e_type   = zeros(1, 100);
  13.     state    = zeros(1, 100);
  14.     channels = zeros(1, nChannels);
  15.     % Массивы для хранения Таблицы 2:
  16.     client_begin   = zeros(1, 100);
  17.     client_end     = zeros(1, 100);
  18.     client_channel = zeros(1, 100);
  19.     % Точности для вещественной арифметики:
  20.     round_eps   = 1e-5;
  21.     compare_eps = 1e-12;
  22.     % Обработка первого события:
  23.     t_event(1)  = round_number(exprnd(1 / lambda), round_eps);
  24.     t_min(1)    = round_number(exprnd(1 / mu), round_eps);
  25.     t_wait(1)   = round_number(exprnd(1 / lambda), round_eps);
  26.     e_type(1)   = 1;
  27.     state(1)    = 1;
  28.     channels(1) = t_min(1);
  29.     % Обработка первой заявки:
  30.     nClients = 1;
  31.     client_begin(1)   = t_event(1);
  32.     client_end(1)     = t_event(1) + t_min(1);
  33.     client_channel(1) = 1;
  34.     % Моделирование поступающих событий:
  35.     for i = 2:100
  36.         % Определение типа текущего события:
  37.         if (t_min(i-1) - compare_eps < t_wait(i-1))
  38.             % Текущее событие - освобождение прибора
  39.             t_event(i) = t_event(i-1) + t_min(i-1);
  40.             e_type(i)  = 2;
  41.         else % Текущее событие - новая заявка
  42.             t_event(i) = t_event(i-1) + t_wait(i-1);
  43.             e_type(i)  = 1;
  44.         end
  45.         % Обновление времени работы приборов и состояния системы на момент текущего события:
  46.         dt = t_event(i) - t_event(i-1);
  47.         for j = 1:nChannels
  48.             channels(j) = max(0, channels(j) - dt);
  49.             state(i) += (channels(j) > compare_eps);
  50.         end
  51.         % Обновление времени ожидания следующей заявки:
  52.         t_wait(i) = max(0, t_wait(i-1) - dt);
  53.         % Обработка текущего события:
  54.         if (e_type(i) == 1) % Поступление новой заявки           
  55.             % Определяем номер незанятого прибора
  56.             freeChannel = 1;
  57.             for it = channels,
  58.                 if (it < compare_eps), break; end;
  59.                 freeChannel++;
  60.             end
  61.             % Заполнение строки таблицы 2 для новой заявки на случай, если она получит отказ:
  62.             nClients++;
  63.             client_begin(nClients) = t_event(i);
  64.             client_end(nClients) = client_begin(nClients);
  65.             % Проверяем, принята ли заявка, и обрабатываем этот случай:
  66.             if (freeChannel <= nChannels)
  67.                 channels(freeChannel) = round_number(exprnd(1 / mu), round_eps);
  68.                 state(i)++; % количество занятых приборов увеличилось
  69.                 client_end(nClients) += channels(freeChannel);
  70.                 client_channel(nClients) = freeChannel;            
  71.             end
  72.             % Генерируем время ожидания следующей заявки:
  73.             t_wait(i) = round_number(exprnd(1 / lambda), round_eps);
  74.         end
  75.         % Находим минимальное время, через которое освободится один из приборов:
  76.         t_min(i) = 1e9;
  77.         for it = channels
  78.             if (it < compare_eps), continue; end;
  79.             t_min(i) = min(t_min(i), it);
  80.         end
  81.     end
  82.     % Вывод таблицы 1:
  83.     fprintf(file, 'Таблица 1:\n');
  84.     for i = 1:100
  85.         fprintf(file, '%12.5f %4d %4d', t_event(i), e_type(i), state(i));
  86.         if (t_min(i) == 1e9),
  87.             fprintf(file, '        empty');
  88.         else
  89.             fprintf(file, ' %12.5f', t_min(i));
  90.         end;
  91.         fprintf(file, ' %12.5f\n', t_wait(i));
  92.     end
  93.     % Вывод таблицы 2:
  94.     fprintf(file, 'Таблица 2:\n');
  95.     for i = 1:nClients
  96.         fprintf(file, '%4d %12.5f %12.5f %12.5f %4d\n', i, client_begin(i), client_end(i)-client_begin(i), client_end(i), client_channel(i));
  97.     end
  98.     % Составление и вывод таблицы 3:
  99.     fprintf(file, 'Таблица 3:\n');
  100.     for i = 1:nChannels,
  101.         count_in = 0; count_success = 0; time_work = 0;
  102.         for j = 1:nClients
  103.             if (client_channel(j) ~= i), continue; end;
  104.             ++count_in;
  105.             if (client_end(i)-compare_eps <= t_event(100))
  106.                 time_work += client_end(j)-client_begin(j);
  107.                 count_success++;
  108.             end
  109.         end
  110.         if (count_success == 0), count_success = 1; end;
  111.         fprintf(file, '%4d %4d %12.5f %12.5f %12.5f\n',
  112.             i, count_in, round_number(time_work / count_success, round_eps), time_work, t_event(100)-time_work);
  113.     end
  114.     % Пункт 6:
  115.     nFull = 0; nIgnored = 0; tWork = 0;
  116.     for i = 1:nClients,
  117.         if (client_end(i) - compare_eps > t_event(100)), continue; end;
  118.         if (client_end(i) > client_begin(i))
  119.             nFull    += (client_end(i) > client_begin(i));
  120.             tWork    += (client_end(i) - client_begin(i));
  121.         else       
  122.             nIgnored += (client_end(i) == client_begin(i));
  123.         end
  124.     end
  125.     nStates = zeros(1, nChannels+1);
  126.     for i = 1:100, nStates(state(i)+1)++; end;
  127.     fprintf(file, '  Число обслуженных заявок: %9d\n', nFull);
  128.     fprintf(file, '  Число отклоненных заявок: %9d\n', nIgnored);
  129.     fprintf(file, 'Среднее время обсл. заявки: %9.5f\n', round_number(tWork / nFull, round_eps));
  130.     fprintf(file, 'Экспер. сред. число заявок: %9.5f\n', round_number(nClients / t_event(100), round_eps));
  131.     fprintf(file, 'Статистический ряд состояний:\n');
  132.     for i = 0:nChannels, fprintf(file, '\t%d: %d\n', i, nStates(i+1)); end;
  133.     fprintf(file, ' Сред. ч. занятых приборов: %9.5f\n', round_number(sum(state) / 100, round_eps));
  134.     fclose(file);
  135. end
  136. % Округление числа до требуемой точности:
  137. function number = round_number(number, eps)
  138.     number = round(number / eps) * eps;
  139. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement