Разработка имитационной модели системы массового обслуживания

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

?ь". Во время работы программы текущие результаты отображаются в таблице (рис.1 - 10). По окончанию работы программы выводится текстовый файл с основными результатами. Результаты работы программы можно также просмотреть, нажав кнопку “Отчёт” (рис.1 - 9).

Рисунок 2. Пример отчёта

 

Во время работы приложения также можно следить за изменением количества клиентов на диаграмме (рис.1 - 11).

В приложении имеется меню (Файл, Сохранить). Меню “Файл" содержит следующие пункты:

“Начать" - начинает процесс моделирования (идентичен кнопке “Начать”)

“Приостановить” - временно останавливает процесс моделирования (кнопка “Приостановить”),

“Остановить" - заканчивает процесс моделирования (кнопка “Остановить”),

“Сохранить отчёт" - сохраняет отчёт о работе приложения,

“Открыть отчёт" - открывает файл отчёта,

“Выход” - заканчивает работу приложения.

Меню “Справка” содержит пункты:

“Помощь" - справочная информация о программе,

“Разработчик” - информации о разработчике приложения.

Результаты тестирования программы

 

 

 

Общее время работы Номер аппарата обслуживанияВремя работы аппаратаВремя простоя аппаратаОбщее количество клиентов Количество обслуженных клиентовКоличество выбывших клиентов1: 50: 011: 50: 00: 0: 0109021: 49: 00: 1: 087031: 47: 00: 3: 087041: 46: 00: 4: 087051: 45: 00: 5: 087061: 44: 00: 6: 077071: 43: 00: 7: 076081: 41: 00: 9: 076091: 41: 00: 9: 0760101: 41: 00: 9: 0491929

Заключение

 

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

Список использованных источников

 

  1. Лифшиц А.Л. Статистическое моделирование СМО, М., 1978.
  2. Советов Б.А., Яковлев С.А. Моделирование систем, М: Высшая школа, 1985.
  3. Гмурман В.Е. Теория вероятностей и математическая статистика, М: Высшая школа, 2001.
  4. Пригодин Н.В. Системный подход в моделироании М., 1986.

Приложение

 

Листинг программы

 

void CSMODlg:: OnButton1 ()

{

UpdateData ();

if (! NTime)

{

timeS=m_StartH*60+m_StartM;

timeE=m_EndH*60+m_EndM;

timeT=timeS+timeE;

int i=timeS;

Tm=timeS;

m_Table2. SetCols (m_CountOch*4);

m_Table2. SetRows (1);

m_Table2. SetRows (4);

int j=0;

while (j< (m_CountOch*4))

{

m_Table2. SetTextMatrix (0,j,"№"); m_Table2. SetColWidth (j,350);

m_Table2. SetTextMatrix (0,j+1,"Получение"); m_Table2. SetColWidth (j+1,700);

m_Table2. SetTextMatrix (0,j+2,"Обслужен"); m_Table2. SetColWidth (j+2,700);

m_Table2. SetTextMatrix (0,j+3,"Состояние"); m_Table2. SetColWidth (j+3,800);

j+=4;

}

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

{

OCH. o1 [i] =0; OCH. o2 [i] =0;

OCH. kol1 [i] =0; OCH. kol2 [i] =0;

OCH. Obsluzh1 [i] =1;

OCH. Vib1 [i] =1;

OCH. TP [i] =0; OCH. TW [i] =0;

stat1 [i] =0;

stat2 [i] =0;

for (int k=0; k<1000; k++)

{

Kli [i]. num1 [k] =0; Kli [i]. time1 [k] =0; Kli [i]. timeVib [k] =0;

Kli2 [i]. num1 [k] =0; Kli2 [i]. time1 [k] =0; Kli2 [i]. timeVib [k] =0;

}

}

OCH. io1=0; OCH. io2=0;

Klient=0; Klient2=0;

bol=0;

}

LTimer1=SetTimer (ID_TIMER1,100,NULL);

UpdateData (FALSE);

}

void CSMODlg:: OnTimer (UINT uTime)

{

int i,n,tp;

float hr,min,sek;

char a [255] ;

time_t t;

srand ( (unsigned) time (&t));

COleSafeArray saRet;

DWORD numElements [] = {m_CountOch, 2};

saRet. Create (VT_R8, 2, numElements);

if (Klient2<=0 && bol! =0)

{ // очередь с первым приоритетом

i=0;

tp= (atof (m_Table. GetTextMatrix (1,3)) - atof (m_Table. GetTextMatrix (1,2))) *100;

Klient2= (rand ()%tp) *0.01+atoi (m_Table. GetTextMatrix (1,2));

++OCH. kol1 [i] ; // общее количество для аппарата

++OCH. o2 [i] ; // количество с данным приоритетом

if (m_Table2. GetRows () < (OCH. kol1 [i] +3))

{

m_Table2. SetRows (m_Table2. GetRows () +1); iTabl++;

}

tp= (atof (m_Table. GetTextMatrix (1,5)) - atof (m_Table. GetTextMatrix (1,4))) *100;

Kli2 [i]. time1 [OCH. o2 [i]] =Tm+ (rand ()%tp) *0.01+atoi (m_Table. GetTextMatrix (1,4));

float prim=Kli2 [i]. time1 [OCH. o2 [i]] ;

Kli2 [i]. timeVib [OCH. o2 [i]] =Tm+rand ()% (m_Vibiv-m_DoVib) +m_DoVib;

Kli2 [i]. num1 [OCH. o2 [i]] =OCH. kol1 [i] ;

// постановка в очередь

hr=floorf (Tm/60);

min=floorf (Tm-hr*60);

sek=floorf ( (Tm*100- (hr*60+min) *100) /60);

sprintf (a,"%2.0f:%2.0f:%2.0f",hr,min,sek);

m_Table2. SetTextMatrix (OCH. kol1 [i],1+i*4,a);

itoa (OCH. kol1 [i],a,10);

m_Table2. SetTextMatrix (OCH. kol1 [i], i*4,a);

if (stat1 [i] ==0&&stat2 [i] ==0)

{

m_Table2. SetTextMatrix (OCH. kol1 [i],3+i*4,"Выполняется");

OCH. CountObsl [i] =2;

Kli2 [i]. Stat [OCH. o2 [i]] =2;

stat2 [i] =1;

}

else

{

m_Table2. SetTextMatrix (OCH. kol1 [i],3+i*4,"Ожидает");

Kli2 [i]. Stat [OCH. o2 [i]] =1;

}

}

Klient2--;

bol=1;

if (Klient<=0)

{

// очередь со вторым приоритетом

int k;

if (bol==0)

i=rand ()%m_CountOch;

if (m_CountOch==1)

{i=0; }

else

{i=m_CountOch;

for (k= (m_CountOch-1); k>=0; k--)

{

if ( (OCH. kol1 [k] -OCH. Obsluzh1 [k]) <= (OCH. kol1 [i] -OCH. Obsluzh1 [i]))

i=k;

else i=i;

}if (i==m_CountOch) i=i-1;

}

++OCH. kol1 [i] ; // общее количество

++OCH. o1 [i] ; // количество с данным приоритетом

if (m_Table2. GetRows () < (OCH. kol1 [i] +3))

{

m_Table2. SetRows (m_Table2. GetRows () +1);

}

if ( (Tm>=480) && (Tm<720))

{

tp= (atof (m_Table. GetTextMatrix (2,3)) - atof (m_Table. GetTextMatrix (2,2))) *100;

Klient= (rand ()%tp) *0.01+atoi (m_Table. GetTextMatrix (2,2));

tp= (atof (m_Table. GetTextMatrix (2,5)) - atof (m_Table. GetTextMatrix (2,4))) *100;

Kli [i]. time1 [OCH. o1 [i]] =Tm+ (rand ()%tp) *0.01+atoi (m_Table. GetTextMatrix (2,4));

Kli [i]. timeVib [OCH. o1 [i]] =Tm+rand ()% (m_Vibiv-m_DoVib) +m_DoVib;

}else

if ( (Tm>=720) && (Tm<900))

{

tp= (atof (m_Table. GetTextMatrix (3,3)) - atof (m_Table. GetTextMatrix (3,2))) *100;

Klient= (rand ()%tp) *0.01+atoi (m_Table. GetTextMatrix (3,2));

tp= (atof (m_Table. GetTextMatrix (3,5)) - atof (m_Table. GetTextMatrix (3,4))) *100;

Kli [i]. time1 [OCH. o1 [i]] =Tm+ (rand ()%tp) *0.01+atoi (m_Table. GetTextMatrix (3,4));

Kli [i]. timeVib [OCH. o1 [i]] =Tm+rand ()% (m_Vibiv-m_DoVib) +m_DoVib;

}else

if ( (Tm>=900) && (Tm<1200))

{

tp= (atof (m_Table. GetTextMatrix (4,3)) - atof (m_Table. GetTextMatrix (4,2))) *100;

Klient= (rand ()%tp) *0.01+atof (m_Table. GetTextMatrix (4,2));

tp= (atof (m_Table. GetTextMatrix (4,5)) - atof (m_Table. GetTextMatrix (4,4))) *100;

Kli [i]. time1 [OCH. o1 [i]] =Tm+ (rand ()%tp) *0.01+atoi (m_Table. GetTextMatrix (4,4));

Kli [i]. timeVib [OCH. o1 [i]] =Tm+rand ()% (m_