Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Текст программы
.txtКод программы
TVTime : integer; // время поступления очередного TV на станцию
InputTV : integer; // очередь ожидающих проверки
WaitRepair : integer; // очередь ожидающих настройки
Tm : integer; // системное время
Masters : array[1..3] of integer; // список рабочих
// 1,2 - тестеры
// 3 - настройщик
a, i : integer;
MaxWarehous : integer; // оптимальное кол-во стеллажей
ProcStop : integer; // проверка остановки процесса
Rep : integer; // количество раз настраивалось
Accept : integer; // количество проиденых проверку
implementation
{$R *.dfm}
{функция определения времени настройки}
Function TimeRepair:integer;
var
deviation : integer;
begin
Randomize;
deviation:=random(3);
if (deviation=3)or(deviation=0) then deviation:=0;
if deviation=1 then deviation:=1;
if deviation=2 then deviation:=-1;
{deviation коэффициент отклонения}
TimeRepair:=30+deviation*10;
end;
{функция определения времени проверки}
Function TVTimeControl:integer;
var
deviation : integer;
begin
Randomize;
deviation:=random(3);
if (deviation=3)or(deviation=0) then deviation:=0;
if deviation=1 then deviation:=1;
if deviation=2 then deviation:=-1;
{deviation коэффициент отклонения}
TVTimeControl:=9+deviation*3;
end;
// функция определения времени поступления след. TV
// т.е. через сколько минут поступит
Function TVin: integer;
var
deviation : integer;
begin
Randomize;
deviation:=random(3);
if (deviation=3)or(deviation=0) then deviation:=0;
if deviation=1 then deviation:=1;
if deviation=2 then deviation:=-1;
TVin:=5+deviation*2;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// обнуление основных переменных
TVTime:=0;
Tm:=0;
MaxWarehous:=0;
InputTV:=0;
WaitRepair:=0;
// время поступления на станцию первого телека
TVtime:=TVTime+TVin;
// запуск процесса
Timer1.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Randomize;
Tm:=Tm+1; // увеличение шага времени
Label4.Caption:='Время: '+inttostr(tm)+' мин.';
{поступление телевизоров}
if Tm=TVtime then begin // если телек поступил то добавляем его в очередь
InputTV:=InputTV+1; // ожидающих проверки.
TVTime:=TVTime+TVin; // определяем время поступления следующего
end;
{процесс проверки и настройки}
// Ход выполнения действий мастерами
// Когда каждому мастеру назначается работа, то ему приписывается время на ее
// исполнение. В следующем блоке происходит проверка на завершение текущей
// работы по каждому мастеру. В процессе у каждого мастера вычитается одна
// минута (шаг времени) из назначенного ему времени.
For i:=1 to 3 do begin // просматриваем каждого мастера
// Далее ..
// Если в данный момент времени мастер-тестер завершит работу, то определяем
// состояние телека, если брак(ай-ай-ай, как не стыдно делать такое барахло)
// отправляем в очередь ожидающих настройки
// WaitRepair и подсчитываем на данный момент кол-во перенастроек Rep.
// Если годен, телек уходит со станции, подсчитываем на данный момент кол-во
// выпущенных телеков.
if ((i=1)or(i=2))and(Masters[i]-1=0) then begin
a:=random(99)+1; // состояние телека >15(85%)-good <=15(15%)- Bad
if a<=15 then begin
WaitRepair:=WaitRepair+1;
Rep:=Rep+1;
end else // если >15 то выпускаем телек
accept:=accept+1;
end;
if (i=3)and(Masters[3]-1=0) then begin // смотрим на настройщика
// если сделал работу, отправляем
// телек в очередь ожидающих
// проверки для перепроверки
InputTV:=InputTV+1;
end;
// выполнение работы мастерами
if Masters[i]-1>=0 then Masters[i]:=Masters[i]-1;
end;
// Если мастер-настройщик свободен и очередь телеков ожидающих настройки
// есть, нагружаем его работой (пусть пашет, нефига курить да пиво попивать).
if masters[3]=0 then begin
if WaitRepair>0 then begin
masters[3]:=TimeRepair; // определяем время на выполнение работы
WaitRepair:=WaitRepair-1; // очередь телеков ожидающих настройки
// уменьшается.
end;
end;
{загрузка мастеров-тестеров работой}
// Аналогично мастеру-настройщику нагружаем работенкой мастеров-тестеров
// пущай поработают, работа у них не сложная, не долгая, но частая.
For i:=1 to 2 do begin
if (masters[i]=0)and(InputTV>0) then begin
InputTV:=InputTV-1; // Если он свободен (один из двух, по определению)
Masters[i]:=TVTimeControl; // и очередб телеков ожидающих проверку есть,
// то работничку-тестеру назначаем время на
// выполнение этой архи-трудной и мега-важной
// супер работы. B очередь уменьшаем.
end;
end;
// Определение оптимального кол-ва стеллллажей.
// Складываем две очереди и если сумма больше максимальной суммы
// на предыдущих шагах (имеется в виду раннее время), то значит произошли
// изменения в кол-ве стеллажей. Следовательно предыдущее значение уже не
// оптимальное. А поэтому счетчик остановки поиска снова устанавливаем равным
// значению N, которое указали в самом начале в соответствующем окошке.
if InputTV+WaitRepair>MaxWarehous then begin
MaxWarehous:=InputTV+WaitRepair;
ProcStop:=strtoint(Edit1.text);
end else ProcStop:=ProcStop-1; // ..а вот если счетчик вдруг стал равен нулю,
// то это значит, что спустя N минут не произошло
// увеличение кол-ва стеллажей.
// Процесс останавливаем и говорим Поколодину
// Все тип-топ. Оптимальное кол-во стеллажей = MaxWareHous. Где отл в зачетке?
// Далее, это к модели не имеет отношения выводи результаты в соответствующие
// поля, окошки и т.д.
label1.Caption:='Оптимальное кол-во стеллажей '+inttostr(MaxWarehous);
Tin.Position:=InputTV;
Wt.Position:=WaitRepair;
Label2.Caption:='Ожидает проверки '+inttostr(InputTV)+' шт.';
Label3.Caption:='Ожидает настроики '+inttostr(WaitRepair)+' шт.';
if ProcStop=0 then begin
Timer1.Enabled:=false;
Label9.Caption:='Процесс моделирования завершен.';
end;
end;
end.
// Оооох, вроде ничего не забыл.
// Ну, соответственно, желаю тебе удачи на защите, а так если что звони,
// спрашивай, не стесняйся.
// Да, главное не забудь удалить всякую пургу, которую я здесь понаписал.
// А то Поколодин здорово повеселиться. Я ведь ее писал потому что опух сидеть
// и работать в тоске и печали.
//
// С уважением Регентов Алексей.
Соседние файлы в предмете Математические основы информатики и моделирования