m
|
σ
|
Число точек дискритизации
|
xmin
|
xmax
|
Критерий Пирсона
|
|
|
|
|
|
P
|
60
|
4
|
20
|
46,47
|
74,19
|
10,15
|
Генератор возьмем на основе конгруэнтного метода.
3.3.3
Тестирование по корреляционному моменту
Позволяет проверить независимость элементов случайной последовательности.
Это необходимо, поскольку программный генератор случайных чисел может
“зацикливаться” с некоторым интервалом апериодичности. В таблице 4 приведены
вероятности независимости последовательности элементов при различных методах
генерирования случайной величины для разных математических ожиданий и
дисперсий.
В результате тестирования по корреляционному моменту было замечено что
генерируемые случайные величины независимы с вероятностью не менее чем 0,858.
Таким образом, на основании результата тестирования генераторов случайных
независимых величин можно заключить, что наиболее приемлемым является генератор
в котором для генерирования равномерно распределенной случайной величины
используется конгруэнтный метод. Этот вид генератора будет в дальнейшем
использован в имитационной модели.
Рис.7.
Тестирование генератора случайных величин с нормальным законом распределения
3.4 Моделирование СМО в условиях
случайных
изменений параметров
Фрагмент моделирования для модели, работающей в условиях случайных изменений
параметров, приведен в таблице 2.
моделирование имитационный тестирование оптимизация
Таблица 2
4. Моделирование случайных процессов
В данном
разделе курсовой работы делаем уточнение имитационной модели СМО посредством
моделирования возмущающих воздействий, действующих на реальную сложную систему.
.1 Корреляционная функция
стационарного случайного процесса
Для
моделирования случайного стационарного процесса надо прежде всего задать
корреляционную функцию процесса, которая отражает степень статистической
зависимости между сечениями стационарного случайного процесса, отстоящими друг
от друга во времени на величину τ. Пусть корреляционная функция имеет вид , где a,
b - параметры, которые определяются исходя из условия задания:
Выбираем параметры из постановки задачи Ymax=20 и Ymin=0.
Зададимся Δt исходя из того, что возмущением является количество
неправильно выполненных заданий Δ (%) вследствие сбоев ВЦ, а время
обработки задания которого четко не определено, то Δt
примем равным приращению
модельного времени - 1 мин. Исходя из этого получим что a= 11,11; b= 0,998.
Корреляционная функция для таких параметров имеет вид, приведенный на
рис.8.
Рис.8.
Корреляционная функция стационарного случайного процесса
Получив аналитически корреляционную функцию, описывающую стационарный
случайный процесс, воспользуемся для его моделирования методом скользящего
суммирования.
4.2 Решение системы уравнений
Для вычисления значения возмущения на очередном шаге моделирования
необходимо найти константы C0, C1, C2,… Cm, которые определяются из системы
уравнений (m+1)-го порядка:
Для упрощения примем, что сечения случайного процесса, отстоящие друг от
друга во времени более, чем на три шага моделирования, считаются
некоррелированными, т.е. m=3. Тогда:
Далее,
согласно методу скользящего суммирования, значения стационарного случайного
процесса Y(t) с заданной корреляционной функцией KY(τ) находятся по формулам:
где
y(iΔt)
- значения значение возмущения на
очередном i-ом шаге моделирования, qi - случайные нормально распределенные
величины с нулевым математическим ожиданием и единичной дисперсией, - математическое ожидание стационарного случайного
процесса, C0, C1, C2,… Cm - константы, найденные выше.
В
рассматриваемой задачи возмущение имеет разброс [0…20] В результате вычисления
коэффициентов С необходимых для вычисления случайных величин по методу
скользящего суммирования были получены следующие результаты.
С
интервалом разброса [0…20] : ,
Решение
системы уравнений:
> restart;
> a:=evalf((20-0)/6)^2;
> b:=-ln(0.05)/3/1;
> k1:=c0^2+c1^2+c2^2+c3^2=a;
>
k2:=c0*c1+c1*c2+c2*c3=a*exp(-b*1);
>
k3:=c0*c2+c1*c3=a*exp(-b*2);
> k4:=c0*c3=a*exp(-b*3);
>
solve({k1,k2,k3,k4},{c0,c1,c2,c3});
4.3
Блок-схема метода скользящего суммирования
Рис.9.
Блок-схема алгоритма генерирования стационарного случайного процесса методом
скользящего суммирования
4.4
Тестирование генератора стационарного случайного процесса
Для оценки качества работы генератора стационарного случайного процесса
используются критерии согласия Смирнова, Фишера и Стьюдента. Результаты одного
из тестов приведены на рисунке ниже.
Рис.10. Результаты тестирования генератора стационарного случайного
процесса
Как видно из рисунка, результаты теста приемлемы. Поэтому добавим
генератор стационарного случайного процесса к существующей уже модели, тем
самым сделав процесс случайным стационарным процессом.
4.5
Моделирование СМО в условиях воздействия возмущающих случайных процессов
Отличие моделирования СМО в условиях воздействия возмущающих случайных
процессов от моделирования СМО в условиях случайных изменений параметров будет
заключаться в том, что процент брака каждого из станков изменяется случайным
образом.
Количество уничтоженных заданий - 0
Рис.11.
Моделирование СМО в условиях воздействия возмущающих случайных процессов
5. Оптимизация системы массового
обслуживания
Пользуясь разработанной имитационной моделью, произвести оптимизацию
системы массового обслуживания.
.1
Постановочная часть оптимизационной задачи
Варьируя параметры модели, можно оптимизировать показатели работы
моделируемой системы массового обслуживания.
Процессы в сложных системах можно достаточно полно оценить только
совокупностью различных показателей качества, поэтому для их оптимизации
необходимо выбирать несколько частных критериев качества функционирования
системы.
Для решения задачи рассматривается критерием оптимальности
,
где -частный критерий оптимальности.
По
заданию, варьируемым параметрам являются К- математическое ожидание Объемов
памяти буферов. Таким образом, нельзя представить критерии оптимальности в виде
обобщенного показателя, несмотря на то что они не являются противоречивыми, но
тем не менее они имеют различную «природу». Для решения оптимизационной задачи
воспользуемся методом Парето-оптимизации.
5.2
Блок-схема реализующая Парето-оптимизацию
Рис.12
Блок-схема алгоритма реализующего Парето-оптимизацию
5.3
Результаты Парето-оптимизации
В результате применение Парето-оптимизации получим, при заданных
параметрах оптимизации, следующую таблицу Паретто-оптимальных альтернатив
(рис.13)
Рис.13
Результаты оптимизации
Заключение
Cоздана
имитационная модель участка обрабатывающего цеха. Полученная модель является
абстрактной математической моделью. Моделирование системы осуществлялось в
среде разработке приложений Borland Delphi 7.0.
Результатом является программа в виде exe файла, имитирующая работу участка
обрабатывающего цеха.
Имитационная программа, прилагаемая к записке, кроме своей
непосредственной задачи (имитационное моделирование системы), позволяет тестировать
рассмотренные во втором пункте генераторы случайных величин, тестировать
стационарный случайный процесс, полученный при использовании метода скользящего
суммирования, а также позволяет производить эксперименты с готовой моделью и
оптимизировать параметры системы по полученным результатам.
Приложение:
Программная реализация
unit Unit1;
interface, Messages,
SysUtils, Variants, Classes, Graphics, Controls, Forms,, Menus, XPMan,
StdCtrls;= class(TForm): TButton;: TButton;: TButton;: TButton;: TXPManifest;:
TButton;N5Click(Sender: TObject);Button5Click(Sender:
TObject);Button1Click(Sender: TObject);Button2Click(Sender:
TObject);Button3Click(Sender: TObject);Button4Click(Sender: TObject);
{ Private declarations }
{ Public declarations };:
TForm1;Unit2, Unit3, Unit4, Unit5;
{$R
*.dfm}TForm1.N5Click(Sender: TObject);.Close;;TForm1.Button5Click(Sender:
TObject);.Close;;TForm1.Button1Click(Sender:
TObject);.Show;.Hide;;TForm1.Button2Click(Sender:
TObject);.Show;;TForm1.Button3Click(Sender: TObject);.Show;;TForm1.Button4Click(Sender:
TObject);.Show;;.
unit Unit2;
interface, Messages,
SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, Grids,
Buttons;= class(TForm): TEdit;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;:
TEdit;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;: TButton;:
TEdit;: TLabel;: TStringGrid;: TButton;: TSaveDialog;: TEdit;: TLabel;: TEdit;:
TLabel;: TBitBtn;: TButton;:
TButton;GetTime();FillTableDate();Button1Click(Sender:
TObject);Init();FormCreate(Sender: TObject);Button2Click(Sender:
TObject);BitBtn1Click(Sender: TObject);FormClose(Sender: TObject; var Action:
TCloseAction);Button3Click(Sender: TObject);Button4Click(Sender: TObject);
{ Private declarations }
{ Public declarations };=
array[1..2, 1..50000] of integer;= array [1..3] of extended;: TForm2;
//абсолютное время в системе: real;
//сколько в буфере байт
занято,SizeBuf2,SizeBuf3,SizeBuf4 : real;
//макс размер
буфера,maxSizeBuf2,maxSizeBuf3 : real;
//если флаг в true, то буфер свободен
flInput, flObr, flOut,
flEr : boolean;
//номер обрабатываемого задания в буфере,NumberB2,NumberB3,NumberB4 :
integer;
//сколько в буфере находится
заданий,CountB2,CountB3,CountB4 : integer;
N : integer;
V : integer;
M : integer;
MI : integer;
ERcount: integer;
//Время окончания функционирования
TimeOut : real;
t1 : real;
//время, когда будет генерироваться
задание
timeGenerate : real;
Buf1, Buf2, Buf3, Buf4 :
Buffer;
//время, когда закончится
обрабатываться задание на данном элементе
timeInput : real;
timeObr : real;
timeOutput :real;
timeEr :real;
//число выполненных заданий на данный
момент
tempCountOutEx : integer;:
integer;, theHour, theMin : integer;
CountDelEx : integer;
//когда неизвестно, с кого буфера
пришло
Buf_1or4 : integer;
V_1or4 : integer;
//вероятность ошибки
ver_err : real;
is_4_Buffer : boolean;
iswithError :
boolean;Unit1;
{$R *.dfm}TForm2.GetTime ;
begin
theDay := trunc(timeAbs /
1440);
theHour := trunc((timeAbs
- theDay*1440)/(60));
theMin := trunc((timeAbs -
theDay*1440) - theHour * 60);
end;
//процедура заносит всю статистику в
таблицу
procedure
TForm2.FillTableDate;
GetTime;
strgrOut.Cells[0,iteration]
:= IntToStr(theDay);
strgrOut.Cells[1,iteration]
:= IntToStr(theHour);
strgrOut.Cells[2,iteration]
:= IntToStr(theMin);
if (timeGenerate = timeAbs)
then
strgrOut.Cells[3,iteration]
:= 'Генерация';
strgrOut.Cells[4,iteration]
:= FloatToStr(SizeBuf1);
if (not(flInput) and
is_4_Buffer) then
strgrOut.Cells[5,iteration]
:= '+4б';
if (not(flInput) and
not(is_4_Buffer)) then
strgrOut.Cells[5,iteration]
:= '+1б';.Cells[6,iteration] :=
FloatToStr(SizeBuf2);
if not(flObr) then
strgrOut.Cells[7,iteration]
:= '+';
strgrOut.Cells[8,iteration]
:= FloatToStr(SizeBuf3);
if {(not(flOut)) and}
(iswithError)
then
strgrOut.Cells[9,iteration] := '+ош';
if (not(flOut) and
not(iswithError)) then
strgrOut.Cells[9,iteration]
:= '+';
strgrOut.Cells[10,iteration]
:= FloatToStr(SizeBuf4);;;TForm2.Button1Click(Sender: TObject);
i : integer;
k : integer;
error : real;:= 0;:= 0;:=
0;:= false;:= 0;:= 0;:=0;.RowCount := 11519;;:= 0;:= 0;:= t1;(timeAbs <
TimeOut) do
//пришло время генерации задания
if (timeGenerate <=
timeAbs) then
begin
N := StrToInt(Edit9.Text);
V := StrToInt(Edit3.Text);
//если можем записать 1-й в буфер
if ((SizeBuf1 + N) <=
maxSizeBuf1) then
begin
//записываем в буфер
SizeBuf1 := SizeBuf1 + N;
inc(CountB1);
Buf1[1,CountB1] := N;
Buf1[2,CountB1] := V;
end
//не удалось записать в буфер1
else
begin
inc(CountDelEx);
end;
timeGenerate := timeGenerate + t1;
end;
//---------пришло время генерации
задания
////////////////////////////////////////////////////////////////////
//если на вводе ничего не выполняется
if flInput = true then
begin
//и 4-ый буфер не пустой
//начинаем обработку с 4-го буфера на
ввод
if (Buf4[1,NumberB4]
<> 0) then
begin
flInput := false;
timeInput := timeAbs +
(Buf4[1,NumberB4]/Buf4[2,NumberB4]);
inc(NumberB4);
is_4_Buffer := true;
end
else
if (Buf1[1,NumberB1]
<> 0) then
//если 4-ый свободен и первый тоже,
можем брать из первого
begin
flInput := false;
timeInput := timeAbs +
(Buf1[1,NumberB1]/Buf1[2,NumberB1]);
inc(NumberB1);
end;
end;
//если задание выполнилось на вводе
if ((timeInput <=
timeAbs) and (timeInput <> 0) and
((sizebuf1<>0)or(sizebuf4<>0))) then
//if ((timeInput <=
timeAbs) and (timeInput <> 0) ) then
begin
flInput := true;
//если задание пришло с 4-го буфера
if is_4_Buffer = true then
begin
SizeBuf4 := SizeBuf4 -
Buf4[1,NumberB4-1];
Buf_1or4 :=
Buf4[1,NumberB4-1];
V_1or4 :=
Buf4[2,NumberB4-1];
is_4_Buffer := false;
end
//иначе с 1-го буфера
else
begin
SizeBuf1 := SizeBuf1 -
Buf1[1,NumberB1-1];
Buf_1or4 :=
Buf1[1,NumberB1-1];
V_1or4 :=
Buf1[2,NumberB1-1];
end;
//если можно записать во второй буфер
if (SizeBuf2 + Buf_1or4
<= maxSizeBuf2) then
begin
inc(CountB2);
SizeBuf2 := SizeBuf2 +
Buf_1or4;
Buf2[1,CountB2] :=
Buf_1or4;
Buf2[2,CountB2] := V_1or4;
end
//не удалось записать в буфер2
else
begin
inc(CountDelEx);
end;
end;
//тест2
//началась обработка на
"обработке"
if ((SizeBuf2 <> 0)
and (flObr = true) and (Buf2[1,NumberB2]<>0)) then
begin
flObr := false;
timeObr := timeAbs +
(Buf2[1,NumberB2]/Buf2[2,NumberB2]);
inc(NumberB2);
end;
//---------началась обработка на
"обработке"
//если задание выполнилось на
"обработке"
begin
SizeBuf2 := SizeBuf2 -
Buf2[1,NumberB2-1];
flObr := true;
//если можно записать в третий буфер
if (SizeBuf3 +
Buf2[1,NumberB2-1] <= maxSizeBuf3) then
begin
inc(CountB3);
SizeBuf3 := SizeBuf3 +
Buf2[1,NumberB2-1];
Buf3[1,CountB3] :=
Buf2[1,NumberB2-1];
Buf3[2,CountB3] :=
Buf2[2,NumberB2-1];
end
//не удалось записать в буфер3
else
begin
inc(CountDelEx);
end;
end;
//тест3
//началась обработка на
"выводе"
if ((SizeBuf3 <> 0)
and (flOut = true)and (Buf3[1,NumberB3]<>0)) then
begin
flOut := false;
timeOutput := timeAbs +
(Buf3[1,NumberB3]/Buf3[2,NumberB3]);
inc(NumberB3);
end;
//---------началась обработка на
"выводе"
//если задание выполнилось на
"выводе"
if ((timeOutput <=
timeAbs) and (TimeOutput <> 0) and (sizebuf3<>0)) then
begin
flOut := true;
SizeBuf3 := SizeBuf3 -
Buf3[1,NumberB3-1];
inc(MI);
if
(Ercount<round(ver_err*M)) then
begin
if (round(random)=1) then
iswithError := true;
if
(Ercount+M-MI<round(ver_err*M)) then iswithError := true;
end;
if (MI=M)then begin MI:=0;
ERcount:=0 end;
if iswithError then
begin
inc(CountB4);
Buf4[1,CountB4] :=
Buf3[1,CountB3-1];
Buf4[2,CountB4] :=
Buf3[2,CountB3-1];
SizeBuf4 := SizeBuf4 +
Buf3[1,CountB3-1];
end;
inc(tempCountOutEx);
end;:= timeAbs + 1;:=
iteration +1;;
//if (iswithError) then
Label8.caption:=Label8.Caption+'1';:= false;;.Text:=
IntToStr(CountDelEx);;TForm2.Init;: integer;
for i := 1 to 50000 do
begin
Buf1[1,i] := 0;
Buf1[2,i] := 0;
Buf2[1,i] := 0;
Buf2[2,i] := 0;
Buf3[1,i] := 0;
Buf3[2,i] := 0;
Buf4[1,i] := 0;
Buf4[2,i] := 0;
end;
//!!!!!!!!!!!!!!!!!!!!!!!CountDelEx
:= 0;
SizeBuf1 := 0;
SizeBuf2 := 0;
SizeBuf3 := 0;
SizeBuf4 := 0;
maxSizeBuf1 :=
StrToInt(Edit4.Text);
maxSizeBuf2 :=
StrToInt(Edit5.Text);
maxSizeBuf3 :=
StrToInt(Edit6.Text);
flInput := true;
flObr := true;
flOut := true;
flEr := true;
NumberB1 := 1;
NumberB2 := 1;
NumberB3 := 1;
NumberB4 := 1;
CountB1 := 0;
CountB2 := 0;
CountB3 := 0;
CountB4 := 0;
N := StrToInt(Edit9.Text);
V:= StrToInt(Edit3.Text);
TimeOut :=
StrToFloat(Edit1.Text);
t1 :=
StrToFloat(Edit2.Text);
M :=StrToInt(Edit7.text);
ver_err :=
StrToFloat(Edit10.text);
is_4_Buffer :=
false;;TForm2.FormCreate(Sender: TObject);
Randomize;
strgrOut.RowCount :=
10080;
strgrOut.ColWidths[0] :=
40;
strgrOut.ColWidths[1] :=
40;
strgrOut.ColWidths[2] :=
40;
strgrOut.Cells[0,0] := 'День';
strgrOut.Cells[1,0] := 'Час';
strgrOut.Cells[2,0] := 'Мин';
strgrOut.Cells[3,0] := 'Ген. зад';
strgrOut.Cells[4,0] := 'Буфер1';
strgrOut.Cells[5,0] := 'Ввод';
strgrOut.Cells[6,0] := 'Буфер2';
strgrOut.Cells[7,0] := 'Обработка';
strgrOut.Cells[8,0] := 'Буфер3';
strgrOut.Cells[9,0] := 'Вывод';
strgrOut.Cells[10,0] := 'Буфер4';;TForm2.Button2Click(Sender:
TObject);
F : TextFile;
i,j : integer;
tempString,temp : string;
if SaveDialog1.Execute
then
begin
// str :=
Format('%-5s++++%-5s%-5s%-5s%-5s%-5s%-5s',['Дата','Время','Деталей на','Детали','Детали, поступившие','Лишние','Активность']);
AssignFile(F,Form2.SaveDialog1.FileName);
Rewrite(F);
tempString :=
Format('%65s',['Протокол моделирования']);
writeln(F,tempString);
writeln(F);
tempString :=
Format('%6s%6s%8s%12s%10s%10s%10s%10s%10s%10s',['День','Час','Минут','Ген. здния','Буф_1','Ввод','Буф_2','Обр','Буф_3','Вывод']);
writeln(F,tempString);
tempString := '';
for i :=1 to
strgrOut.RowCount-1 do
begin
for j := 0 to
strgrOut.ColCount do
begin
tempString :=
strgrOut.Cells[j,i];
case j of
0: temp := temp +
Format('%6s',[tempString]);
1: temp := temp +
Format('%6s',[tempString]);
2: temp := temp +
Format('%8s',[tempString]);
3: temp := temp +
Format('%12s',[tempString]);
4: temp := temp +
Format('%10s',[tempString]);
5: temp := temp +
Format('%10s',[tempString]);
6: temp := temp +
Format('%10s',[tempString]);
7: temp := temp +
Format('%10s',[tempString]);
8: temp := temp +
Format('%10s',[tempString]);
9: temp := temp + Format('%10s',[tempString]);
10 : temp := temp +
Format('%10s',[tempString]);
end;
end;
write(F,temp);
tempString := '';
temp :='';
writeln(F);
end;
end;
writeln(F);
writeln(F,'Количество уничтоженных заданий - ' +
IntToStr(CountDelEx));
CloseFile(F);;TForm2.BitBtn1Click(Sender:
TObject);
//Form2.Button3Click(Form2);
Form2.Close;
Form1.Show;;TForm2.FormClose(Sender:
TObject; var Action: TCloseAction);
Form1.Show;;TForm2.Button3Click(Sender:
TObject);
i:integer;
Edit11.Clear;
For i:=1 to
Form2.strgrOut.RowCount-1 do
Begin
strgrOut.Cells[0,i]:=' ';
strgrOut.Cells[1,i]:=' ';
strgrOut.Cells[2,i]:=' ';
strgrOut.Cells[3,i]:=' ';
strgrOut.Cells[4,i]:=' ';
strgrOut.Cells[5,i]:=' ';
strgrOut.Cells[6,i]:=' ';
strgrOut.Cells[7,i]:=' ';
strgrOut.Cells[8,i]:=' ';
strgrOut.Cells[9,i]:=' ';
strgrOut.Cells[10,i]:=' ';
end;;TForm2.Button4Click(Sender:
TObject);
Form2.Button3Click(Form2);
Form2.Close;
Form1.Close;;.
unit Unit3;
interface
Windows, Messages,
SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine,
TeeFunci, Series, ExtCtrls, TeeProcs, Chart, DbChart,
Grids, StdCtrls, Math,
Buttons;
TForm3 = class(TForm)
DBChart1: TDBChart;
Series1: TBarSeries;
edM: TEdit;
lblPopulationMean: TLabel;
edSigma: TEdit;
lblSigma: TLabel;
btnGeneration: TButton;
edPopulationMean: TEdit;
Label5: TLabel;
edStep: TEdit;
Label6: TLabel;
edCriterionPirs: TEdit;
Label7: TLabel;
Edit2: TEdit;
Label8: TLabel;
Edit1: TEdit;
Label9: TLabel;
btnTesting: TButton;
BitBtn1: TBitBtn;
StringGrid1: TStringGrid;
Chart1: TChart;
Series2: TLineSeries;
BitBtn2: TBitBtn;
Button1: TButton;
Label1: TLabel;
strgrRandomVariables:
TStringGrid;
Button2: TButton;
Function NormZ:real;
Procedure Clear;
Procedure Interv;
Procedure Sorting;
Procedure BuildDiagram;
procedure
btnGenerationClick(Sender: TObject);
procedure
FormCreate(Sender: TObject);
procedure
btnTestingClick(Sender: TObject);
procedure
BitBtn1Click(Sender: TObject);
procedure
BitBtn2Click(Sender: TObject);
procedure Button1Click(Sender:
TObject);
procedure
Zoom(Sender:TChart);
procedure
Zoom1(Sender:TDBChart);
procedure
Chart1DblClick(Sender: TObject);
procedure
DBChart1DblClick(Sender: TObject);
procedure
Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;Nn = 2000;
Form3: TForm3;
Xi, X_i, Y : real;
Sigma, PopulationMean :
real;
Accuracy : Extended;
m : byte;
SumProbabilities : real;
sv:array[0..Nn] of real;
//случ величины
interval_n : array[0..40]
of real; //нач интервала
interval_k : array[0..40]
of real; //конец интервала
Hit:array[0..Nn] of real;
//вероятн попадания
Hit2: array[0..100] of
integer;
w:array [0..100] of real;
h:array[0..100] of double;
kol_sv,kol_sv_posl:integer;
//количесвто св в интервале...и в последнем
sum : real;
MathOgid : real;
CKO : real;
zoomOn : boolean;Unit6,
Unit1;
{$R *.dfm}
//процедура очистки таблицы случайных
величин
Procedure
TForm3.Clear;i:integer;
for i := 1 to
strgrRandomVariables.rowCount do
strgrRandomVariables.Cells[0,i]
:= '';
for i := 0 to 40 do
interval_n[i] := 0;
for i := 0 to 40 do
interval_k[i] := 0;;
//функция получения случайных величин
Function
TForm3.NormZ:real;
NormZ := sigma *
cos(2*Pi*Random) * sqrt(-2 * Ln(Random)) + PopulationMean;;
//процедура сортировкиTForm3.Sorting;
i, j : integer;
b : real;
for j := 0 to Nn-1 do
for i := j+1 to Nn-1 do
if sv[i] < sv[j] then
begin
b := sv[j];
sv[j] := sv[i];
sv[i] := b;
end;
for i := 0 to Nn-1 do
begin
strgrRandomVariables.Cells[0,i]
:= floattostr(sv[i]);
Chart1.Series[0].AddXY(sv[i],i);
end;;TForm3.Interv;
i,j, int : integer;
dl : real;
Sorting;
dl := (sv[Nn-1] - sv[0])/
m;
edStep.Text :=
FloatToStrF(dl,FFFixed,6,6);
// interval_n[0] := sv[0];
// interval_k[0] := sv[0]
+ dl;
for int := 0 to m-1 do
begin
interval_n[int] :=
sv[0]+int*dl;
interval_k[int] :=
sv[0]+(int+1)*dl;
end;
for j:=0 to m-1 do
Hit2[j]:=0;
for i:=Nn-1 downto 0 do
begin
for j:=m-1 downto 0 do
if sv[i]>=interval_n[j]
then
begin
inc(Hit2[j]);
break;
end;
end;
SumProbabilities := 0.0;
for int := 0 to m - 1 do
begin
Hit[int] := Hit2[int] /
Nn;
SumProbabilities :=
SumProbabilities + Hit[int];
end;;TForm3.btnGenerationClick(Sender:
TObject);
i : integer;
sum := 0.0;
Cko := 0.0;
Clear;
PopulationMean :=
strtofloat(edPopulationMean.Text);
Sigma :=
strtofloat(edSigma.Text);
Accuracy := power(10,6);
m := StrToInt(edM.Text);
strgrRandomVariables.RowCount
:= Nn + 1;
for i := 0 to Nn-1 do
begin
sv[i] := NormZ;
sv[i] := Trunc(sv[i] *
Accuracy) / Accuracy;
sum := sum + sv[i];
MathOgid := sum / Nn;
Edit1.Text :=
FloatToStr(MathOgid);
end;
Sorting;
for i := 0 to Nn-1 do
Cko := Cko + ((sv[i]-
MathOgid) * (sv[i]- MathOgid));
Cko := sqrt(Cko * (1 /(Nn
- 1)));
Edit2.Text :=
FloatToStr(Cko);
btnTesting.Click;TForm3.BuildDiagram;
i : integer;
per : string;
begin
Series1.Clear;
for i := 0 to m - 1 do
begin
per :=
floattostr(round(interval_n[i] * 1000) / 1000) + ' - '+
floattostr(round(interval_k[i]*1000)/1000);
Series1.Add(Hit[i],per);
end;;Func(Ri : real) :
real;
step : real;
begin
step := -(Ri-PopulationMean)*(Ri-PopulationMean)/(2*Sigma*Sigma);
Func := exp(step) /
(Sigma*Sqrt(2*3.1415));
end;TForm3.FormCreate(Sender:
TObject);
Randomize;
StringGrid1.Cells[0,0]:='Начало';
StringGrid1.Cells[1,0]:='Конец';
StringGrid1.Cells[2,0]:='Вероятность попадания';;TForm3.btnTestingClick(Sender: TObject);
Pirs : real;
i, k : integer;
temp,dl : real;
P : real;
for i :=0 to m - 1 do
begin
Hit[i] := 0;
Hit2[i] := 0;
end;
Interv;
k := 1;
i := 0;
begin
if interval_n[i] <>
interval_k[i] then
begin
{StringGrid2.Cells[0,k] :=
floattostrf(interval_n[i],Fffixed,6,6);
StringGrid2.Cells[1,k] :=
floattostrf(interval_k[i],Fffixed,6,6);
StringGrid2.Cells[2,k] :=
floattostrf(Hit[i],Fffixed,5,4);}
StringGrid1.Cells[0,k] :=
floattostrf(interval_n[i],Fffixed,6,6);
StringGrid1.Cells[1,k] :=
floattostrf(interval_k[i],Fffixed,6,6);
StringGrid1.Cells[2,k] :=
floattostrf(Hit[i],Fffixed,5,4);
k := k + 1;
end;
i := i + 1;
end;
StringGrid1.RowCount :=
k;;
//критерий Пирсона
Pirs := 0;
P := 0;
dl:=(sv[Nn-1]-sv[0])/m;
for i :=0 to m-2 do
begin
P := Func((interval_n[i+1]
+ interval_n[i])/2)*dl;
Temp := (Hit[i] -
P)*(Hit[i] - P)/P;
Pirs := Pirs + temp;
end;
Pirs := Pirs * Nn;
edCriterionPirs.Text :=
FloatToStr(Pirs);;TForm3.BitBtn1Click(Sender: TObject);
//Form3.BitBtn2Click(Form3);
Form3.Close;;TForm3.BitBtn2Click(Sender:
TObject);:integer;
Form3.DBChart1.Series[0].Clear;
Form3.Chart1.Series[0].Clear;
Form3.Edit1.Clear;
Form3.Edit2.Clear;
Form3.edCriterionPirs.Clear;
Form3.edStep.Clear;
For i:=1 to Form3.StringGrid1.RowCount-1
do
Begin
StringGrid1.Cells[0,i]:='
';
StringGrid1.Cells[1,i]:='
';
StringGrid1.Cells[2,i]:='
';
end;;TForm3.Button1Click(Sender:
TObject);
Form6.Show;;TForm3.Zoom(Sender:
TChart);
If zoomOn=true
then
begin
Sender.Width:=330;
Sender.Height:=240;
Sender.BringToFront;
ZoomOn:=false
end
else if zoomOn=false then
begin
Sender.Width:=500;
Sender.Height:=500;
Sender.BringToFront;
zoomOn:=true;
end;;TForm3.Zoom1(Sender:
TDBChart);
If zoomOn=true
then
begin
Sender.Top:=270;
Sender.Width:=330;
Sender.Height:=240;
Sender.BringToFront;
ZoomOn:=false
end
else if zoomOn=false then
begin
Sender.Top:=10;
Sender.Width:=500;
Sender.Height:=500;
Sender.BringToFront;
zoomOn:=true;
end;;TForm3.Chart1DblClick(Sender:
TObject);
Zoom(Chart1);;TForm3.DBChart1DblClick(Sender:
TObject);
Zoom1(DBChart1);;TForm3.Button2Click(Sender:
TObject);
Form3.BitBtn2Click(Form3);
Form3.Close;
Form1.Close;;.
unit Unit4;
interface
Windows, Messages,
SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
Buttons, Grids;
TForm4 = class(TForm)
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
Label1: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Button1: TButton;
Button2: TButton;
procedure
arrayParetoOptimal;
procedure
FormCreate(Sender: TObject);
procedure
BitBtn1Click(Sender: TObject);
procedure
BitBtn2Click(Sender: TObject);
procedure
Button1Click(Sender: TObject);
procedure
Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Form4: TForm4;
allSolution, arrayPareto:
array[1..343, 0..6] of Real;Unit1;
{$R
*.dfm}TForm4.FormCreate(Sender: TObject);
i,j,k,v:integer;
n:array[0..6]of real;
StringGrid1.Cells[1,0] :=
'K1';
StringGrid1.Cells[2,0] :=
'K2';
StringGrid1.Cells[3,0] :=
'K3';
StringGrid1.Cells[4,0] :=
'Y1';
StringGrid1.Cells[5,0] :=
'Y2';
StringGrid1.Cells[6,0] :=
'Y3';
StringGrid1.Cells[7,0] :=
'Y4';
StringGrid2.Cells[1,0] :=
'K1';
StringGrid2.Cells[2,0] :=
'K2';
StringGrid2.Cells[3,0] :=
'K3';
StringGrid2.Cells[4,0] :=
'Y1(min)';
StringGrid2.Cells[5,0] :=
'Y2(min)';
StringGrid2.Cells[6,0] :=
'Y3(min)';
StringGrid2.Cells[7,0] :=
'Y4(min)';
AssignFile(input,'input.txt');
reset(input);
k := 0;
while not eof(input) do
begin
inc(k);
StringGrid1.Cells[0,k] :=
IntToStr(k);
StringGrid1.RowCount :=
k+2;
for i := 0 to 6 do
begin
read(input,n[i]);
allSolution[k,i] := n[i];
StringGrid1.Cells[i+1,k]
:= format('%0.0f',[n[i]]);
end;
end;
CloseFile(input);
StringGrid1.RowCount :=
StringGrid1.RowCount - 1;;TForm4.BitBtn1Click(Sender: TObject);
i,v,k:integer;
n:array[0..6]of real;
m1,m2,dd1,dd2,d1,d2,tb:real;
arrayParetoOptimal;;TForm4.arrayParetoOptimal;
J, K, M, L: Word;
F: TextFile;
CountPokazateliRaboti,
CountarrayPareto: Word;
AssignFile(output,'output.txt');
rewrite(output);
CountPokazateliRaboti :=
29;
CountarrayPareto :=
CountPokazateliRaboti;
arrayPareto :=
allSolution;
J := 0;
while J <
CountarrayPareto do begin
J := J + 1;
K := 0;
while K <
CountarrayPareto do begin
K := K + 1;
if ((K <> J)
and (arrayPareto[J, 3]
<= arrayPareto[K, 3])
and (arrayPareto[J, 4]
<= arrayPareto[K, 4])
and (arrayPareto[J, 5]
<= arrayPareto[K, 5])
and (arrayPareto[J, 6]
<= arrayPareto[K, 6])) then begin
for M := K to
(CountarrayPareto - 1) do
for L := 0 to 6 do
arrayPareto[M, L] :=
arrayPareto[M + 1, L];
CountarrayPareto :=
CountarrayPareto - 1;
K := K - 1;
if (J > K) then
J := J - 1;
end;
end;
end;
StringGrid2.RowCount :=
CountarrayPareto + 1;
Label1.Caption := 'Число Парето-оптимальных решений :' + IntToStr(CountarrayPareto);
for j :=1 to
CountarrayPareto + 1 do
begin
StringGrid2.Cells[0,j] :=
IntToStr(j);
for k :=0 to 6 do
begin
StringGrid2.Cells[k+1,j]
:= FloatTostr(arrayPareto[j,k]);
write(output,format('%0.0f',[arrayPareto[j,k]]));
write(output,' ');
end;
writeln(output);
end;
CloseFile(output);;TForm4.BitBtn2Click(Sender:
TObject);
Form4.Button1Click(Form4);
Form4.Close;;TForm4.Button1Click(Sender:
TObject);:integer;
For i:=1 to
Form4.StringGrid2.RowCount-1 do
Begin
StringGrid2.Cells[0,i]:='
';
StringGrid2.Cells[1,i]:='
';
StringGrid2.Cells[2,i]:='
';
StringGrid2.Cells[3,i]:='
';
StringGrid2.Cells[4,i]:='
';
StringGrid2.Cells[5,i]:='
';
StringGrid2.Cells[6,i]:='
';
StringGrid2.Cells[7,i]:='
';
end;;TForm4.Button2Click(Sender:
TObject);
Form4.Button1Click(Form4);
Form4.Close;
Form1.Close;;.
unit Unit5;
interface
Windows, Messages,
SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
ExtCtrls;
TForm5 = class(TForm)
Image1: TImage;
private
{ Private declarations }
public
{ Public declarations }
end;
Form5: TForm5;
{$R *.dfm}.
unit Unit6;
interface
Windows, Messages,
SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
TForm6 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Label4: TLabel;
Edit7: TEdit;
Edit8: TEdit;
Edit6: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit3: TEdit;
Edit2: TEdit;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
function NormalLow(Sigma,
MatOzhidanie: Real): Real;
procedure
Button1Click(Sender: TObject);
procedure
FormActivate(Sender: TObject);
procedure
FormCreate(Sender: TObject);
procedure
Button2Click(Sender: TObject);
procedure
Button3Click(Sender: TObject);
procedure
Button5Click(Sender: TObject);
procedure
Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure Initialize;
procedure Estimate;
end;
Form6: TForm6;Unit3,
Unit1;
{$R *.dfm}
Iter: Cardinal;
arrayY: array[1..50000] of
Extended;
arrayYX, arrayYY:
array[1..25000] of Extended;TForm6.Initialize;
I: Word;
Memo1.Clear;
Memo2.Clear;
Memo3.Clear;
Iter :=
StrToInt(Edit1.Text);
for I := 1 to Iter do
arrayY[I] :=
0;;TForm6.NormalLow(Sigma, MatOzhidanie: Real): Real;
X1, X2, Y: Real;
X1 := Random;
X2 := Random;
Y := Sigma * Sqrt(-2 *
Ln(X1)) * Cos(2 * Pi * X2) + MatOzhidanie;
NormalLow :=
Y;;TForm6.Estimate;
I: Word;
MOx, Moy, Dx, Dy, S:
Extended;
Dst,tst : Extended;
Iter := Iter div 2;
MOx := 0;
for I := 1 to Iter do
MOx := MOx + arrayYX[I];
MOx := MOx / Iter;
Edit7.Text :=
FloatToStrF(MOx,ffFixed,5,4);
Dx := 0;
for I := 1 to Iter do
Dx := Dx + Sqr(arrayYX[I]
- MOx);
Dx := Dx / (Iter - 1);
Edit6.Text :=
FloatToStrF(Dx,ffFixed,5,4);
S := Sqrt(Dx);
Edit8.Text :=
FloatToStrF(S,ffFixed,5,4);
MOy := 0;
for I := 1 to Iter do
MOy := MOy + arrayYY[I];
MOy := MOy / Iter;
Edit4.Text :=
FloatToStrF(MOy,ffFixed,5,4);
Dy := 0;
for I := 1 to Iter do
Dy := Dy + Sqr(arrayYY[I]
- MOy);
Dy := Dy / (Iter - 1);
Edit3.Text :=
FloatToStrF(Dy,ffFixed,5,4);
S := Sqrt(Dy);
Edit5.Text :=
FloatToStrF(S,ffFixed,5,4);
Dst := 0;
Dst :=
((Iter/2-1)*Dx+(Iter-1)*Dy)/(Iter/2+Iter/2-2);
tst := 0;
tst :=
sqr((MOx-MOy)*(MOx-MOy)*(Iter/2)*(Iter/2)/Dst/(Iter/2+Iter/2));
Edit2.Text :=
FloatToStrF(tst,ffFixed,6,5);;TForm6.Button1Click(Sender: TObject);
I, J: Word;
Q: array[0..3] of
Extended;
C: array[0..3] of
Extended;
Sechenie: Extended;
Initialize;
C[0] := 1.224975026;
C[1] := 3.065225384;
C[2] := 0.09621139492;
C[3] := 0.4535239849;
for J := 0 to 3 do
Q[J] := NormalLow(1, 0);
for I := 1 to Iter do
begin
Sechenie := 0;
for J := 0 to 3 do
Sechenie := Sechenie +
C[J]*Q[J];
Sechenie := Sechenie + 10;
arrayY[I] :=
round(Sechenie*1000)/1000;
for J := 0 to 2 do
Q[J] := Q[J + 1];
Q[3] := NormalLow(1, 0);
end;
for I := 1 to Iter do
if I mod 2 = 0 then
arrayYY[I div 2] :=
arrayY[I]
else
arrayYX[I div 2 + 1] :=
arrayY[I];
//вывод на форму
for I := 1 to Iter do
begin
Memo3.Lines.Add(FloatToStr(arrayY[I]));
if (i mod 2 = 0) then
Memo2.Lines.Add(FloatToStr(arrayY[I]))
else
Memo1.Lines.Add(FloatToStr(arrayY[I]));
end;
Estimate;;TForm6.FormActivate(Sender:
TObject);
Initialize;TForm6.FormCreate(Sender:
TObject);
Randomize;;TForm6.Button2Click(Sender:
TObject);
Memo1.Clear;
Memo2.Clear;
Memo3.Clear;
Edit3.Clear;
Edit4.Clear;
Edit5.Clear;
Edit6.Clear;
Edit7.Clear;
Edit8.Clear;;TForm6.Button3Click(Sender:
TObject);
//Form3.BitBtn2Click(Form3);
//Form6.Button2Click(Form6);
Form6.Close;
Form3.Close;;TForm6.Button5Click(Sender:
TObject);
//Form6.Button2Click(Form6);
Form6.Close;;TForm6.Button4Click(Sender:
TObject);
Form3.BitBtn2Click(Form3);
Form6.Button2Click(Form6);
Form6.Close;
Form3.Close;
Form1.Close;;.Unit7;
Windows, Messages,
SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids,
Buttons;
TForm7 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
Edit4: TEdit;
Label4: TLabel;
Edit5: TEdit;
Label5: TLabel;
Edit6: TEdit;
Label6: TLabel;
Edit7: TEdit;
Label7: TLabel;
Button1: TButton;
Edit9: TEdit;
Label9: TLabel;
strgrOut: TStringGrid;
Button2: TButton;
SaveDialog1: TSaveDialog;
Edit10: TEdit;
Label110: TLabel;
Edit11: TEdit;
Label111: TLabel;
BitBtn1: TBitBtn;
Button3: TButton;
Button4: TButton;
procedure GetTime();
procedure FillTableDate();
procedure
Button1Click(Sender: TObject);
procedure Init();
procedure
FormCreate(Sender: TObject);
procedure Button2Click(Sender:
TObject);
procedure
BitBtn1Click(Sender: TObject);
procedure
FormClose(Sender: TObject; var Action: TCloseAction);
procedure
Button3Click(Sender: TObject);
procedure
Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Buffer = array[1..2,
1..50000] of integer;
myT= array [1..3] of
extended;
Form7: TForm7;
//абсолютное время в системе
timeAbs : real;
//сколько в буфере байт занято
SizeBuf1,SizeBuf2,SizeBuf3,SizeBuf4 : real;
//макс размер буфера
maxSizeBuf1,maxSizeBuf2,maxSizeBuf3 : real;
//если флаг в true, то буфер свободен
flInput, flObr, flOut,
flEr : boolean;
//номер обрабатываемого
задания в буфере
NumberB1,NumberB2,NumberB3,NumberB4
: integer;
//сколько в буфере находится заданий
CountB1,CountB2,CountB3,CountB4 : integer;
N : integer;
V : integer;
M : integer;
MI : integer;
ERcount: integer;
//Время окончания
функционирования
TimeOut : real;
t1 : real;
//время, когда будет генерироваться
задание
timeGenerate : real;
Buf1, Buf2, Buf3, Buf4 : Buffer;
//время, когда закончится
обрабатываться задание на данном элементе
timeInput : real;
timeObr : real;
timeOutput :real;
timeEr :real;
//число выполненных заданий на данный
момент
tempCountOutEx : integer;
iteration : integer;
theDay, theHour, theMin :
integer;
CountDelEx : integer;
//когда неизвестно, с кого буфера
пришло
Buf_1or4 : integer;
V_1or4 : integer;
//вероятность ошибки
ver_err : real;
is_4_Buffer : boolean;
iswithError :
boolean;Unit1, Unit2, Unit3;
{$R *.dfm}TForm7.GetTime ;
begin
theDay := trunc(timeAbs /
1440);
theHour := trunc((timeAbs
- theDay*1440)/(60));
theMin := trunc((timeAbs -
theDay*1440) - theHour * 60);
end;
//процедура заносит всю статистику в
таблицу
procedure
TForm7.FillTableDate;
GetTime;
strgrOut.Cells[0,iteration]
:= IntToStr(theDay);
strgrOut.Cells[1,iteration]
:= IntToStr(theHour);
strgrOut.Cells[2,iteration]
:= IntToStr(theMin);
if (timeGenerate =
timeAbs) then
strgrOut.Cells[3,iteration]
:= 'Генерация';
strgrOut.Cells[4,iteration]
:= FloatToStr(SizeBuf1);
if (not(flInput) and
is_4_Buffer) then
strgrOut.Cells[5,iteration]
:= '+4б';
if (not(flInput) and
not(is_4_Buffer)) then
strgrOut.Cells[5,iteration]
:= '+1б';
strgrOut.Cells[6,iteration]
:= FloatToStr(SizeBuf2);
if not(flObr) then
strgrOut.Cells[7,iteration]
:= '+';
strgrOut.Cells[8,iteration]
:= FloatToStr(SizeBuf3);
if {(not(flOut)) and}
(iswithError)
then
strgrOut.Cells[9,iteration] := '+';
if (not(flOut) and
not(iswithError)) then
strgrOut.Cells[9,iteration]
:= '+';
strgrOut.Cells[10,iteration]
:= FloatToStr(SizeBuf4);;;TForm7.Button1Click(Sender: TObject);
i : integer;
k : integer;
error : real;:= 0;:= 0;:=
0;:= false;:= 0;:= 0;:=0;.RowCount := 11519;;:= 0;:= 0;:= t1;(timeAbs <
TimeOut) do
//пришло время генерации
задания
if (timeGenerate <=
timeAbs) then
begin
N := StrToInt(Edit9.Text);
V := StrToInt(Edit3.Text);
//если можем записать 1-й в буфер
if ((SizeBuf1 + N) <=
maxSizeBuf1) then
begin
//записываем в буфер
SizeBuf1 := SizeBuf1 + N;
inc(CountB1);
Buf1[1,CountB1] := N;
Buf1[2,CountB1] := V;
end
//не удалось записать в буфер1
else
begin
inc(CountDelEx);
end;
timeGenerate := timeGenerate + t1;
end;
//---------пришло время генерации
задания
////////////////////////////////////////////////////////////////////
//если на вводе ничего не выполняется
if flInput = true then
begin
//и 4-ый буфер не пустой
//начинаем обработку с 4-го буфера на
ввод
if (Buf4[1,NumberB4]
<> 0) then
begin
flInput := false;
timeInput := timeAbs +
(Buf4[1,NumberB4]/Buf4[2,NumberB4]);
inc(NumberB4);
is_4_Buffer := true;
end
else
if (Buf1[1,NumberB1]
<> 0) then
//если 4-ый свободен и первый тоже,
можем брать из первого
begin
flInput := false;
timeInput := timeAbs +
(Buf1[1,NumberB1]/Buf1[2,NumberB1]);
inc(NumberB1);
end;
end;
//если задание выполнилось на вводе
if ((timeInput <=
timeAbs) and (timeInput <> 0) and
((sizebuf1<>0)or(sizebuf4<>0))) then
//if ((timeInput <=
timeAbs) and (timeInput <> 0) ) then
begin
flInput := true;
//если задание пришло с 4-го буфера
if is_4_Buffer = true then
begin
SizeBuf4 := SizeBuf4 -
Buf4[1,NumberB4-1];
Buf_1or4 :=
Buf4[1,NumberB4-1];
V_1or4 :=
Buf4[2,NumberB4-1];
is_4_Buffer := false;
end
//иначе с 1-го буфера
else
begin
SizeBuf1 := SizeBuf1 -
Buf1[1,NumberB1-1];
Buf_1or4 :=
Buf1[1,NumberB1-1];
V_1or4 :=
Buf1[2,NumberB1-1];
end;
//если можно записать во второй буфер
if (SizeBuf2 + Buf_1or4
<= maxSizeBuf2) then
begin
inc(CountB2);
SizeBuf2 := SizeBuf2 +
Buf_1or4;
Buf2[1,CountB2] :=
Buf_1or4;
Buf2[2,CountB2] := V_1or4;
end
//не удалось записать в буфер2
else
begin
inc(CountDelEx);
end;
end;