Моделирование ЭВМ

- вставим программный генератор РРПСЧ - встроенную функцию 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.

Получение и интерпретация результатов

моделирования

Значения выходных характеристик, полученные при прогонках модели с различными случайными воздействиями.

№ прогона

% выполненных заданий, поступ. от 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;


Страница: