Рисунок 3. Меню программы
Здесь вы можете запустить или остановить процесс моделирования, выйти из программы, а также вызвать форму "О программе" (рисунок 4).
Рисунок 4. Форма "О программе"
Эксперимент №1
Количество аппаратов 50
Длительность процесса 1 день
Пришло покупателей 424
Покупателей обслужено 424
Общая полезность системы 100%
Количество использованных аппаратов 9
Примечание: нерационально большое количество аппаратов - большая часть из них попросту простаивает.
Эксперимент №2
Количество аппаратов 10
Длительность процесса 1 день
Пришло покупателей 427
Покупателей обслужено 427
Общая полезность системы 100%
Количество использованных аппаратов 9
Эксперимент №3
Количество аппаратов 9
Длительность процесса 1 день
Пришло покупателей 424
Покупателей обслужено 424
Общая полезность системы 100%
Количество использованных аппаратов 9
Примечание: дальнейшее уменьшение количества аппаратов ведет к падению полезности системы - аппаратов на всех не хватает и покупатели уходят.
Вывод: Так как в каждом из трех экспериментов количество использованных аппаратов было 9, то оптимальное количество аппаратов, необходимых для обслуживания покупателей с периодичностью прихода с 8 до 12 - 3-7 минут, с 12 до 15 - 2-4 минуты, с 15 до 20 часов - 1-2 минуты, без создания очереди равняется 9.
В ходе работы была создана программа, позволяющая моделировать систему массового обслуживания “Магазин". Практически в данном курсовом проекте была реализована функциональная модель, позволяющая прослеживать изменения поведения, состояния системы.
Из проведенного исследования видно, что система является эффективной.
В результате работы была выработана способность системного рассмотрения проблем и задач, а также методов их решения.
1. Лифшиц А.Л. Статистическое моделирование СМО, М., 1978.
2. Советов Б.А., Яковлев С.А. Моделирование систем, М: Высшая школа, 1985.
3. Гмурман В.Е. Теория вероятностей и математическая статистика, М: Высшая школа, 2001.
4. Пригодин Н.В. Системный подход в моделироании. М., 1986.
unitUnit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, Menus, Grids;
type
TForm1 = class (TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
TrackBar3: TTrackBar;
GroupBox1: TGroupBox;
TrackBar5: TTrackBar;
TrackBar6: TTrackBar;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
GroupBox2: TGroupBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
GroupBox4: TGroupBox;
Label6: TLabel;
Label11: TLabel;
Label12: TLabel;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Edit10: TEdit;
Edit11: TEdit;
Edit12: TEdit;
TrackBar7: TTrackBar;
Label10: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Shape1: TShape;
Label23: TLabel;
Label4: TLabel;
Label5: TLabel;
Label24: TLabel;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
procedure Timer1Timer (Sender: TObject);
procedure Button1Click (Sender: TObject);
procedure FormCreate (Sender: TObject);
procedure ClientAppear (Sender: TObject);
procedure Button2Click (Sender: TObject);
procedure statistic (Sender: TObject);
procedure Apparat (Sender: TObject);
procedure TrackBar1Change (Sender: TObject);
procedure TrackBar2Change (Sender: TObject);
procedure TrackBar3Change (Sender: TObject);
procedure TrackBar5Change (Sender: TObject);
procedure TrackBar6Change (Sender: TObject);
procedure TrackBar7Change (Sender: TObject);
procedure CroudP (Sender: TObject);
procedure N4Click (Sender: TObject);
procedure N2Click (Sender: TObject);
procedure N3Click (Sender: TObject);
procedure N6Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
S,FA,min,hour,day,minmax,daymax,hourmax,client,croudcount,cleft: integer;
app: array [1. .50] of boolean;
apptime: array [1. .50] of byte;
obsl,appworktime: array [1. .50] of integer;
croud: array [1. .30] of boolean;
croudtime: array [1. .30] of byte;
implementation
uses Unit2;
{$R *. dfm}
procedure TForm1. Timer1Timer (Sender: TObject);
var i,j: integer;
begin
randomize;
s: =0;
for i: =1 to trackbar1. Position do
begin
if app [i] =false then
begin
for j: =1 to trackbar2. Position do
begin
if croud [j] =true then
begin
croud [j]: =false;
app [i]: =true;
apptime [i]: =random (6) +10;
break
end;
end;
break
end;
end;
for i: =1 to trackbar1. Position do
begin
if app [i] =true then
begin
apptime [i]: =apptime [i] -1;
if apptime [i] =0 then
begin
app [i]: =false;
obsl [i]: =obsl [i] +1;
end;
end;
end;
if client=0 then
begin
clientappear (Sender);
apparat (Sender);
end;
for j: =1 to trackbar2. Position do
begin
if croud [j] =true then
begin
croudtime [j]: =croudtime [j] -1;
if croudtime [j] =0 then
begin
croud [j]: =false;
cleft: =cleft+1;
end;
end;
end;
if croud [1] =false then
begin
for j: =1 to trackbar2. Position-1 do
begin
croud [j]: =croud [j+1] ;
croudtime [j]: =croudtime [j+1] ;
end;
croud [trackbar2. Position]: =false;
end;
for i: =1 to trackbar1. Position do
begin
if app [i] =true then appworktime [i]: =appworktime [i] +1;
end;
client: =client-1;
min: =min+1;
if min>59 then
begin
min: =0;
hour: =hour+1;
end;
if hour>19 then
begin
hour: =8;
day: =day+1;
for i: =1 to trackbar1. Position do
begin
if apptime [i] >0 then obsl [i]: =obsl [i] +1;
apptime [i]: =0;
app [i]: =false;
end;
for j: =1 to trackbar2. Position do
begin
croudtime [j]: =0;
croud [j]: =false;
croudcount: =0;
end;
end;
if length (inttostr (min)) <2 then
label5. Caption: =inttostr (hour) +': 0'+inttostr (min)
else label5. Caption: =inttostr (hour) +': '+inttostr (min);
label24. Caption: ='День: ' + inttostr (day);
statistic (sender);
if (day=daymax) and (hour=hourmax) and (min=minmax)
then Button2Click (Sender);
end;
procedure TForm1. ClientAppear (Sender: TObject);
begin
randomize;
case (hour) of
8. .11: Client: =random (strtoint (edit10. Text) - strtoint (edit7. Text)) +strtoint (edit7. Text);
12. .14: Client: =random (strtoint (edit11. Text) - strtoint (edit8. Text)) +strtoint (edit8. Text);
15.19: Client: =random (strtoint (edit12. Text) - strtoint (edit9. Text)) +strtoint (edit9. Text);
end;
end;
procedure TForm1. Apparat (Sender: TObject);
var i: integer;
begin
FA: =0;
randomize;
for i: =1 to trackbar1. Position do
begin
if app [i] =false then
begin
FA: =FA+1;
app [i]: =true;
apptime [i]: =random (7) +3;
break
end;
end;
if FA=0 then CroudP (sender);
end;
procedure TForm1. CroudP (Sender: TObject);
var j,k: integer;
begin
k: =0;
for j: =1 to trackbar2. Position do
begin
if croud [j] =false then
begin
k: =k+1;
croud [j]: =true;
croudtime [j]: =trackbar3. Position;
break
end;
end;
if k=0 then cleft: =cleft+1;
end;
procedure TForm1. statistic (Sender: TObject);
var stat: string;
i,j: integer;
begin
croudcount: =0;
for i: =1 to trackbar1. Position do
begin
stringgrid1. Cells [0, i-1]: ='';
s: =s+obsl [i] ;
if app [i] =true then stat: ='Занят (осталось '+inttostr (apptime [i]) + ' мин) '
else stat: ='Аппарат№'+inttostr (i) +': Свободен';
stringgrid1. Cells [0, i-1]: =stat;
stringgrid2. Cells [0, i-1]: = ('Аппарат №'+inttostr (i) +': обслужено '+inttostr (obsl [i]) +'; время работы '+inttostr (appworktime [i]));
end;
for j: =1 to trackbar2. Position do
begin
if croud [j] =true then
croudcount: =croudcount+1;
end;
label17. Caption: =inttostr (croudcount);
label23. Caption: ='Ушло покупателей: ' + inttostr (cleft);
label18. Caption: ='Всего обслужено: ' + inttostr (S);
end;
procedure TForm1. Button1Click (Sender: TObject);
var i: integer;
begin
stringgrid1. RowCount: =trackbar1. Position;
stringgrid2. RowCount: =trackbar1. Position;
trackbar1. Enabled: =false;
trackbar2. Enabled: =false;
trackbar3. Enabled: =false;
trackbar5. Enabled: =false;
trackbar6. Enabled: =false;
edit1. Enabled: =false;
edit7. Enabled: =false;
edit8. Enabled: =false;
edit9. Enabled: =false;
edit10. Enabled: =false;
edit11. Enabled: =false;
edit12. Enabled: =false;
button1. Enabled: =false;
n2. Enabled: =false;
n3. Enabled: =true;
button2. Enabled: =true;
daymax: =strtoint (edit1. text);
hourmax: =trackbar5. Position+8;
minmax: =trackbar6. Position;
client: =0;
cleft: =0;
S: =0;
timer1. Enabled: =true;
for i: =1 to 50 do
begin
stringgrid2. Cells [0, i-1]: ='';
end;
for i: =1 to trackbar1. Position do
begin
apptime [i]: =0;
obsl [i]: =0;
appworktime [i]: =0;
end;
label5. Caption: ='8: 00';
timer1. Interval: =round (1000/ (Trackbar7. Position));
min: =0;
hour: =8;
day: =0;
for i: =1 to trackbar1. Position do
begin
app [i]: =false;
end;
for i: =1 to trackbar2. Position do
begin
croud [i]: =false;
croudtime [i]: =0;
end;
statistic (Sender);
end;
procedure TForm1. FormCreate (Sender: TObject);
begin
timer1. Enabled: =false;
button2. Enabled: =false;
n3. Enabled: =false;
end;
procedure TForm1. Button2Click (Sender: TObject);
begin
n3. Enabled: =false;
n2. Enabled: =true;
timer1. Enabled: =false;
button2. Enabled: =false;
button1. Enabled: =true;
trackbar1. Enabled: =true;
trackbar2. Enabled: =true;
trackbar3. Enabled: =true;
trackbar5. Enabled: =true;
trackbar6. Enabled: =true;
edit1. Enabled: =true;
edit7. Enabled: =true;
edit8. Enabled: =true;
edit9. Enabled: =true;
edit10. Enabled: =true;
edit11. Enabled: =true;
edit12. Enabled: =true;
end;
procedure TForm1. TrackBar1Change (Sender: TObject);
begin
edit4. Text: =inttostr (TrackBar1. position);
end;
procedure TForm1. TrackBar2Change (Sender: TObject);
begin
edit5. Text: =inttostr (TrackBar2. position);
end;
procedure TForm1. TrackBar3Change (Sender: TObject);
begin
edit6. Text: =inttostr (TrackBar3. position);
end;
procedure TForm1. TrackBar5Change (Sender: TObject);
begin
edit2. Text: =inttostr (TrackBar5. position);
end;
procedure TForm1. TrackBar6Change (Sender: TObject);
begin
edit3. Text: =inttostr (TrackBar6. position);
end;
procedure TForm1. TrackBar7Change (Sender: TObject);
begin
timer1. Interval: =round (1000/ (Trackbar7. Position));
end;
procedure TForm1. N4Click (Sender: TObject);
begin
close;
end;
procedure TForm1. N2Click (Sender: TObject);
begin
button1. Click;
end;
procedure TForm1. N3Click (Sender: TObject);
begin
button2. Click;
end;
procedure TForm1. N6Click (Sender: TObject);
begin
form2. Show;
end;
end.