ПРОГРАММА «3-Опознание»

1. Алгоритм
Программа «3-Опознание» имеет одно отличие от программы «2-Опознание».
Это нахождение расстояния при определении вероятности появление элемента объекта.
В программе «2-Опознание» вероятность появления элемента объекта находится с использованием   
расстояния в прямоугольной метрике.
Википедия
…метрика, введённая Германом Минковским. Согласно этой метрике, расстояние между двумя точками равно сумме модулей разностей их координат.
В программе «3-Опознание» вероятность появления элемента объекта находится с использованием   
расстояния в эвклидовой метрике.
То есть по теореме Пифагора.

2. Итог
Z9 – число нахождений, хотя бы одного центра объекта
в окне опознания за суперцикл.
n – частное от деления z9 на h (число шагов суперцикла).
Расчёты показали совпадение величины n для  двух метрик.
Что требует объяснения.

3. Скачать программу

https://disk.yandex.ru/d/eZsrf3cc8zgxiA

Приложение 1

Распечатка программы 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button5: TButton;
    Label1: TLabel;
    StringGrid2: TStringGrid;
    StringGrid3: TStringGrid;
    Edit1: TEdit;
    Label4: TLabel;
    StringGrid1: TStringGrid;
    StringGrid4: TStringGrid;
    Edit2: TEdit;

    procedure Button1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
          const
   a=1000; //размер матрицы объектов
      b=30;//число объектов
        c=12;// номер объекта для вывода
         d=2;//задание вероятности
      x1=1;   //координата  1 окна   опознания
       y1=1;  // координата 1 окна   опознания
         x2=150;   //координата  2   опознания
       y2=150;  // координата 2 окна
           h=100 ; //суперцикл
      var
       Tick: Cardinal;

     w:   array [1..3, 1..b] of  cardinal;//1, 2 координаты центров объектов
      // объектов опознания
//3 число элементов объекта
s:   array [1..a,1..a,1..b] of  cardinal;// матрица  размещения элементов
//объектов на матрице
        p:   array [1..b] of  cardinal;// сумма элементов   для каждого объекта
        // в окне опознания
u: array [1..b] of variant;//частное суммы элементов объекта в окне опознания
//к сумме элементов всех объектов
  u1: array [1..b] of variant;//частное сумме элементов объекта в окне опознания
  u2: array [1..h] of cardinal;//1 центр объекта в окне опознания, 0 - вне окна

tt,i,j,q ,z,r,i1,i2,i3,j1,t,g ,k, v,y:  integer;
   n1, n2, n3,n4    : integer;//
   m1,m2,m3,m4,m5: integer;//
f, f1,f2,f3,f4,f5,z2,z4,z6,z8,z9 : integer;//
    z1,z3,z5,z7 : real;
   n: variant;

procedure TForm1.Button1Click(Sender: TObject);
// окантовка
begin
       for q:=1 to 5   // нумерация по вертикали  в табл №1 ,
     do   StringGrid1.Cells[0,q]:=IntToStr(q) ;
    for q:=1 to b //нумерация по горизонтали в табл №1 ,
     do   StringGrid1.Cells[q,0]:=IntToStr(q);

for q:= 1 to a   // нумерация по вертикали  в табл №2 ,
     do StringGrid2.Cells[0,q]:=IntToStr(q);
    for q:=1 to a //ну2мерация по горизонтали в табл №2 ,
     do  StringGrid2.Cells[q,0]:=IntToStr(q);

             for q:= 1 to 10   // нумерация по вертикали  в табл №1 ,
     do       StringGrid3.Cells[0,q]:=IntToStr(q);
    for q:=1 to 500//нумерация по горизонтали в табл №1 ,
     do    StringGrid3.Cells[q,0]:=IntToStr(q);

              StringGrid1.Cells[0,0] := 'w[ ]';
            StringGrid2.Cells[0,0] := 's[ ]';
                   StringGrid3.Cells[0,1] := 'p[ ]';
                      StringGrid3.Cells[0,2] := 'u[ ]';
                            StringGrid3.Cells[0,3] := 'u1[ ]';
                                 StringGrid3.Cells[0,4] := 'u2[ ]';
            ////////////////// Генерация объектов
                for     f:=1 to h do  //Суперрцикл
                    begin //f
                    for i:=1 to b do
                    begin
                  p[i] :=0;
                  u[i] :=0;
                  u1[i] := 0;
                    end;
                for i:=1 to 3 do
                for j:=1 to b do
                    w[i,j] :=0;
                          for i1:=1 to a do
                          for i2:=1 to a do
                          for i3:=1 to b do
                          s[i1,i2,i3] :=0;
             z1:=0; z2:=0; z3:=0; z4:=0;
                 z5:=0; z6:=0; z7:=0; z8:=0;
                                   for r:= 1 to b do
                                begin
                        Form1.Caption:=IntToStr(GetTickCount-Tick);
                                n1:=0; n2:=0;
                                begin
                   n1:= random(a)+1;
                      n2:= random(a)+1;
                 w[1,r] := n1;
                   w[2,r] := n2;
                            end;
               for i:=1 to a do
             for j:=1 to a do
             begin

         if  (random (Trunc (Sqrt( Sqr(abs(n1-i))+Sqr(abs(n2-j)) )
          +1)) *3  )  <=d   then s[i,j,r] :=r;
          end;            end;
                           tt:=Trunc(Sqrt (0));   //для ясности
            {   ?x Sqrt (x) Квадратный корень из x
x2 Sqr (x) Квадрат x
}
                for   t:=1 to b do
                 for i:=1 to a do
             for j:=1 to a do
             if s[i,j,t] >0    then
             w[3,t] :=  w[3,t]+1;
                //// Опознавание объъектов

               for g:=1 to b  do
               for i:=y1 to y2 do
               for j:=x1 to x2 do
               if s[i,j,g] >0  then    begin
                 Form1.Caption:=IntToStr(GetTickCount-Tick);
                  p[g] :=  p[g] +1;
                   z:=z+1;
                   end;
            for i:=1 to b do begin
               Form1.Caption:=IntToStr(GetTickCount-Tick);
            u[i] := 100*  p[i] /z;
               u[i] := 100*  p[i] /z;
               u1[i] := 1000* p[i]/w[3,i];
                  end;
                  //Опознание центров z2 и z4  в окне опознанпия
              for i:=1 to b do
              begin
                Form1.Caption:=IntToStr(GetTickCount-Tick);
                  if  u[i] > z1 then begin z1:= u[i]; z2:=i;end;
                 if  u1[i] > z3 then begin z3:= u1[i]; z4:=i;end;
              end;
                      //   Опознание центров z6 и z8  в окне опознанпия
                   for i:=1 to b do
              begin
                 Form1.Caption:=IntToStr(GetTickCount-Tick);
         if i<>z2 then if  u[i] > z5 then begin z5:= u[i]; z6:=i;end;
          if i<>z4 then if  u1[i] > z7 then begin z7:= u1[i]; z8:=i;end;
              end;
                   if ( ((w[1,z4]>=x1) and  (w[1,z4]<=x2)) and
                           ((w[2,z4]>=y1) and  (w[2,z4]<=y2)) )
                   then  begin z9 := z9+1; u2[f] :=1;  end;
                                end;//f
                              N:= z9/h;
                        ////Вывод
                         for i:=1 to b   do  begin
                    Form1.Caption:=IntToStr(GetTickCount-Tick);
                StringGrid1.Cells[i,1]:= IntToStr(w[1,i]);
   StringGrid1.Cells[i,2]:= IntToStr(w[2,i]);
      StringGrid1.Cells[i,3]:= IntToStr(w[3,i]);
  end;
         for I:=1 to a do
   for J:=1 to a   do
      StringGrid2.Cells[j,i]:= IntToStr(s[i,j,z4])+' * '+IntToStr(s[i,j,z8]);

           for j:=1 to b do
                StringGrid3.Cells[j,1]:= IntToStr(p[j]) ;
                    for   i:=1 to b do  begin
                         Form1.Caption:=IntToStr(GetTickCount-Tick);
                  StringGrid3.Cells[i,2]:=   FormatFloat('0.00',u[i]);
                  StringGrid3.Cells[i,3]:=   FormatFloat('0.00',u1[i]);
                                 end;
                     for   i3:=1 to h do  begin
                           StringGrid3.Cells[i3,4]:=  IntToStr(u2[i3])
                        end;

  Edit1.Text :=
        'n1=' +'  '+ IntToStr(n1)   +'  '+ 'n2=' +'  '+ IntToStr(n2)
     +'  '+ 'z=' +'  '+ IntToStr(z)
   +'  '+ 'z1=' +'  '+ FormatFloat('0.00',z1) +'  '+ 'z2=' +'  '+ IntToStr(z2)
  +'  '+ 'z3=' +'  '+ FormatFloat('0.00',z3) +'  '+ 'z4=' +'  '+ IntToStr(z4)
   +'  '+ 'z5=' +'  '+ FormatFloat('0.00',z5) +'  '+ 'z6=' +'  '+ IntToStr(z6)
  +'  '+ 'z7=' +'  '+ FormatFloat('0.00',z7) +'  '+ 'z8=' +'  '+ IntToStr(z8);

           Edit2.Text :=
      'z9=' +'  '+ IntToStr(z9)
             +'  '+ 'n=' +'  '+ FormatFloat('0.00',n)
           +'  '+'u2[h]=' +'  '+ IntToStr(u2[h])
                      +'  '+'tt=' +'  '+ IntToStr(tt)

                                end;
  /////////  ///////////////////////////////////////////////////////
        procedure TForm1.Button5Click(Sender: TObject);
begin
      close
end;
         initialization
randomize;
end.

Отредактировано ABC (2023-01-25 22:30:53)