Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Текст программы






 

program Project1;

 

{$APPTYPE CONSOLE}

 

uses

SysUtils, Math;

 

Const Npc = 5; {количество компьютеров}

Nk = 3; {количество каналов}

T = 20; {интервал наблюдения (сутки)}

Test_count = 10; {количество тестов}

U = 1.960; {Квантиль нормального распределения при уровне значимости 0.05}

PC: array[1..Npc] of String = ('1-ый компьютер', '2-ой компьютер', '3-ий компьютер', '4-ый компьютер', '5-ый компьютер');

 

Var L, aM, M: array[1..Npc] of real; {Интенсивности занятия / освобождения каналов}

statePC: array[1..Npc] of integer; {состояние компьютеров: 0 - не в сети, 1 - в сети}

timePC: array[1..Npc] of real; {продолжительность состояний компьютеров}

cTime: real; {текущее время}

Arr_Busy, Arr_Req: array[1..Test_Count] of integer; {счётчики отказов и числа обращений (попыток соединений)}

Sn, Sk: integer; {Sn и Sk - общее число обращений и отказов}

p, Ga, Gb: real; {Ga и Gb - границы доверительного интервала}

{******************************************************************************}

 

Procedure iArrFill(var a: array of integer; count, value: integer);

Var i: integer; {заполняет count элементов массива a целым значением value}

Begin

For i: =1 to count do

a[i]: = value;

End;

{******************************************************************************}

 

Procedure rArrFill(var a: array of real; count: integer; value: real);

Var i: integer; {заполняет count элементов массива a вещественным значением value}

Begin

For i: =1 to count do

a[i]: = value;

End;

{******************************************************************************}

 

Procedure Load; {Чтение данных из файла и подсчёт усредненных}

Var i, j, c1, c2: integer; {значений для каждого из компьютеров}

t: real;

Begin

Assign(input, 'input.txt'); {открытие файла на чтение}

ReSet(input);

Assign(output, 'output.txt'); {открытие файла на запись}

ReWrite(output);

rArrFill(L, Npc, 0); {обнуление массива}

ReadLn(c1);

For i: =1 to Npc do

Begin

For j: =1 to c1 do

Begin

Read(t);

L[i]: = L[i] + t;

End;

L[i]: = L[i] / c1;

End;

rArrFill(M, Npc, 0); {обнуление массива}

rArrFill(aM, Npc, 0); {обнуление массива}

ReadLn(c2);

For i: =1 to Npc do

Begin

For j: =1 to c2 do

Begin

Read(t);

aM[i]: = aM[i] + t;

End;

M[i]: = (c2 * 24) / aM[i];

End;

Close(input); {закрытие файла на чтение}

Randomize; {инициализация встроенного генератора случайных чисел}

End;

{******************************************************************************}

 

Function Analit: real; {Аналитический метод}

Var i: integer;

s1, s2, p0: real;

Begin

s1: = L[1];

WriteLn('------Решение аналитическим методом------');

WriteLn('Усредненное значение интенсивности подключений: ');

Write('(', L[1]: 6: 3);

For i: =2 to Npc do

Begin

Write('+', L[i]: 6: 3);

s1: = s1 + L[i];

End;

s1: = s1 / Npc;

WriteLn(') / ', Npc, ' =', s1: 6: 3);

WriteLn('Усредненное значение интенсивности отключений: ');

Write(Npc, ' * 240 / (', aM[1]: 5: 2);

s2: = aM[1];

For i: =2 to Npc do

Begin

Write('+', aM[i]: 5: 2);

s2: = s2 + aM[i];

End;

s2: = Npc * 240 / s2;

WriteLn(') = ', s2: 6: 3);

p0: = 1 / (1 + 3 * s1 / s2 + 3 * Power(s1 / s2, 2) + Power(s1 / s2, 3));

Result: = p0 * Power(s1 / s2, 3);

End;

{******************************************************************************}

 

Procedure PrintWriter;

Var i: integer;

Begin

WriteLn('Интенсивности подключений компьютеров: ');

For i: =1 to Npc do

WriteLn(PC[i], ' - ', L[i]: 7: 3, '; ');

WriteLn('Интенсивности отключений компьютеров:: ');

For i: =1 to Npc do

WriteLn(PC[i], ' - ', M[i]: 7: 3, '; ');

WriteLn('Аналитическая вероятность отказа при ', Npc, ' компьютерах и ', Nk, ' каналах: ', Analit: 6: 3);

WriteLn('------Решение методом Монте-Карло-------');

WriteLn('Продолжительность моделирования: ', T, ' суток');

Write('Номер теста ');

For i: =1 to Test_Count do

Write(i: 4);

WriteLn;

Write('Количество обращений ');

For i: =1 to Test_Count do

Write(Arr_Req[i]: 4);

WriteLn;

Write('Количество отказов ');

For i: =1 to Test_Count do

Write(Arr_Busy[i]: 4);

WriteLn;

WriteLn('Общее число обращений n = ', Sn);

WriteLn('Общее число отказов k = ', Sk);

WriteLn('Доля времени, когда все каналы заняты p*: ', p: 6: 3);

WriteLn('Доверительный интервал (', Ga: 6: 4, '; ', Gb: 6: 4, ').');

Close(output); {закрытие файла на запись}

End;

{******************************************************************************}

 

Procedure Step(k: integer; var count_busy, count_req: integer);

Var i, connect: integer; {Один шаг моделирования для k-ого компьютера}

x, TT: real;

Begin

If(statePC[k] = 0) then {если компьютер не в сети, пытаемся подключить}

Begin

connect: = 0;

Inc(count_req); {увеличиваем счётчик обращений}

For i: =1 to Npc do {считаем число подключений к сети}

Inc(connect, statePC[i]);

if (connect < Nk) then {если есть свободные каналы}

Begin

statePC[k]: = 1; {подключаем компьютер к сети}

x: = random; {генерируем случайное число от 0 до 1}

TT: = -Ln(x)/M[k]; {время отключения от сети}

End

else {если нет свободных каналов}

Begin

Inc(count_busy); {увеличиваем счётчик отказов}

x: = random; {генерируем случайное число от 0 до 1}

TT: = -Ln(x)/L[k]; {время следующей попытки войти в сеть}

End;

timePC[k]: = timePC[k] + TT;

End

else {если компьютер в сети, отключяем его}

Begin

statePC[k]: = 0; {отключаем компьютер к сети}

x: = random; {генерируем случайное число от 0 до 1}

TT: = -Ln(x)/L[k]; {время следующей попытки войти в сеть}

timePC[k]: = timePC[k] + TT;

End;

End;

{******************************************************************************}

 

Procedure MinTime(var cTime: real; var kPC: integer);

Var i: integer; {определяем минимальное время и номер компьютера}

Begin

cTime: = timePC[1];

kPC: = 1;

For i: =2 to Npc do {По всем компьютерам по порядку...)}

Begin

If(timePC[i] < cTime) then {если нашёлся ПК с меньшим временем}

Begin

cTime: = timePC[i];

kPC: = i;

End;

End;

End;

{******************************************************************************}

 

Procedure Model_MK;

Var i, kPC: integer;

Begin

Sn: =0; Sk: =0;

iArrFill(Arr_Req, Test_Count, 0); {обнуляем счётчики}

iArrFill(Arr_Busy, Test_Count, 0);

For i: =1 to Test_count do {проводим серию тестов}

Begin

iArrFill(statePC, Npc, 0); {обнуляем массивы}

rArrFill(timePC, Npc, 0);

MinTime(cTime, kPC); {определяем минимальное время и номер компьютера}

While(cTime < T) do

Begin

Step(kPC, Arr_Busy[i], Arr_Req[i]); {шаг моделирования}

MinTime(cTime, kPC); {определяем минимальное время и номер компьютера}

End;

End;

For i: =1 to Test_count do {суммируем данные по всем тестам}

Begin

Inc(Sk, Arr_Busy[i]);

Inc(Sn, Arr_Req[i]);

End;

p: = Sk / Sn; {Искомая вероятность...}

Ga: = p - U * sqrt((p * (1 - p)) / Sn); {...и границы интервала }

Gb: = p + U * sqrt((p * (1 - p)) / Sn);

End;

{******************************************************************************}

 

Begin {основная программа}

Load;

Model_MK;

PrintWriter;

End.

 

 







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.