ПРОГРАММА «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)