|
Моделирование системы массового обслуживания |
корость моделирования - характеристика, определяющая скорость моделирования. Минимальное значение равно 1 и соответствует реальной скорости. Введенное значение определяет, сколько секунд моделирования выполняется за одну секунду реального времени. Максимальное значение равно 1000.После того как введены параметры работы системы, необходимо нажать на кнопку "СТАРТ", для начала процесса моделирования. Изображение окна в процессе моделирования изображено на рисунке 2.При установке флажка, т.е. при включении функции "Ограничить время" внизу появляется StatusBar, на котором отображается, сколько всего от общего времени уже прошло. Справа расположено изображение телевизора, картинка в "телевизоре" меняется каждые 100 единиц времени. Синим цветом обозначена надпись о том, сколько всего человек уже прошло, зеленым - время моделирования, ниже находятся данные по состоянию каждого турникета: занят или свободен, если занят, то какова очередь.Рисунок 2. Главное окно программы в процессе моделированияНа второй вкладке "Результаты" в процессе моделирования можно наблюдать работу турникетов на изменяющейся диаграмме, на ней показана производительность в процентах от общей работы каждого турникета. После остановки моделирования слева появляется отчет по эксперименту. В меню "Настройки" "Результатов" можно выбрать "вывод результатов в отдельном окне".Рисунок 3. Вкладка "Результаты"При повторных экспериментах моделирования результаты отображаются в этом же окне, но ниже, что позволяет производить сравнение. Но в меню "Настройки", выбрав команду "Результатов" можно также отключить показания предыдущих результатов. Отчет можно сохранить, по умолчанию это будет текстовый файл (*. txt). Сохранение отчета можно произвести, нажав на одну из кнопок сохранения отчета: на панели инструментов, в меню "Файл".Если у пользователя возникают вопросы по работе с программой, при нажатии кнопки F1, см. рисунок 4, или выбора соответствующей команды в меню "Справка", запускается окно руководства пользователя.Рисунок 4. Окно "Справка"ЗаключениеВ ходе работы была создана программа, позволяющая моделировать систему массового обслуживания: проход зрителей на стадион. Программа позволяет производить анализ деятельности системы в целом и тем самым подсчитать количество необходимых аппаратов обслуживания для наиболее эффективной работы системы. В программе предусмотрена возможность изменения практически всех параметров и настроек: задания времени обслуживания и появления зрителей, их общее количество, время моделирования.Программа позволяет сохранять результаты экспериментов в файл, что тоже сопутствует проведению исследования. Написанное программное средство в ходе моделирования визуально показывает пользователю основные параметры системы. Если у пользователя возникают вопросы по работе с программой, нажатие клавиши F1 позволяет вызвать подробную справку, что делает программу понятной для любого пользователя.Проводя исследования работы данной системы, можно опираться на то, что при свободных аппаратах обслуживания, зритель идет в первый свободный аппарат, что позволяет определить загруженность системы по работе последнего аппарата и среднего времени проведенному зрителями в очереди. Если система работает не в полную силу, то по диаграмме "Выполнение заявок" видно, что большая часть заявок обслуживается первым аппаратом, а длина очереди стремится к нулю. Показатель эффективности последнего аппарата при этом тоже остается низким. Пример не эффективной работы системы приведен на рисунке 6. Если же количество аппаратов обслуживания мало, и аппараты не успевают справляться с поступающими заявками, то система перегружена, и зрители подолгу находятся в очередях. Показатели эффективности работы всех аппаратов стремятся к 100%, а количество обслуженных аппаратами заявок приблизительно равно. Пример перегруженной системы приведен на рисунке 7. Наиболее эффективная работа системы достигается при эффективности последнего аппарата обслуживания, равной приблизительно 80%, и среднем времени нахождения в очереди менее 10 секунд. Пример эффективной работы системы приведен на рисунке 8.Каждый пользователь, проводя исследование, сам решает какое количество аппаратов обслуживания ему необходимо для нормального функционирования системы.Рисунок 6. Пример не эффективной работы системыРисунок 7. Пример перегруженной работы системы.Рисунок 8. Пример эффективной работы системыСписок использованных источников Лифшиц А.Л. Статистическое моделирование СМО, М., 1978. Советов Б.А., Яковлев С.А. Моделирование систем, М: Высшая школа, 1985. Гмурман В.Е. Теория вероятностей и математическая статистика, М: Высшая школа, 2001. Пригодин Н.В. Системный подход в моделировании. М., 1986. ПриложениеProcedure TForm1. Show_Report;VarI: Integer;BeginIf Form3. CheckBox1. Checked=truethen beginMemo1. Clear;Form4. Memo1. Clear;end;if Form3. RadioButton2. Checked=true thenBEGINFor i: =1 to Turn_Count DoTurnikets [i]. Lab. Free;Memo1. Lines. Add ('Эксперимент №: '+IntToStr (Eksp));Memo1. Lines. Add ('Общее время моделирования: '+IntToStr (Time));Memo1. Lines. Add ('Прошло зрителей: '+IntToStr (Count_Of_F_People));Memo1. Lines. Add ('Из них гостей: '+ IntToStr (G_Count));Memo1. Lines. Add ('Максимальная длина очереди: '+IntToStr (Max_Queue));Memo1. Lines. Add ('Средняя длина очереди: '+FloatToStrF (AverageQueue,ffFixed,2,2));Memo1. Lines. Add (' ');Memo1. Lines. Add ('Количество заявок');For i: =1 to Turn_Count DoMemo1. Lines. Add ('Турникет №'+IntToStr (I) +': '+IntToStr (Turnikets [i]. Zayavki));Memo1. Lines. Add (' ');Memo1. Lines. Add ('Время работы');For i: =1 to Turn_Count DoMemo1. Lines. Add ('Турникет №'+IntToStr (I) +': '+IntToStr (Turnikets [i]. Rabota));Memo1. Lines. Add (' ');Memo1. Lines. Add ('Время простоя');For i: =1 to Turn_Count DoMemo1. Lines. Add ('Турникет №'+IntToStr (I) +': '+IntToStr (Turnikets [i]. Prostoy));Memo1. Lines. Add ('***********************************');Memo1. Lines. Add (' ');Memo1. Visible: =True;Memo1. ReadOnly: =True;ENDelse // вывод в отдельном окнеBEGINForm4. Show;For i: =1 to Turn_Count DoTurnikets [i]. Lab. Free;Form4. Memo1. Lines. Add ('Эксперимент №: '+IntToStr (Eksp));Form4. Memo1. Lines. Add ('Общее время моделирования: '+IntToStr (Time));Form4. Memo1. Lines. Add ('Прошло зрителей: '+IntToStr (Count_Of_F_People));Form4. Memo1. Lines. Add ('Из них гостей: '+ IntToStr (G_Count));Form4. Memo1. Lines. Add ('Максимальная длина очереди: '+IntToStr (Max_Queue));Form4. Memo1. Lines. Add ('Средняя длина очереди: '+FloatToStrF (AverageQueue,ffFixed,2,2));Form4. Memo1. Lines. Add (' ');Form4. Memo1. Lines. Add ('Количество заявок');For i: =1 to Turn_Count DoForm4. Memo1. Lines. Add ('Турникет №'+IntToStr (I) +': '+IntToStr (Turnikets [i]. Zayavki));Form4. Memo1. Lines. Add (' ');Form4. Memo1. Lines. Add ('Время работы');For i: =1 to Turn_Count DoForm4. Memo1. Lines. Add ('Турникет №'+IntToStr (I) +': '+IntToStr (Turnikets [i]. Rabota));Form4. Memo1. Lines. Add (' ');Form4. Memo1. Lines. Add ('Время простоя');For i: =1 to Turn_Count DoForm4. Memo1. Lines. Add ('Турникет №'+IntToStr (I) +': '+IntToStr (Turnikets [i]. Prostoy));Form4. Memo1. Lines. Add ('***********************************');Form4. Memo1. Lines. Add (' ');Form4. Memo1. Visible: =True;Form4. Memo1. ReadOnly: =True;END;End;Procedure TForm1. Add_G;Vari, Min,Min_i: Integer;BeginMin: =Turnikets [1]. Queue_Len;Min_i: =1;For i: =2 To Turn_Count DoBeginif Turnikets [i]. Queue_Len<Min ThenBeginMin: =Turnikets [i]. Queue_Len;Min_i: =i;End;End;Inc (Turnikets [Min_i]. Queue_Len);If Turnikets [Min_i]. Queue_Len>Max_Queue Then Max_Queue: =Turnikets [Min_i]. Queue_Len;For i: =Turnikets [Min_i]. Queue_Len DownTo 2 doBeginTurnikets [Min_i]. Queue [i]: =Turnikets [Min_i]. Queue [i-1] ;End;Turnikets [Min_i]. Queue [1]. Status: =1; // 1-ый в очередиTurnikets [Min_i]. Queue [1]. T_in_Queue: =0;if Turnikets [Min_i]. Status=False ThenTurnikets [Min_i]. R_Obsl: =TimeRandom (G_ServeMin,G_ServeMax);Turnikets [Min_i]. Status: =True;Inc (G_Count);End;Procedure TForm1. Add_4el;Vari, Min,Min_i: Integer;BeginMin: =Turnikets [1]. Queue_Len;Min_i: =1;For i: =2 To Turn_Count DoBeginif Turnikets [i]. Queue_Len<Min ThenBeginMin: =Turnikets [i]. Queue_Len;Min_i: =i;End;End;Inc (Turnikets [Min_i]. Queue_Len);If Turnikets [Min_i]. Queue_Len>Max_Queue Then Max_Queue: =Turnikets [Min_i]. Queue_Len;Turnikets [Min_i]. Queue [Turnikets [Min_i]. Queue_Len]. Status: =0;Turnikets [Min_i]. Queue [Turnikets [Min_i]. Queue_Len]. T_in_Queue: =0;if Turnikets [Min_i]. Status=False ThenTurnikets [Min_i]. R_Obsl: =TimeRandom (ServeMin,ServeMax);Turnikets [Min_i]. Status: =True;End;Function TForm1. TimeRandom;BeginResult: =Random (Max-Min+1) +Min;End;Procedure TForm1. Refresh;VarI: Integer;BeginFor i: = 1 to Ap_Cnt doBeginTurnikets [i]. Queue_Len: =0;Turnikets [i]. T_Obsl: =0;Turnikets [i]. R_Obsl: =0;Turnikets [i]. Status: =False;Turnikets [i]. Zayavki: =0;Turnikets [i]. Rabota: =0;Turnikets [i]. Prostoy: =0;Turnikets [i]. Lab: =TLabel. Create (PageControl1);Turnikets [i]. Lab. Left: =7;Turnikets [i]. Lab. Top: =140+i*20;(PageControl1 as TPageControl). Pages [0]. InsertControl (Turnikets [i]. Lab);End;End;Function TForm1. Zna4_Read;VarZn: Integer;BeginTryZn: =StrToInt (ET. Text);ExceptShowMessage ('Значение поля некорректно!!! ');End;if Zn<Min Then Zn: =Min;if Zn>Max Then Zn: =Max;ET. Text: =IntToStr (Zn);Result: =Zn;End;procedure TForm1. Timer1Timer (Sender: TObject);VarI,J: Integer; // s: string;beginChart1. Series [0]. Clear;Inc (Time);Label17. Caption: ='Время моделировния '+IntToStr (Time);Inc (Time_4el);Inc (Time_Guest);inc (k); // kartinkaif (k=100) and (change=true) thenbegininc (kartinka);Image1. Picture. LoadFromFile (s+inttostr (kartinka) +'. jpg');k: =0;if kartinka=11 thenkartinka: =1;end;if Time_4el=Random_4el Then // Зритель пришелBeginAdd_4el;Random_4el: =TimeRandom (ComeMin,ComeMax);Time_4el: =0;End;if Time_Guest=Random_Guest Then // Гость пришелBeginAdd_G;Random_Guest: =TimeRandom (G_ComeMin,G_ComeMax);Time_Guest: =0;End;For I: =1 to Turn_Count DoBeginFull_Queue_Len: =Full_Queue_Len+Turnikets [i]. Queue_Len;If Turnikets [i]. Status ThenBeginInc (Turnikets [i]. Rabota);Turnikets [i]. Lab. Caption: ='ТУРНИКЕТ №'+IntToStr (i) +' занят ';Turnikets [i]. Lab. Caption: =Turnikets [i]. Lab. Caption+' '+'Очередь '+IntToStr (Turnikets [i]. Queue_Len-1);EndElseBeginInc (Turnikets [i]. Prostoy);Turnikets [i]. Lab. Caption: ='ТУРНИКЕТ №'+IntToStr (i) +' свободен ';Turnikets [i]. Lab. Caption: =Turnikets [i]. Lab. Caption+' '+'Очередь '+IntToStr (Turnikets [i]. Queue_Len);End;If Turnikets [i]. Status ThenBeginInc (Turnikets [i]. T_Obsl);If Turnikets [i]. T_Obsl=Turnikets [i]. R_Obsl Then // Закончено время обслуживанияBeginInc (Turnikets [i]. Zayavki);Turnikets [i]. T_Obsl: =0;Inc (Count_Of_F_People);Dec (Turnikets [i]. Queue_Len);For J: =1 To Turnikets [i]. Queue_Len DoTurnikets [i]. Queue [j]: =Turnikets [i]. Queue [j+1] ;if Turnikets [i]. Queue_Len=0 Then // больше никого нет. ОжиданиеBeginTurnikets [i]. Status: =False;Turnikets [i]. R_Obsl: =0;EndElseBeginIf Turnikets [i]. Queue [1]. Status=0 ThenBeginTurnikets [i]. R_Obsl: =TimeRandom (ServeMin,ServeMax);EndElseBeginTurnikets [i]. R_Obsl: =TimeRandom (G_ServeMin,G_ServeMax);End;End;End;End;Chart1. Series [0]. Add (turnikets [i]. Zayavki,'');if Edit12. Visible=true thenProgressBar1. Position: =Time;End;If ( (Edit12. Visible=true) and (Time=SetTime)) or // КОНЕЦ!!!(Count_Of_F_People=People_Count) ThenBeginTimer1. Enabled: =False;Button2. Enabled: =false;ToolButton1. Enabled: =false;ToolButton2. Enabled: =true; // SaveN21. Enabled: =true;Button3. Enabled: =true;AverageQueue: =Full_Queue_Len/ (Time*Turn_Count);Show_Report;End;Label_Count_4el. Font. Color: =ClBlue;Label_Count_4el. Caption: ='Прошло человек '+IntToStr (Count_Of_F_People);end;procedure TForm1. FormCreate (Sender: TObject);beginRandomize;Time: =0;G_Count: =0;Turn_Count: =0;Count_Of_F_People: =0;Max_Queue: =0;Full_Queue_Len: =0;AverageQueue: =0;Time_4el: =0;Random_4el: =0;Time_Guest: =0;Random_Guest: =0;PageControl1. Pages [1]. TabVisible: =false;PageControl1. TabIndex: =0;end;procedure TForm1. MenuItem4Click (Sender: TObject);beginClose;end;procedure TForm1. ToolButton3Click (Sender: TObject);beginClose;end;procedure TForm1. N1Click (Sender: TObject);beginChange: =true;N1. Checked: =true;N1. Default: =true;N2. Checked: =false;N2. Default: =false;end;procedure TForm1. N2Click (Sender: TObject);beginchange: =false;N2. Checked: =true;N2. Default: =true;N1. Checked: =false;N1. Default: =false;end;procedure TForm1. CheckBox1Click (Sender: TObject);beginif CheckBox1. Checked=truethenbeginEdit12. Visible: =true;ComboBox1. Visible: =true;endelsebeginEdit12. Visible: =false;ComboBox1. Visible: =false;end;end;procedure TForm1. Na4aloExecute (Sender: TObject);beginInc (Eksp);FormCreate (Button1. NewInstance);ComeMin: =Zna4_READ (Edit2,1, 20);ComeMax: =Zna4_Read (Edit3,ComeMin,ComeMin+50);ServeMin: =Zna4_READ (Edit4,1, 20);ServeMax: =Zna4_Read (Edit5,ServeMin,ServeMin+50);G_ComeMin: =Zna4_READ (Edit6,1, 200);G_ComeMax: =Zna4_Read (Edit7,ComeMin,ComeMin+200);G_ServeMin: =Zna4_READ (Edit9,1,100);G_ServeMax: =Zna4_Read (Edit8,ServeMin,ServeMin+100);Turn_Count: =Zna4_Read (Edit10,1,100);People_Count: =Zna4_Read (Edit1,10,10000);Speed: =Zna4_Read (Edit11,1,1000);Timer1. Interval: =1000 div Speed;Refresh (Turn_Count);Random_4el: =TimeRandom (ComeMin,ComeMax);Random_Guest: =TimeRandom (G_ComeMin,G_ComeMax);Timer1. Enabled: =True;change: =true;if Edit12. Visible=true thenbeginif ComboBox1. ItemIndex=0 thenSetTime: =Zna4_READ (Edit12,10,43200);if ComboBox1. ItemIndex=1 thenSetTime: =Zna4_READ (Edit12,1,720) *60;if ComboBox1. ItemIndex=2 thenSetTime: =Zna4_READ (Edit12,1,12) *3600;end;ProgressBar1. Position: =0;if Edit12. Visible=true thenProgressBar1. Max: =SetTimeelseProgressBar1. Max: =0;ToolButton2. Enabled: =false;Button3. Enabled: =false;N21. Enabled: =false;ToolButton1. Enabled: =true;Button2. Enabled: =true;end;procedure TForm1. StopExecute (Sender: TObject);beginTimer1. Enabled: =false;show_report;ToolButton2. Enabled: =true;Button3. Enabled: =true;N21. Enabled: =true;ToolButton1. Enabled: =false;Button2. Enabled: =false;end;procedure TForm1. MenuItem11Click (Sender: TObject);beginForm2. Show;end;procedure TForm1. SaveExecute (Sender: TObject);beginIf SaveDialog1. Execute thenMemo1. Lines. SaveToFile (SaveDialog1. FileName);end;procedure TForm1. createExecute (Sender: TObject);vari: byte;beginif Button2. Enabled=true thenfor i: =1 to Turn_Count doTurnikets [i]. Lab. Free; // Turnikets [i]. Lab. Caption: ='';Label17. Caption: ='';Label_Count_4el. Caption: ='';Randomize;Time: =0;G_Count: =0;Turn_Count: =0;Count_Of_F_People: =0;Max_Queue: =0;Full_Queue_Len: =0;AverageQueue: =0;Time_4el: =0;Random_4el: =0;Time_Guest: =0;Random_Guest: =0;Refresh (Turn_Count);Timer1. Enabled: =false;for i: =1 to Turn_Count doTurnikets [i]. Lab. Visible: =false;ProgressBar1. Position: =0;Chart1. Series [0]. Clear;end;procedure TForm1. SpeedButton1Click (Sender: TObject);beginPageControl1. Pages [1]. TabVisible: =false;PageControl1. ActivePage: =PageControl1. Pages [0] ;end;procedure TForm1. SettingsExecute (Sender: TObject);beginForm3. Show;end;procedure TForm1. VisibleSettingsExecute (Sender: TObject);beginPageControl1. Pages [1]. TabVisible: =true;PageControl1. TabIndex: =1;end;procedure TForm1. FormShow (Sender: TObject);begins: =GetCurrentDir+'\';end;procedure TForm1. HelpExecute (Sender: TObject);beginwinhelp (Form1. Handle,'справка. hlp',help_context,1);end;end.
Страницы: 1, 2
|
|
|
© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент. |
|
|