RSS    

   Реферат: Моделирование ЭВМ

  возвращающую РРПСЧ в интервале (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);

}


Страницы: 1, 2, 3, 4, 5


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.