Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет по смо.doc
Скачиваний:
9
Добавлен:
07.12.2018
Размер:
274.94 Кб
Скачать

Пример временной диаграммы функционирования системы Пример технической системы

Система слежения за температурой в реакторе на атомной электростанции.

Источники:

Источниками в нашей системе являются датчики измерения температуры с различными коэффициентами доверия. Сигналы(заявки) от источников будут приходить в случайное время так как мы не можем предсказать скорость реакции, проходящей в реакторе. Датчики с большим коэффициентом доверия имеют больший приоритет.

Приоры:

Приборами в нашей системе являются компьютеры, на которых установлены программы, управляющие стержнями. Скорость приборов зависит от процессоров, установленных на каждом компьютере. Компьютеры упорядочены таким образом что самый быстрый является самым приоритетным.

Расчет значений входных параметров:

Предположим, что в университете имеет компьютеры с процессорами следующих типов:

  1. intel core 2 duo - 2000MHz - Цена: 90$

  2. intel core i3 - 2200MHz - Цена: 100$

  3. intel core i5 - 2500MHz -  Цена: 120$

  4. intel core i7- 3100MHz- Цена: 200$

Теперь можно указать входные параметры системы:

Количество источников: 3

источники

Интенсивность

И1

3-3.2

И2

2.6-2.8

И3

2.2-2.4

Количество приборов: 2 – 4.

Интенсивности приборов:

Прибор

Интенсивность

Intel core 2 duo

2.4

intel core i3

2.6

intel core i5

2.8

intel core i7

3

Размер буфера: 3– 10 мест.

Требование на выходные параметры:

- Вероятность отказа не должна быть больше 15%. (Мы требуем, чтобы наша система обслуживала почти все просьбы от источников).

- Коэффициент использования приборов не должен быть меньше 95% для прибора с наибольшим приоритетам и не должен быть меньше 75% для прибора с наименьшим приоритетам

- Время пребывания в системе: требуется чтобы максимально времени обслуживаний не больше 30 секунд и время ожидания в буфере не больше 60 секунд поэтому время пребывания в системе не больше чем 90 секунд.

Документация на программное обеспечение:

Обобщенная блок-схема:

Модульная структура:

Модуль пошагового моделирования

Pribori:

0 0.888779 1 2

1 0.927041 0 0

2 0.857003 0 1

3 0.985834 1 3

Nosv: 2

Istochniki:

0 2 0.815132

1 4 0.847777

2 2 0.877768

Nmin 2

Buffer:

IndBuff: 1

N_uk: 1

0 2 1 0.777059

1 -1 -1 -1

2 -1 -1 -1

3 -1 -1 -1

4 -1 -1 -1

5 -1 -1 -1

6 -1 -1 -1

N_paketa :0

М

одуль автоматического моделирования

N kol: ver_otk: St_vr_in_b Vr_in_pr: Vt_in_sys:

0 3442 0.001452 0.148531 0.288387 0.436918

1 3222 0.008070 0.197478 0.284494 0.481972

2 1993 0.098846 0.423765 0.285105 0.708870

Koef. zan

0 0.976341

1 0.968500

2 0.962657

3 0.952705

Коды программы:

#include <iostream>

#include <windows.h>

#include <time.h>

#include <math.h>

#include "conio.h"

#define I 3

#define P 4

#define B 7

#define KOM false

using namespace std;

long double fact(double t)

{

int o=1;

for(unsigned int i=1; i<t;i++)

o=o*i;

return o;

}

void GetNmin(int * nmin, long double * ist_time)

{

*(nmin)=0;

for (unsigned int i=1;i<I;i++)

{

if (*(ist_time+(*(nmin)))>(*(ist_time+i)))

*(nmin)=i;

}

}

int V_P(long double* prib_time,long double* ist_time,int nmin)

{

for(int i=0;i<P;i++)

{

if(*(prib_time+i)<*(ist_time+nmin))

return i;

}

}

void GetNosv(int * nosv, long double * prib_time)

{

*(nosv)=0;

for (unsigned int i=1;i<P;i++)

{

if (*(prib_time+(*(nosv)))>(*(prib_time+i)))

*(nosv)=i;

}

}

void GenTayob(double * tayob,double* lambpr,int nosv)

{

*(tayob)=rand()/(double)RAND_MAX/(*(lambpr+nosv))+0.1;//генерируем время обработки по закону

}

void init(double * zan,double* t_in_prib,int*k_in_b,double * t_in_b,double*lambpr,double* n_zay,double * n_zay_b,double * n_zay_p,double * n_ist_zay_p,double *kol,double *k_otk,double *k_obr,long double* t_buff,int *n_buff,int * n_uk_buff, long double* prib_time,long double* ist_time,int* N_paketa,int *ind_buff,int * nmin,int * nosv,double* lamb)

{

for (unsigned int i = 0;i<B;i++)

{

*(t_buff+i)=-1;

*(n_buff+i)=-1;

*(n_zay_b+i)=-1;

}

*(n_uk_buff)=0;

for (unsigned int i = 0;i<P;i++)

{

*(prib_time+i)=0;

*(n_zay_p+i)=-1;

*(n_ist_zay_p+i)=-1;

*(zan+i)=0;

*(lambpr+i)=3-i*0.2;

}

for (unsigned int i = 0;i<I;i++)

{

*(t_in_b+i)=0;

*(k_in_b+i)=0;

*(ist_time+i)=0;

*(kol+i)=0;

*(k_otk+i)=0;

*(k_obr+i)=0;

*(n_zay+i)=-1;

*(lamb+i)=2.6;

*(t_in_prib+i)=0;

}

*(lamb+0)=3;

*(lamb+1)=2.4;

*(lamb+2)=2;

*(N_paketa)=0;

*(nmin)=0;

*(nosv)=0;

*(ind_buff)=0;

}

void Get_New_Time(int n, long double * ist_time,double * lamb,double * n_zay)

{

double tay=pow(rand()/(double)RAND_MAX,*(lamb+n))*exp(-rand()/(double)RAND_MAX)/fact(*(lamb+n))+0.1; //генерируем по закону

*(ist_time+n)=*(ist_time+n)+tay;

(*(n_zay+n))++;

}

void GenTosv(int nosv,long double *prib_time,int nmin,long double * ist_time,double tayob,double*t_in_prib)

{

*(t_in_prib+nmin)=*(t_in_prib+nmin)+tayob;

*(prib_time+nosv)=*(ist_time+nmin)+tayob;

}

void GenTosvB(int nosv,long double *prib_time,double tayob,int nmin, double* t_in_prib)

{

*(t_in_prib+nmin)=*(t_in_prib+nmin)+tayob;

*(prib_time+nosv)=*(prib_time+nosv)+tayob;

}

void write_in_buff(double* n_zay,double* n_zay_b,int* n_uk_buff, long double * t_buff, int* n_buff,int nmin,long double * ist_time,int* ind_buff)

{

int i=*(n_uk_buff);

while(*(n_buff+i)!=-1)

{

i++;

if(i==B)

i=0;

}

*(n_buff+i)=nmin;

*(t_buff+i)=*(ist_time+nmin);

*(n_zay_b+i)=*(n_zay+nmin);

*(n_uk_buff)=i+1;

if(*(n_uk_buff)==B)

*(n_uk_buff)=0;

*(ind_buff)=*(ind_buff)+1;

}

bool otpr_v_otkaz(int* n_uk_buff, long double * t_buff, int * n_buff,double * k_otk,int * ind_buff,long double time,double * t_in_b,int * k_in_b)

{

int i;

int v=0;

bool flag =false;

int nmin=-1;

long double tmin=-1;

for(i=0;i<B;i++)

{

if ((*(n_buff+i)>nmin))

{

nmin=i;

tmin=*(t_buff+i);

}

}

for(i=0;i<B;i++)

{

if ((*(n_buff+i)==nmin)&&(*(t_buff+i)<tmin))

{

nmin=i;

tmin=*(t_buff+i);

}

}

*(k_in_b+*(n_buff+nmin))=*(k_in_b+*(n_buff+nmin))+1;

*(t_in_b+*(n_buff+nmin))=*(t_in_b+*(n_buff+nmin))+time-*(t_buff+nmin);

(*(k_otk+*(n_buff+nmin)))=(*(k_otk+*(n_buff+nmin)))+1;

*(t_buff+nmin)=-1;

*(n_buff+nmin)=-1;

*(n_uk_buff)=nmin;

*(ind_buff)=*(ind_buff)-1;

if(KOM)

{

cout<<"zayavka ot istochnika "<<*(n_buff+nmin)<<"viesnena bolee prioritetnoq"<<endl;

}

return true;

}

int read_from_buff(int * n_uk_buff, int * N_paketa, int * n_buff, long double * t_buff)

{

int v=-1;

long double vt=-1;

bool flag=true;

for(unsigned int i=0;i<B;i++)

{

if((*(n_buff+i)==*(N_paketa))&&(flag))

{

v=*(n_buff+i);

vt=*(t_buff+i);

flag=false;

*(n_uk_buff)=i;

}

if((*(n_buff+i)==*(N_paketa))&&(!flag)&&(*(t_buff+i)<vt))

{

v=*(n_buff+i);

vt=*(t_buff+i);

*(n_uk_buff)=i;

}

}

if(flag)

{

for(unsigned int i=0;i<B;i++)

{

if((v==-1)&&(*(n_buff+i)>=0))

{

v=*(n_buff+i);

vt=*(t_buff+i);

*(N_paketa)=v;

*(n_uk_buff)=i;

}

if ((v>=0)&&(*(n_buff+i)>=0)&&(*(n_buff+i)<v))

{

v=*(n_buff+i);

vt=*(t_buff+i);

*(N_paketa)=v;

*(n_uk_buff)=i;

}

if ((v>=0)&&(*(n_buff+i)>=0)&&(*(n_buff+i)==v)&&(*(t_buff+i)<vt))

{

v=*(n_buff+i);

vt=*(t_buff+i);

*(N_paketa)=v;

*(n_uk_buff)=i;

}

}

}

return v;

}

void vivod(double * n_zay,double * n_zay_b,double * n_zay_p,double * n_ist_zay_p,long double * ist_time, long double * prib_time, int * n_buff, long double * t_buff,double * k_otk, double * k_obr,double * kol, int ind_buff, int N_paketa,int n_uk_buff,int ist, int prib, int buff,int nmin,int nosv)

{

int x,y;

x=0;

y=0;

COORD coord = {x, y};

SetConsoleCursorPosition ( GetStdHandle ( STD_OUTPUT_HANDLE ), coord );

for(unsigned int i = 0;i<(60*ist*prib*buff+3);i++)

{

cout<<" ";

}

SetConsoleCursorPosition ( GetStdHandle ( STD_OUTPUT_HANDLE ), coord );

cout<<"Pribori:"<<endl;

for (unsigned int i = 0;i<prib;i++)

cout<<i<<" "<<*(prib_time+i)<<" "<<*(n_ist_zay_p+i)<<" "<<*(n_zay_p+i)<<endl;

cout<<"Nosv: "<<nosv<<endl;

cout<<endl<<"Istochniki:"<<endl;

for (unsigned int i = 0;i<ist;i++)

{

cout<<i<<" "<<*(n_zay+i)<<" "<<*(ist_time+i)<<endl;

//cout<<"kolichestvo vipolnennih zayavok : "<<*(k_obr+i)<<endl<<"kolichestvo otklonennih zayavok: "<<*(k_otk+i)<<endl<<"vsego zayavok: "<<*(kol+i)<<endl;

}

cout<<"Nmin "<<nosv<<endl;

cout<<endl<<"Buffer:"<<endl;

cout<<"IndBuff: "<<ind_buff<<endl;

cout<<"N_uk: "<<n_uk_buff<<endl;

for (unsigned int i = 0;i<buff;i++)

cout<<i<<" "<<*(n_buff+i)<<" "<<*(n_zay_b+i)<<" "<<*(t_buff+i)<<endl;

cout<<"N_paketa :"<<N_paketa<<endl;

}

void main(void)

{

int n_uk_buff=0;

int ist=I;

int buff=B;

int prib=P;

long double t_buff[B];

int n_buff[B];

double zan[P];

long double ist_time[I];

double lamb[I];

double n_zay[I];

double n_zay_b[B];

double n_zay_p[P];

double n_ist_zay_p[P];

long double prib_time[P];

int u;

int N_paketa;

double lambpr[P];

int ind_buff=0;

int nmin;

int nosv;

srand((unsigned) time(NULL));

double k_obr[I];

double k_otk[I];

double kol[I];

double time=0;

double p1=0;

double p2=0;

double tayob=0;

double ver[I];

double N=100;

double t_in_b[I];

int k_in_b[I];

double t_in_prib[I];

bool fl=true;

init(zan,t_in_prib,k_in_b,t_in_b,lambpr,n_zay,n_zay_b,n_zay_p,n_ist_zay_p,kol,k_otk,k_obr,t_buff,n_buff,&(n_uk_buff),prib_time,ist_time,&(N_paketa),&(ind_buff),&(nmin),&(nosv),lamb);

for(unsigned int i=0;i<I;i++)

{

Get_New_Time(i,ist_time,lamb,n_zay);

kol[i]++;

N--;

}

if(KOM)

{

vivod(n_zay,n_zay_b,n_zay_p,n_ist_zay_p,ist_time,prib_time,n_buff,t_buff,k_otk,k_obr,kol,ind_buff,N_paketa,n_uk_buff,ist,prib,buff,nmin,nosv);

_getch();

}

do{

do{

GetNosv(&(nosv),prib_time);

GetNmin(&(nmin),ist_time);

if(prib_time[nosv]>ist_time[nmin])

{

time=ist_time[nmin];

if (ind_buff==B)

{

otpr_v_otkaz(&(n_uk_buff),t_buff,n_buff,k_otk,&(ind_buff),time,t_in_b,k_in_b);

write_in_buff(n_zay,n_zay_b,&(n_uk_buff),t_buff,n_buff,nmin,ist_time,&(ind_buff));

kol[nmin]++;

N--;

Get_New_Time(nmin,ist_time,lamb,n_zay);

if(KOM)

{

vivod(n_zay,n_zay_b,n_zay_p,n_ist_zay_p,ist_time,prib_time,n_buff,t_buff,k_otk,k_obr,kol,ind_buff,N_paketa,n_uk_buff,ist,prib,buff,nmin,nosv);

cout<<"Zayavka ot istochnika № "<<nmin<<" zapisana v bufer"<<endl;

_getch();

}

}

else

{

write_in_buff(n_zay,n_zay_b,&(n_uk_buff),t_buff,n_buff,nmin,ist_time,&(ind_buff));

kol[nmin]++;

N--;

Get_New_Time(nmin,ist_time,lamb,n_zay);

if(KOM)

{

vivod(n_zay,n_zay_b,n_zay_p,n_ist_zay_p,ist_time,prib_time,n_buff,t_buff,k_otk,k_obr,kol,ind_buff,N_paketa,n_uk_buff,ist,prib,buff,nmin,nosv);

cout<<"Zayavka ot istochnika № "<<nmin<<" zapisana v bufer"<<endl;

_getch();

}

}

}

else

{

time=prib_time[nosv];

if(ind_buff==0)

{

nosv=V_P(prib_time,ist_time,nmin);

GenTayob(&(tayob),lambpr,nosv);

zan[nosv]=zan[nosv]+tayob;

GenTosv(nosv,prib_time,nmin,ist_time,tayob,t_in_prib);

n_zay_p[nosv]=n_zay[nmin];

n_ist_zay_p[nosv]=nmin;

Get_New_Time(nmin,ist_time,lamb,n_zay);

k_obr[nmin]++;

kol[nmin]++;

N--;

N_paketa=nmin;

if(KOM)

{

vivod(n_zay,n_zay_b,n_zay_p,n_ist_zay_p,ist_time,prib_time,n_buff,t_buff,k_otk,k_obr,kol,ind_buff,N_paketa,n_uk_buff,ist,prib,buff,nmin,nosv);

cout<<"Zayavka ot istochnika № "<<nmin<<" otpralena na pribor "<<nosv<<endl;

_getch();

}

}

else

{

GenTayob(&(tayob),lambpr,nosv);

zan[nosv]=zan[nosv]+tayob;

u=n_uk_buff;

nmin=read_from_buff(&(u),&(N_paketa),n_buff,t_buff);

n_zay_p[nosv]=n_zay_b[u];

k_in_b[nmin]++;

t_in_b[nmin]=t_in_b[nmin]+time-t_buff[u];

n_ist_zay_p[nosv]=n_buff[u];

n_buff[u]=-1;

t_buff[u]=-1;

n_zay_b[u]=-1;

GenTosvB(nosv,prib_time,tayob,nmin,t_in_prib);

k_obr[nmin]++;

ind_buff--;

if(KOM)

{

vivod(n_zay,n_zay_b,n_zay_p,n_ist_zay_p,ist_time,prib_time,n_buff,t_buff,k_otk,k_obr,kol,ind_buff,N_paketa,n_uk_buff,ist,prib,buff,nmin,nosv);

cout<<"Zayavka ot istochnika № "<<nmin<<" otpralena na pribor "<<nosv<<" iz buff: "<<n_uk_buff<<endl;

_getch();

}

}

}

if (N==0)

{

while(ind_buff)

{

GetNosv(&(nosv),prib_time);

GenTayob(&(tayob),lambpr,nosv);

zan[nosv]=zan[nosv]+tayob;

u=n_uk_buff;

nmin=read_from_buff(&(u),&(N_paketa),n_buff,t_buff);

n_zay_p[nosv]=n_zay_b[u];

k_in_b[nmin]++;

t_in_b[nmin]=t_in_b[nmin]+time-t_buff[u];

n_ist_zay_p[nosv]=n_buff[u];

n_buff[u]=-1;

t_buff[u]=-1;

n_zay_b[u]=-1;

GenTosvB(nosv,prib_time,tayob,nmin,t_in_prib);

k_obr[nmin]++;

ind_buff--;

}

}

}while(N>0);

p1=p2;

ver[0]=k_otk[0]/kol[0];

p2=ver[0];

for(unsigned int i=1;i<I;i++)

{

ver[i]=k_otk[i]/(k_obr[i]+k_otk[i]);

if (p2<ver[i])

p2=ver[i];

}

if(fl)

{

p1=p2/2;

fl=false;

}

N=(int)(pow(1.643,2)*(1-p2)/(p2*0.01));

}while(abs(p2-p1)>p2*0.1);

printf("N kol:\t ver_otk:\t St_vr_in_b\t Vr_in_pr:\t Vt_in_sys:\n");

//for(int i=0;i<I;i++)

//cout<<k_in_b[i]<<" "<<t_in_b[i]<<endl;

if (1)

{

time=prib_time[0];

for(int i = 1 ; i<P; i++)

{

if(time<prib_time[i])

time=prib_time[i];

}

}

for(int i=0;i<I;i++)

{

printf("%d %d \t %f \t %f \t %f \t %f\n",i,(int)(k_obr[i]+k_otk[i]),ver[i],t_in_b[i]/k_in_b[i],t_in_prib[i]/k_obr[i],t_in_b[i]/k_in_b[i]+t_in_prib[i]/k_obr[i]);

}

printf("Koef. zan\n");

for (int i=0;i<P;i++)

{

printf("%f \t\n",zan[i]/time);

}

_getch();

}