Разработка имитационной модели системы массового обслуживания
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
?ь". Во время работы программы текущие результаты отображаются в таблице (рис.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
Заключение
Результатом работы над данным курсовым проектом стала программа, моделирующая систему массового обслуживания - магазин. При помощи данной программы можно делать выводы о работе системы, выбирать оптимальное количество аппаратов обслуживания для хорошей работы. Программное средство в ходе моделирования визуально показывает пользователю текущие результаты работы системы.
Список использованных источников
- Лифшиц А.Л. Статистическое моделирование СМО, М., 1978.
- Советов Б.А., Яковлев С.А. Моделирование систем, М: Высшая школа, 1985.
- Гмурман В.Е. Теория вероятностей и математическая статистика, М: Высшая школа, 2001.
- Пригодин Н.В. Системный подход в моделироании М., 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_