5
Рис. 5. График изменения коэффициента корреляции.
Вывод:
Полученная последовательность ПСЧ, имеющих экспоненциальный закон распределения, удовлетворяет предъявленным требованиям по качеству и может быть использована в задачах моделирования, т. к.
- числовые характеристики имеют незначительное отклонение от
теоретических значений,
- по критериям согласия получены удовлетворительные значения
доверительных вероятностей,
- числа последовательности достаточно независимы, о чем свидетельствует
график (Рис. 5.)
3.5. Описание моделирующей программы для
стохастической модели
Преобразуем ранее созданную детерминированную модель вычислительной системы в стохастическую модель. Для этого потребуются следующие изменения детерминированной программы:
- вставим программный генератор РРПСЧ - встроенную функцию random( )
возвращающую РРПСЧ в интервале (0,1) - для определения времени
между приходами пользователей.
- файл norm-1.dat , имеющий нормальный закон распределения с m=16 , D=2
для определения времени подготовки задания на 1-ой сетевой машине.
- файл norm-2.dat , имеющий нормальный закон распределения с m=17 , D=2
для определения времени подготовки задания на 2-ой сетевой машине.
- файл norm-3.dat , имеющий нормальный закон распределения с m=18 , D=2
для определения времени подготовки задания на 3-ей сетевой машине.
- файл expon.dat , имеющий экспоненциальный закон распределения с m=0.8
для определения времени выполнения задания на ЭВМ.
- уберем функции ввода с клавиатуры которые использовались для ввода
параметров системы.
Стохастическая моделирующая программа приведена в Приложении № 4.
4. Получение и интерпретация результатов
моделирования
Значения выходных характеристик, полученные при прогонках модели с различными случайными воздействиями.
№ прогона | % выполненных заданий, поступ. от 2-го пользователя |
1 | 9 % |
2 | 9 % |
3 | 9 % |
4 | 9 % |
5 | 9 % |
6 | 9 % |
7 | 9 % |
8 | 9 % |
9 | 9 % |
10 | 9 % |
сред.зн. | 9 % |
Вывод:
Усредненные значения выходной характеристики подтверждают данные детерминированной модели т.к. с введением вероятности прихода второго пользователя равной 0.1 в детерминированную модель теоретическое значение процента выполненных заданий поступивших от второго пользователя становится равным 10 % .
Литература
1. Разработка САПР. № 9
В.М. Черненький. Имитационное моделирование.
2. Лекции по курсу “Моделирование”.
3. Б. Страуструп. Язык программирования С++.
4. Шрайбер Г.Д. Моделирование на GPSS.
5. Е.И. Козелл. от Си к С++.
Приложение № 1
// ЗАДАНИЕ 15. Детерминированная модель системы.
#include<stdio.h>
#include<conio.h>
const emb=1; //единица машинного времени
main()
{ int tp=100; //интервал между приходами пользователей
int tgz1=160; //время подготовки задания 1-ым пользователем
int tgz2=170; //время подготовки задания 2-ым пользователем
int tgz3=180; //время подготовки задания 3-им пользователем
int tm=8; //время выполнения задания на ЭВМ
int k=500; //количество промоделированных на ЭВМ заданий
int t=0; //время
char nz=0; //наличие заявки на входе системы
char cikl=0; //цикл прихода заявок
char pz1=0; //подготовка задания на сетевой машине 1
char pz2=0; //подготовка задания на сетевой машине 1
char pz3=0; //подготовка задания на сетевой машине 1
char znw=0; //наличие заявки на выполнение задания
char wz=0; //выполнение задания на ЭВМ
char ocher[50]; //очередь
char n=0; //индекс свободного элемента в очереди
int w2=0; //количество вып. заданий от 2-го пользователя
int ztgz1,ztgz2,ztgz3,ztm,zk; //перем.для запоминания параметров системы
printf("Введите интервал между приходами пользователей "); scanf("%d",&tp);
printf("Введите время подготовки задания 1-ым пользователем ");
scanf("%d",&tgz1); ztgz1=tgz1;
printf("Введите время подготовки задания 2-ым пользователем ");
scanf("%d",&tgz2); ztgz2=tgz2;
printf("Введите время подготовки задания 3-ым пользователем ");
scanf("%d",&tgz3); ztgz3=tgz3;
printf("Введите время выполнения задания на ЭВМ "); scanf("%d",&tm); ztm=tm;
printf("Введите количество промоделированных на ЭВМ заданий ");
scanf("%d",&k); zk=k;
//----------- моделирующий цикл -----------------------------------
while (k!=0)
{ t=t+emb;
//появление пользователя
if (t%tp==0)
switch (cikl)
{ case 0: nz=1; cikl=1; break;
case 1: nz=2; cikl=2; break;
case 2: nz=3; cikl=3; break;
case 3: nz=1; cikl=0;
}
//начало подготовки задания
switch (nz)
{ case 1: pz1=1; nz=0; break;
case 2: pz2=1; nz=0; break;
case 3: pz3=1; nz=0;
}
Приложение № 1 (продолжение)
//подготовка задания
if (pz1==1)
if (tgz1==0) {pz1=0; znw=1; tgz1=ztgz1;} else tgz1=tgz1-emb;
if (pz2==1)
if (tgz2==0) {pz2=0; znw=2; tgz2=ztgz2;} else tgz2=tgz2-emb;
if (pz3==1)
if (tgz3==0) {pz3=0; znw=3; tgz3=ztgz3;} else tgz3=tgz3-emb;
// запрос на выполнение
if (n!=0 && wz==0) { wz=ocher[n-1]; n--; } //если очередь не пуста а ЭВМ свобода
// то выпол. заявку из очереди
if (znw!=0) //если имеется заявка на выполнение
if (wz==0) { wz=znw; znw=0; } //если ЭВМ не занята
else //если ЭВМ занята, то ставим заявку в очередь
{ if (n>=50) { printf("\nПереполнение очереди!\n"); return 0; }
else { ocher[n]=znw; znw=0; n++; }
}
//выполнение задания на ЭВМ
switch (wz)
{ case 1: if (tm==0) {wz=0; k--; tm=ztm; } else tm=tm-emb; break;
case 2: if (tm==0) {wz=0; k--; w2++; tm=ztm; } else tm=tm-emb; break;
case 3: if (tm==0) {wz=0; k--; tm=ztm; } else tm=tm-emb;
}
}
printf("\nПроцент вып. заданий, поступ. от 2-го польз.=%d%",100*w2/zk);
}
Приложение № 2
//Генерирование равномерно распределенных случайных величин
#include<stdio.h>
long x=7533; //псевдослучайное число
long Rnd(long x) // процедура формирования очередного псевдослучайного числа
{ int l=5169;
long k=65536;
return (l*x)%k;
}
void main()
{ FILE *fout; //выходной файл случайных величин
int i; //параметр цикла
fout=fopen("vi_gpsc1.dat","w");
for(i=1; i<=1000; i++) fprintf(fout,"%f ",float((x=Rnd(x)))/65536);
fclose(fout);
}
Приложение № 3
uses crt;
var f1,f2,f3,f4:text;
i:integer;
x,z1,z2,y1,y2,a,y3,y4,y5,y6:real;
procedure norm1(var x1,x2:real);
begin
z1:=random;
z2:=random;
x1:=sqrt(-2*ln(z1))*cos(2*pi*z2);
x2:=sqrt(-2*ln(z1))*sin(2*pi*z2);
x1:=sqrt(2)*x1+16;
x2:=sqrt(2)*x2+16;
end;
procedure norm2(var x1,x2:real);
begin
z1:=random;
z2:=random;
x1:=sqrt(-2*ln(z1))*cos(2*pi*z2);
x2:=sqrt(-2*ln(z1))*sin(2*pi*z2);
x1:=sqrt(2)*x1+17;
x2:=sqrt(2)*x2+17;
end;
procedure norm3(var x1,x2:real);
begin
z1:=random;
z2:=random;
x1:=sqrt(-2*ln(z1))*cos(2*pi*z2);
x2:=sqrt(-2*ln(z1))*sin(2*pi*z2);
x1:=sqrt(2)*x1+18;
x2:=sqrt(2)*x2+18;
end;
procedure expon (a:real ; var x: real);
begin
z1:=random;
x:=-(1/a)*ln(z1);
x:=sqrt(1/sqr(a))*x+0.8;
end;
Begin
clrscr;
assign(f1,'d:\tp\norm-1.dat');
rewrite(f1);
assign(f3,'d:\tp\norm-2.dat');
rewrite(f3);
assign(f4,'d:\tp\norm-3.dat');
rewrite(f4);
writeln(' Нормальный закон:');
for i:=1 to 500 do
begin
norm1(y1,y2); write(f1,y1,' ');write(f1,y2,' ');
norm2(y3,y4); write(f3,y3,' ');write(f3,y4,' ');
norm3(y5,y6); write(f4,y5,' ');write(f4,y6,' ');
Приложение № 3 (продолжение)
end;
close (f1); close (f3); close (f4);
assign(f2,'d:\tp\exp.dat');
rewrite(f2);
writeln('Экспоненциальный закон ');
writeln('Введите параметр a: '); readln(a);
for i:=1 to 500 do begin expon(a,x);write(f2,x,' '); end;
close(f2);
End.
Приложение № 4
//стохастическая модель системы
#include<stdio.h>
#include<conio.h>
const emb=1; //единица машинного времени
FILE *ravn, *norm1, *norm2, *norm3, *exp;
float a;
int ravnom()
{ fscanf(ravn,"%f ",&a);
return int(a*5);
}
int normal1()
{ fscanf(norm1,"%f ",&a);
return int(a*10);
}
int normal2()
{ fscanf(norm2,"%f ",&a);
return int(a*10);
}
int normal3()
{ fscanf(norm3,"%f ",&a);
return int(a*10);
}
int expon()
{ fscanf(exp,"%f ",&a);
return int(a*10);
}
//------------------------- основная программа ----------------------
main()
{ int tp=100; //интервал между приходами пользователей
int tgz1=160; //время подготовки задания 1-ым пользователем
int tgz2=170; //время подготовки задания 2-ым пользователем
int tgz3=180; //время подготовки задания 3-им пользователем
int tm=8; //время выполнения задания на ЭВМ
int k=500; //количество промоделированных на ЭВМ заданий
int t=0; //время
char nz=0; //наличие заявки на входе системы
char cikl=0; //цикл прихода заявок
char pz1=0; //подготовка задания на сетевой машине 1
char pz2=0; //подготовка задания на сетевой машине 1
char pz3=0; //подготовка задания на сетевой машине 1
char znw=0; //наличие заявки на выполнение задания
char wz=0; //выполнение задания на ЭВМ
char ocher[50]; //очередь
char n=0; //индекс свободного элемента в очереди
int w2=0; //количество вып. заданий от 2-го пользователя
ravn=fopen("ravnomer.dat","r");
norm1=fopen("norm1.dat","r");
norm2=fopen("norm2.dat","r");
norm3=fopen("norm3.dat","r");
exp=fopen("exp.dat","r");
tgz1=normal1();
Приложение № 4 (продолжение)
tgz2=normal2();
tgz3=normal3();
tm=expon();
tp=10+ravnom();
//----------- моделирующий цикл -----------------------------------
while (k!=0)
{ t=t+emb;
//появление пользователя
if (t%tp==0)
{ tp=10+ravnom();
fscanf(ravn,"%f ",&a);
if (a<0.4) nz=1;
if (a>0.4 && a<0.5) nz=2;
if (a>0.5) nz=3;
}
//начало подготовки задания
switch (nz)
{ case 1: pz1=1; nz=0; break;
case 2: pz2=1; nz=0; break;
case 3: pz3=1; nz=0;
}
//подготовка задания
if (pz1==1)
if (tgz1==0) {pz1=0; znw=1; tgz1=normal1();} else tgz1=tgz1-emb;
if (pz2==1)
if (tgz2==0) {pz2=0; znw=2; tgz2=normal2();} else tgz2=tgz2-emb;
if (pz3==1)
if (tgz3==0) {pz3=0; znw=3; tgz3=normal3();} else tgz3=tgz3-emb;
// запрос на выполнение
if (n!=0 && wz==0) { wz=ocher[n-1]; n--; } //если очередь не пуста а ЭВМ свобода
// то выпол. заявку из очереди
if (znw!=0) //если имеется заявка на выполнение
if (wz==0) { wz=znw; znw=0; } //если ЭВМ не занята
else //если ЭВМ занята, то ставим заявку в очередь
{ if (n>=50) { printf("\nПереполнение очереди!\n"); return 0; }
else { ocher[n]=znw; znw=0; n++; }
}
//выполнение задания на ЭВМ
switch (wz)
{ case 1: if (tm==0) {wz=0; k--; tm=expon(); } else tm=tm-emb; break;
case 2: if (tm==0) {wz=0; k--; w2++; tm=expon(); } else tm=tm-emb; break;
case 3: if (tm==0) {wz=0; k--; tm=expon(); } else tm=tm-emb;
}
}
printf("\nПроцент вып. заданий, поступ. от 2-го польз.=%d%",100*w2/500);
fclose(ravn);
fclose(norm1);
fclose(norm2);
fclose(norm3);
fclose(exp);
}