Имитационное моделирование

Автор работы: Пользователь скрыл имя, 12 Декабря 2012 в 22:34, курсовая работа

Краткое описание

Составить имитационную модель процесса, функциональная модель которого представлена на рисунке 1. На вход системы поступает поток грузовиков с массой доставленного зерна 3 т., с вероятностью 0.3, 5 т. с вероятностью 0.5 и 8 т. с вероятностью 0.2. Масса доставленного зерна описывается нормальным законом распределения со ср. кв. отклонением 15% от математического ожидания. Интерва

Прикрепленные файлы: 1 файл

курсовая по программированию.docx

— 68.65 Кб (Скачать документ)

Московский Государственный Университет Пищевых Производств.

 

 

Кафедра АСиВТ

 

 

 

 

 

 

 

 

 

 

 

 

 

Курсовая работа

на тему: «Имитационное моделирование».

 

 

 

 

 

 

 

 

Выполнил: студент

группы 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.75,Tvismo=3,Tvissko=0.3,Tvesmo=4,Tvessko=0.6,L;

 

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)/32767.0);

          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)

Информация о работе Имитационное моделирование