Автор работы: Пользователь скрыл имя, 12 Декабря 2012 в 22:34, курсовая работа
Составить имитационную модель процесса, функциональная модель которого представлена на рисунке 1. На вход системы поступает поток грузовиков с массой доставленного зерна 3 т., с вероятностью 0.3, 5 т. с вероятностью 0.5 и 8 т. с вероятностью 0.2. Масса доставленного зерна описывается нормальным законом распределения со ср. кв. отклонением 15% от математического ожидания. Интерва
Московский Государственный Университет Пищевых Производств.
Кафедра АСиВТ
Курсовая работа
на тему: «Имитационное моделирование».
Выполнил: студент
группы 08-ИУ-1
Лавренов С.А.
Проверил:
Карпов В. И.
Москва 2011 г.
Задание.
Составить имитационную модель процесса,
функциональная модель которого представлена
на рисунке 1. На вход системы поступает
поток грузовиков с массой доставленного
зерна 3 т., с вероятностью 0.3, 5 т. с
вероятностью 0.5 и 8 т. с вероятностью
0.2. Масса доставленного зерна
описывается нормальным законом
распределения со ср. кв. отклонением
15% от математического ожидания. Интервалы
поступления грузовиков описываются
экспоненциальным законом распределения
с интенсивностью от 5 авт/час до
12 авт./час. Построить график зависимости
среднего времени пребывания грузовика
от интенсивности входного потока.
Определить пропускную способность
системы. Ошибка моделирования должна
составить не более 15%.
Производительность разгрузочного оборудования
составляет 900 т/час, производительность
транспортирующего оборудования составляет
150 т. /час, время обслуживания на визировочной
станции составляет 3 минуты плюс – минус
10%, на весах – 4 мин плюс – минус 15%.
Емкость бункеров составляет 40 т
Структурная Схема
Математическая постановка.
Массив событий:
ST[0] – поступление транзакта;
ST[1] – освобождение 1-ой визировки;
ST[2] – освобождение весов;
ST[3] – освобождение 1-го разгрузчика;
ST[4] – освобождение 2-го разгрузчика;
ST[5] – освобождение 3-го разгрузчика;
ST[6] – освобождение 1-го транспортера;
ST[7] – освобождение 2-го транспортера;
ST[8] – освобождение 3-го транспортера;
ST[9] – освобождение 1-ых весов;
ST[10] – освобождение 2-ых весов;
где di – Tt-This->t, Tt – текущее системное время, This->t – время прибытия транзакта, ka – общее количество транзактов.
,где This->Massa(i) – масса досталенного зерна каждого транзакта.
Текст Программы.
//----------------------------
#include <vcl.h>
#pragma hdrstop
//----------------------------
#pragma argsused
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <math.h>
//----------------------------
struct Gruzov
{ int Ng;
float Massa;
float T;
};
class OA
{ private:
float T;
public:
float Massa;
int sost;
float proisv;
void Fobr(int nr);
};
class VISIR
{ private:
public:
float Massa;
float T;
int sost;
float proisv;
void Fobr(int nv);
};
class VESI
{ private:
public:
float T;
float Massa;
int sost;
float proisv;
void Fobr();
};
class och
{ private:
static och* Begin[2];
static och* End[2];
int Ng;
float Massa;
float T;
och* sled;
// och* pred;
public:
static int kvo[2];
void FZap(Gruzov& gr,int n);
Gruzov& Fvyb(Gruzov& gr,int n);
void Prosmoch(int n);
//void ProsmStek(int n);
};
class Transp
{ public:
float bunker;
float massat;
int sost;
float dm;
float proisv;
void Fobr(int nt);
};
float Norm ( float Mo, float Sko)
{ int i;
float s;
do
{
for(s=0,i=0;i<6;i++)
s +=random(32767)/32767.0;
s = (s-3)*1.414214*Sko + Mo;
}
while (s<=0) ;
return s;
}
och* och::Begin[] = {NULL, NULL};
och* och::End[] ={NULL,NULL};
int och::kvo[]={0,0};
float summass=0;
Gruzov zG;
#pragma argsused
float ST[]={0, 32767.0,32767.0, 32767.0,32767.0, 32767.0,32767.0, 32767.0, 32767. 0, 32767. 0, 32767.0 };
float Tt=0;
float SUM=0;
och* oG, *oG1;
int kA=0;
Transp Tr[4];
OA rasgr[4];
VISIR Vis1, Vis2, Vis3;
VESI Ves;
float dt,Tmod=1200.0,Mmo=5,Msko=0.
int main ()
{ Tr[0].bunker=40;
Tr[0].proisv=2,5;
Tr[0].sost=0;
Tr[0].massat =0;
Tr[0].dm=2;
Tr[1].bunker=40;
Tr[1].proisv=2,5;
Tr[1].sost=0;
Tr[1].massat =0;
Tr[1].dm=2;
Tr[2].bunker=40;
Tr[2].proisv=2,5;
Tr[2].sost=0;
Tr[2].massat =0;
Tr[2].dm=2;
rasgr[0].proisv = 15;
rasgr[0].sost=0;
rasgr[1].proisv = 15;
rasgr[1].sost=0;
rasgr[2].proisv = 15;
rasgr[2].sost=0;
Vis.sost=0;
Ves1.sost=0;
Ves2.sost=0;
Gruzov zGt;
int noms=0;
printf("Vvedite Intensivnost' L=");
scanf("%f",&L);
L=L/60;
while(Tt!=32767.0)
{ Tt=32767.0;
for(int i= 0;i<12;i++)
if (Tt > ST[i])
{Tt = ST[i];
noms=i;
}
switch(noms)
{
case 0:zGt.Massa=Norm(Mmo,Msko);
zGt.T = Tt;
oG = new och;
oG->FZap(zGt,0);
if (Vis1.sost==0&& oG->kvo[0]==1)
ST[1]= Tt;
else
if (Vis2.sost==0&& oG->kvo[0]==1)
ST[2]= Tt;
else
if (Vis3.sost==0&& oG->kvo[0]==1)
ST[3]= Tt;
dt=-1/L*log(random(32767)/
if (Tt+dt<Tmod)
ST[0]=Tt+dt;
else
ST[0]=32767;
break;
case 1:
Vis.Fobr(0);
break;
case 2: Ves.Fobr();
break;
case 3: rasgr[0].Fobr(0);
break;
case 4: rasgr[1].Fobr(0);
break;
case 5: rasgr[2].Fobr(0);
break;
case 6: Ves.Fobr();
break;
case 7: Ves.Fobr();
break;
case 8: Tr[0].Fobr(0);
break;
case 9: Tr[1].Fobr(0);
break;
case 10: Tr[2].Fobr(0);
break;
}
}
SUM= SUM/kA;
printf("*************\n");
printf("Srednee T=%6.2f kA=%d\n",SUM,kA);
oG->Prosmoch(0);
printf("*************\n");
oG1->Prosmoch(1);
printf("Summass =%6.2f \n",summass);
getch();
return 0;
}
void och::FZap(Gruzov& gr,int n)
{ och *Tuk;
//Tuk=new Gruzov;
this->Ng = gr.Ng;
this->Massa =gr.Massa;
this->T=gr.T;
this->sled = NULL;
if (this->Begin[n]==NULL)
{ this->Begin[n] = this;
this->End[n] =this;
//this->pred = NULL;
}
else
{ this-> End[n] -> sled = this;
//this-> pred= this->End[n];
this ->End[n] = this;
}
this ->kvo[n]++;
}
//----------------------------
Gruzov& och::Fvyb(Gruzov& gr,int n)
{ och *Tuk;
if (this ->Begin[n] != NULL)
{
Tuk=this->Begin[n] ->sled;
gr.Massa = this->Begin[n]->Massa;
gr.T = this->Begin[n]->T;
delete this->Begin[n];
this->Begin[n] = Tuk;
this ->kvo[n]--;
if (Tuk ==NULL)
//Tuk->pred = NULL;
//else
this ->End[n] = NULL;
}
else
{ gr.Massa= 0;
gr.T=0;
printf ("kvo = %d \n", this->kvo[n]);
getch();
}
return gr;
}
void och::Prosmoch(int n)
{
och *Tuk;
Tuk = this->Begin[n];
while (Tuk!=NULL)
{
printf("Ng=%d Massa= %6.2f T= %d \n",Tuk->Ng,Tuk->Massa, Tuk->T );
Tuk = Tuk->sled;
}
}
void OA::Fobr(int nr)
{ int d;
Gruzov gr;
if (this ->sost==1 || this->sost==2 )
{ if (this->Massa + Tr[nr].massat <= Tr[nr].bunker)
{
d = Tt- this->T;
SUM+=d;
Tr[nr].massat += this->Massa;
if (Tr[nr].sost==0)
{switch (nr)
{case 0:
ST[6]=Tt;
break;
case 1:
ST[7]=Tt;
break;
case 2:
ST[8]=Tt;
break;
}
}
kA++;
if (oG->kvo[1]>=1)
{ gr=oG ->Fvyb(gr,1);
this->Massa = gr.Massa;
this->T=gr.T;
this ->sost =1;
switch (nr)
{case 0:
ST[3]= Tt+gr.Massa/proisv ;
break;
case 1:
ST[4]= Tt+gr.Massa/proisv;
break;
case 2:
ST[5]= Tt+gr.Massa/proisv;
break;
}
}
else
{ switch (nr)
{case 0:
ST[3]= 32767 ;
break;
case 1:
ST[4]=32767 ;
break;
case 2:
ST[5]=32767 ;
break;
}
this ->sost =0;
}
}
else
{ switch (nr)
{case 0:
ST[3]= 32767 ;
break;
case 1:
ST[4]=32767 ;
break;
case 2:
ST[5]=32767 ;
break;
}
this ->sost =2;
}
}
else
if (oG->kvo[1]>=1)
{ gr=oG ->Fvyb(gr,1);
this->Ng=gr.Ng;
this->Massa = gr.Massa;
this->T=gr.T;
this ->sost =1;
switch (nr)
{case 0:
ST[3]= Tt+gr.Massa/proisv;
break;
case 1:
ST[4]= Tt+gr.Massa/proisv ;
break;
case 2:
ST[5]= Tt+gr.Massa/proisv;
break;
}
}
else
{ switch (nr)
{case 0:
ST[3]= 32767 ;
break;
case 1:
ST[4]=32767 ;
break;
case 2:
ST[5]=32767;
break;
}
this ->sost =0;
}
}
void Transp::Fobr(int nt)
{ if (massat > 0)
{ if (massat>=dm)
{ switch (nt)
{case 0:
ST[6]= Tt+ dm/proisv ;
break;
case 1:
ST[7]= Tt+ dm/proisv ;
break;
case 2:
ST[8]= Tt+ dm/proisv ;
break;
}
sost=1;
massat -= dm;
summass+=dm;
}
else
{ switch (nt)
{case 0:
ST[6]= Tt+ massat/proisv ;
break;
case 1:
ST[7]= Tt+ massat/proisv;
break;
case 2:
ST[8]= Tt+ massat/proisv;
break;
}
// ST[2]=Tt+ massat/proisv;
summass+=massat;
massat=0;
sost=1;
}
if (rasgr[nt].sost==2 && massat + rasgr[nt].Massa <= bunker)
switch (nt)
{case 0:
ST[3]= Tt;
break;
case 1:
ST[4]= Tt;
break;
case 2:
ST[5]= Tt;
break;
}
}
else
{
sost= 0;
switch (nt)
{case 0:
ST[6]=32767;
break;
case 1:
ST[7]=32767;
break;
case 2:
ST[8]=32767;
break;
}
//ST[2]=32767;
}
}
//----------------------------
void VISIR::Fobr(int nv)
{ int d;
Gruzov gr;
if (this ->sost==1 || this->sost==2 )
{ d = Tt- this->T;
SUM+=d;
if (Ves.sost==0)
{Ves.Massa = this->Massa;
Ves.T= this->T;
ST[2]=Tt+Norm(Tvesmo,Tvessko);
if (oG->kvo[0]>=1)
{ gr=oG ->Fvyb(gr,0);
this->Massa = gr.Massa;
this->T=gr.T;
this ->sost =1;
switch (nv)
{case 0:
ST[1]=Tt+Norm(Tvismo,Tvissko);
break;
}
// ST[1]= Tt+gr.Massa/proisv;
}
else
{ switch (nv)
{case 0:
ST[1]=32767;
break;
}
this ->sost =0;
}
}
Else
{ switch (nv)
{case 0:
ST[1]=32767;
break;
}
this ->sost =2;
}
}
else
if (oG->kvo[0]>=1)
{ gr=oG ->Fvyb(gr,0);
this->Massa = gr.Massa;
this->T=gr.T;
this ->sost =1;
switch (nv)
{case 0:
ST[1]=Tt+Norm(Tvismo,Tvissko);
break;
}
}
{ switch (nv)