Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function laba2_part1
- % Открытие файла для вывода:
- file = fopen('out_part1.txt', 'wt');
- % Данные варианта:
- lambda = 50.04;
- mu = 9.75;
- nChannels = 10;
- % Массивы для хранения Таблицы 1:
- t_event = zeros(1, 100);
- t_min = zeros(1, 100);
- t_wait = zeros(1, 100);
- e_type = zeros(1, 100);
- state = zeros(1, 100);
- channels = zeros(1, nChannels);
- % Массивы для хранения Таблицы 2:
- client_begin = zeros(1, 100);
- client_end = zeros(1, 100);
- client_channel = zeros(1, 100);
- % Точности для вещественной арифметики:
- round_eps = 1e-5;
- compare_eps = 1e-12;
- % Обработка первого события:
- t_event(1) = round_number(exprnd(1 / lambda), round_eps);
- t_min(1) = round_number(exprnd(1 / mu), round_eps);
- t_wait(1) = round_number(exprnd(1 / lambda), round_eps);
- e_type(1) = 1;
- state(1) = 1;
- channels(1) = t_min(1);
- % Обработка первой заявки:
- nClients = 1;
- client_begin(1) = t_event(1);
- client_end(1) = t_event(1) + t_min(1);
- client_channel(1) = 1;
- % Моделирование поступающих событий:
- for i = 2:100
- % Определение типа текущего события:
- if (t_min(i-1) - compare_eps < t_wait(i-1))
- % Текущее событие - освобождение прибора
- t_event(i) = t_event(i-1) + t_min(i-1);
- e_type(i) = 2;
- else % Текущее событие - новая заявка
- t_event(i) = t_event(i-1) + t_wait(i-1);
- e_type(i) = 1;
- end
- % Обновление времени работы приборов и состояния системы на момент текущего события:
- dt = t_event(i) - t_event(i-1);
- for j = 1:nChannels
- channels(j) = max(0, channels(j) - dt);
- state(i) += (channels(j) > compare_eps);
- end
- % Обновление времени ожидания следующей заявки:
- t_wait(i) = max(0, t_wait(i-1) - dt);
- % Обработка текущего события:
- if (e_type(i) == 1) % Поступление новой заявки
- % Определяем номер незанятого прибора
- freeChannel = 1;
- for it = channels,
- if (it < compare_eps), break; end;
- freeChannel++;
- end
- % Заполнение строки таблицы 2 для новой заявки на случай, если она получит отказ:
- nClients++;
- client_begin(nClients) = t_event(i);
- client_end(nClients) = client_begin(nClients);
- % Проверяем, принята ли заявка, и обрабатываем этот случай:
- if (freeChannel <= nChannels)
- channels(freeChannel) = round_number(exprnd(1 / mu), round_eps);
- state(i)++; % количество занятых приборов увеличилось
- client_end(nClients) += channels(freeChannel);
- client_channel(nClients) = freeChannel;
- end
- % Генерируем время ожидания следующей заявки:
- t_wait(i) = round_number(exprnd(1 / lambda), round_eps);
- end
- % Находим минимальное время, через которое освободится один из приборов:
- t_min(i) = 1e9;
- for it = channels
- if (it < compare_eps), continue; end;
- t_min(i) = min(t_min(i), it);
- end
- end
- % Вывод таблицы 1:
- fprintf(file, 'Таблица 1:\n');
- for i = 1:100
- fprintf(file, '%12.5f %4d %4d', t_event(i), e_type(i), state(i));
- if (t_min(i) == 1e9),
- fprintf(file, ' empty');
- else
- fprintf(file, ' %12.5f', t_min(i));
- end;
- fprintf(file, ' %12.5f\n', t_wait(i));
- end
- % Вывод таблицы 2:
- fprintf(file, 'Таблица 2:\n');
- for i = 1:nClients
- 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));
- end
- % Составление и вывод таблицы 3:
- fprintf(file, 'Таблица 3:\n');
- for i = 1:nChannels,
- count_in = 0; count_success = 0; time_work = 0;
- for j = 1:nClients
- if (client_channel(j) ~= i), continue; end;
- ++count_in;
- if (client_end(i)-compare_eps <= t_event(100))
- time_work += client_end(j)-client_begin(j);
- count_success++;
- end
- end
- if (count_success == 0), count_success = 1; end;
- fprintf(file, '%4d %4d %12.5f %12.5f %12.5f\n',
- i, count_in, round_number(time_work / count_success, round_eps), time_work, t_event(100)-time_work);
- end
- % Пункт 6:
- nFull = 0; nIgnored = 0; tWork = 0;
- for i = 1:nClients,
- if (client_end(i) - compare_eps > t_event(100)), continue; end;
- if (client_end(i) > client_begin(i))
- nFull += (client_end(i) > client_begin(i));
- tWork += (client_end(i) - client_begin(i));
- else
- nIgnored += (client_end(i) == client_begin(i));
- end
- end
- nStates = zeros(1, nChannels+1);
- for i = 1:100, nStates(state(i)+1)++; end;
- fprintf(file, ' Число обслуженных заявок: %9d\n', nFull);
- fprintf(file, ' Число отклоненных заявок: %9d\n', nIgnored);
- fprintf(file, 'Среднее время обсл. заявки: %9.5f\n', round_number(tWork / nFull, round_eps));
- fprintf(file, 'Экспер. сред. число заявок: %9.5f\n', round_number(nClients / t_event(100), round_eps));
- fprintf(file, 'Статистический ряд состояний:\n');
- for i = 0:nChannels, fprintf(file, '\t%d: %d\n', i, nStates(i+1)); end;
- fprintf(file, ' Сред. ч. занятых приборов: %9.5f\n', round_number(sum(state) / 100, round_eps));
- fclose(file);
- end
- % Округление числа до требуемой точности:
- function number = round_number(number, eps)
- number = round(number / eps) * eps;
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement