Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Текст программы

.txt
Скачиваний:
6
Добавлен:
19.04.2013
Размер:
6.87 Кб
Скачать

Код программы

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.

// Оооох, вроде ничего не забыл.
// Ну, соответственно, желаю тебе удачи на защите, а так если что звони,
// спрашивай, не стесняйся.

// Да, главное не забудь удалить всякую пургу, которую я здесь понаписал.
// А то Поколодин здорово повеселиться. Я ведь ее писал потому что опух сидеть
// и работать в тоске и печали.
//
// С уважением Регентов Алексей.