Мои программы
[size=30]Программа Б--АКСОН
[/size]
[size=20][color=maroon]1.Общее
2.Нейронная сеть – граф
3.Активность нейронов
4.Входной сигнал
5.Связи между нейронами
6.Итерации основного цикла
7.Итерации суперцикла
8.Скачивание программы Б--АКСОН
[/color][/size]
[size=20][color=maroon]1.Общее[/color][/size]
Программа Б-АКСОН – развитие программы --АКСОН
Разум у живого реализован на основе нейронных сетей.
То есть нейронов, передающих между собой сигналы повышения активности (связи +) и уменьшения активности (связи -).
Нейроны имеют отростки: аксоны и дендриты.
Передатчик сигналов: аксон, приемник: дендрит.
В технике появились аналоги нейронных сетей живого.
Общее название
Такие сети наследовали только общие принципы нейронных сетей живого.
Аналоги не связаны биологическими ограничениями.
Ниже будет описана программа Б--АКСОН.
Цель программ серии АКСОН.
Изучить функционирования нейронных сетей.
И построить нейронную сеть с четким соответствием: входной сигнал – выходной сигнал.
Разумеется, имеется много вариантов анализа выходных сигналов.
Программы серии АКСОН.
Программа АКСОН.
Между нейронами только сигналы увеличения активности.
Входные сигналы – положительные.
Введена функция забывания, уменьшения активности нейронов со временем.
Программа в ветви «Комментарии к Программам».
Программа +- Аксон
Связи между нейронами + и -.
Входные сигналы +.
Программа –-АКСОН.
Связи между нейронами + и -.
Входные сигналы +и -.
Программа Б-АКСОН.
Связи между нейронами + и -.
Входные сигналы +и -.
Добавлена функция.
Расчёт для серии входных сигналов.
[size=20][color=maroon]2. Нейронная сеть – граф[/color][/size]
Нейронной сети соответствует ориентированный граф – орграф.
Нейрону ставится в соответствие вершина орграфа.
Ниже нейрон и вершина графа одинаковое содержание.
Число вершин – const: n.
Дуга между вершинами соответствует связи аксон – дендрит.
Дуга из вершины i в вершину j соответствует связи аксон – дендрит.
Между каждой парой может в каждом направление быть несколько дуг или не одной.
Число дуг случайная или постоянная величина.
Орграф может быть полносвязным.
Из каждой вершины можно достичь всех вершин по ориентации (направлению) дуг.
Орграф может быть частично связным, когда одни вершины имеют пути ко всем другим вершинам, другие только к части вершин. При построении орграфа в конкретной задаче проверка связности графа не проводилась. Для отдельных пар вершин по одному или двух направлениях случайным образом в конкретной программе задавалось отсутствие связи: const m.
[size=20][color=maroon]3. Активность нейронов[/color][/size]
Каждому нейрону при расчётах присваивается вес.Вес может быть со знаком плюс или минус. В конкретной программе вес – положительная величина не более const z или отрицательная величина не менее const z1.
[size=20][color=maroon]4. Входной сигнал[/color][/size]
В конкретной программе предусмотрены два вида входного сигнала.
Вес случайный и вес постоянный.
Переключатель: const k.
К = 1 – случайный входной сигнал: const a1
a1>0.
Диапазон: 0 – а1-1.
К = 2 – постоянный входной сигнал: const a2.
a2>0.
Входной сигнал подается одного веса на несколько нейронов.
Период подачи – переменная переменная ij.
Изменение ij в диапазоне v1 – v.
Входной сигнал – матрица f[1..n].
f – величина входного сигнала на нейрон –i.
[size=20][color=maroon]5. Связи между нейронами[/color][/size]
Связи между нейронами – матрица s[1..n,1..n].
Переключатель вида матрицы s[1..n,1..n].- pp.
pp =1
Вес элементов вероятностный в диапазоне 0 – a3-1.
a3>0.
pp =2
Вес элементов постоянный – a4.
Задаются нулевые связи между нейронами: const m.
Задаются положительные и отрицательные связимежду нейронами: const nn.
a4>0.
[size=20][color=maroon]6. Итерации основного цикла[/color][/size]
В работы программы по основному цикл, переменная i, последовательно заполняется матрица p[1..t1,1..n].
p[i,j] – вес нейрона j после итерации i.
Итерация.
Вес каждого нейрона увеличивается или уменьшается на сумму дуг в соответствии с матрицей s[1..n,1..n] от нейронов весом отличного от нуля.
Если вес нейрона при итерации превышает const z, весанейрона равен z.
Если сумма дуг с учётом знака менее const z1,вес нейрона равен z1.
Максимальное число итераций - const t1.
Если в ходе выполнения итераций на трех последовательных итерациях вес всех нейронов не меняется, вычисления заканчиваются.
Фиксируется ww = i-1.
[size=20][color=maroon]7. Итерации суперцикла[/color][/size]
Переменная суперцикла ij.
В ходе итераций суперцикла выполняются итерации основного цикла.
Диапазон изменения ij: v1 –v.
Заполняется массив s1[1..n].
Элемент s1 равен частному от деления на число нейронов – n суммы элементов строки wwматрицы p[1..n,1..n] при i =ij.
[size=20][color=maroon]8. Скачиваниие программы Б--АКСОН[/color][/size]
Программа АКСОН на Дельфи 7.
Ввод в программе –const.
Распечатка программы в WORD: Приложение 1.[/color][/size]
Для скачивания вариант с постоянными величинами вероятностей при разных входах в программу.
//initialization
//randomize;
Входные сигналы только с сигналом +.
Со знаком - заблокированы
Скачать программу Б--АКСОН
https://yadi.sk/d/ouwjDuZUQLzgVA
[size=20][color=maroon]Приложение 1[/color][/size]
программа WORD
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button5: TButton;
Label1: TLabel;
StringGrid2: TStringGrid;
StringGrid3: TStringGrid;
StringGrid4: TStringGrid;
Button4: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label4: TLabel;
Edit3: TEdit;
Label2: TLabel;
Label3: TLabel;
Label7: TLabel;
Label6: TLabel;
Edit4: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
n =300;// ÷ число нейронов
t1 =1500 ;//максимальное число итераций
a1 = 200;//абсолютный вес связи:аксон - дендрит
//вероятностное задание веса
a2 = 300;// абсолютный вес связи: аксон - дендрит
// вес постоянный
a3 =200;// вес входного сигнала
//вероятностное задание веса
a4=200 ;// постоянный вес входного сигнала
k=1 ;//переключатель связи аксон - дендрит
pp=1;//переключатель входного сигнала
v1 = 1;//
v=100;//формирование входного сигнала
//периодичность нулей
m=15;// отсутствие связи между нейронами
z= 300;// максимальный вес нейрона
z1= -300;// минимальный вес нейрона
nn=4;// связь аксон - дендрит
vv =5;// +- входной сигнал
jj = 7 ;// вывод входного сигнала ij = jj
var
Tick: Cardinal;
s:array [1..n, 1 ..n] of integer;// связи аксон - дендрит
p : array [1..t1,1..n] of integer;// состояние нейронов
f :array [1..n] of integer;// состояние входного сигнала
s1 : array [v1..v] of real; //
s2 :array [v1..v] of integer;//
s3 :array [v1..v] of integer;//
a, u, x,x1, c, b1,d1, t,d, g, q,i,j,h,i1,i2,hh : integer; //
j1,j2,j3,j4,j5,j6,j7,j8, i3,i4,i5,i6,i7,i8,i0: integer; //
w, e, e1, z2, z3: integer;//
m1 ,m2,m3,m4,m5, m6,m7 ,m8,m9,m10: integer;//
t3: integer;
ia, ib,ic, id ,it,iw, iu, ju, ja, jb, jc, jd ,jt, jw, ij : integer;//
zz ,ss,ww, sss, uu ,u1,u2,u3:integer;//
r, r1, r2, r3, r4, r5, r6:integer;//
ff ,tt ,c1, g1,cc,ccc, mm , kk:integer;//
l1, l2 ,l3,l4, r7, r8, r9: variant;//
p1,p2,p3,p4,p5,p6: real ; //
procedure TForm1.Button1Click(Sender: TObject);
// îêàíòîâêà
begin
for q:=1 to n //нумерация в горизонтали в табл. № 1 ,
do StringGrid1.Cells[q,0]:=IntToStr(q);
for q:=1 to 5// нумерация по вертикали в табл. № 1 ,
doStringGrid1.Cells[0,q]:=IntToStr(q);
for q:=1 to n // нумерация в горизонтали в табл. № 2
do StringGrid2.Cells[q,0]:=IntToStr(q);
for q:=1 to t1// нумерация по вертикали в табл. № 2
doStringGrid2.Cells[0,q]:=IntToStr(q);
for q:=1 to n // нумерация в горизонтали в табл. № 4
do StringGrid4.Cells[q,0]:=IntToStr(q);
for q:=1 to n// нумерация по вертикали в табл. № 4
doStringGrid4.Cells[0,q]:=IntToStr(q);
for q:=1 to n // нумерация в горизонтали в табл. № 3
do StringGrid3.Cells[q,0]:=IntToStr(q);
for q:=1 to n// нумерация по вертикали в табл. № 3
doStringGrid3.Cells[0,q]:=IntToStr(q);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
// формирование матрицы s
for i:=1 to n do
for j:= 1 to n do
if i<>jthen
begin
if k=1 thenbegin//a
s[i,j] := random ( a1);
mm:= random (nn);
if mm = 0 then s[i,j] := (- s[i,j]);
h:= random (m);
if h>3 then s[i,j] := 0;
end;//a
if k=2 thenbegin//b
s[i,j] := a2;
mm:= random (nn);
if mm = 0 then s[i,j] := (- s[i,j]);
h:= random (m);
if h>3 then s[i,j] := 0;
end;end;//b
for iu :=1 to n do
for ju := 1 to n do
begin
if s[iu,ju] >0 then u1 := u1 +1;
if s[iu,ju] =0 then u2 := u2 +1;
if s[iu,ju] <0 then u3 := u3 +1;
end;
//суперцикл
for ij := v1 to v do
// формирование входного сигнала
begin
m8:=0;m9:=0; m10 :=0;c:=0;r7:=0; r8:=0;w:=0;
for i:=1 to ndo
for j:=1 to ndo
p[i,j] := 0;
if pp = 1 then
for j:= 1 to n dobegin
W:=w+1;
f[j] := random ( a3);
hh:= random (vv);
d:=w mod ij ;
if d> 0 then f[j] := 0;
//if hh>3 then f[j] := -f[j];
end;
if pp=2 then
for j:=1 to ndo
begin
W:=w+1;
d:=w mod ij ;
if d = 0 then f[j] :=a4;
if d> 0 then f[j] := 0;
hh:= random (vv);
// if hh>3 then f[j] := -f[j];
end;
if ij = jj then
for j:= 1 to ndo
StringGrid1.Cells[j,1]:=
IntToStr( f[j]);
for jw :=1 to n dobegin
if f[jw]>0 then m8 := m8+1;
if f[jw]=0 then m9 := m9+1;
if f[jw]<0 then m10 := m10+1;
end;
// основной цикл
for j:=1 to ndo begin
p[1,j] := f[j] ;
end;
//основной цикл
for i:=1tot1 do
begin
c:= c+1;
if i>= 2 then begin
for ia:= 1 to n do
for ib := 1 to ndo
ifp[i-1,ib] <> 0
then if ib<>ia then
p[i,ia]:=p[i-1,ia]+ s[ib ,ia];
for it := 1 to ndobegin
if p[i,it]>z thenp[i,it]:=z;
if p[i,it]<z1 thenp[i,it]:=z1;
end;
kk:=0;
for iw:=1 to ndo
if(( p[c-3,iw]<>p[c-1,iw] )
or(p[c-1,iw]<>p[c,iw]) )then kk :=1;
if (kk =0)then begin uu:=777;ww:=c-1; break;end;
end;
end;
Form1.Caption:=IntToStr(GetTickCount-Tick);
for ic:=1 to ndobegin
if p[c-3,ic]= 0 then u:= u +1;
if p[c-3,ic]=z then x:= x +1;
if p[c-3,ic]=z1 then x1:= x1 +1;
ifp[c-3,ic]= a3 then ccc:= ccc +1;
if( ((p[c-3,ic]<>0) and ( p[c-3,ic]<>z))
and((p[c-3,ic]<>a3 ) and (p[c-3,ic]<>z1)) )
then g1:= g1+1;
if p[c,ic]= 0 then r:= r +1;
if p[c,ic]= z then e:= e +1;
if p[c,ic]= z1 then e1:= e1 +1;
ifp[c,ic]= a3 then cc:= cc +1;
if(((p[c,ic]<>0) and ( p[c,ic]<>z))
and((p[c,ic]<>a3 ) and ( p[c,ic]<>z1)))
then g:= g+1;
end;
t:= u+x+ccc+g;
for i:=1 to n do
for j:=1 to n do
begin
if s[i,j] = 0 then m1 := m1+1;
if s[i,j] >0 then m2 := m2+1 ;
if s[i,j] < 0 then m3 := m3+1 ;
if s[i,j] >0 then m4 := m4+s[i,j];
if s[i,j] <0 then m5 := m5+s[i,j];
END;
m7 := m1+m2+m3;
l1:=r/n;
l2:= e/n;
l3 := cc/n;
l4 := g/n;
r7:=0; r8 :=0;
for i:=1 to ndobegin
r7 := r7+ p[ww,i];
r8 := r8+ p[ww,i]*p[ww,i];
end;
p1:= r7/n;
p2:= r8/n;
p3:= Sqrt(p2);
s1[ij] := p1;
s2[ij] := ij;
s3[ij] := ww;
end;
for i:=1 to ndo
for j:=1 to ndo
StringGrid4.Cells[j,i]:=
IntToStr( s[i,j]);
for i:=1 to t1do
for j:= 1 to ndo
StringGrid2.Cells[j,i]:=
IntToStr( p[i,j]);
for j:= 1 to ndo
begin
StringGrid3.Cells[j,1]:=
FormatFloat('0.00',s1[j]);
StringGrid3.Cells[j,2]:=
IntToStr( s2[j]);
StringGrid3.Cells[j,3]:=
IntToStr( s3[j]);
end;
Edit1.Text := 'm='+'---'+IntToStr(m)+''+
'n='+'---'+IntToStr(n)+''+
't1='+'---'+IntToStr(t1)+''+
'a1='+'---'+IntToStr(a1)+''+
'a2='+'---'+IntToStr(a2)+''+
'a3='+'---' +IntToStr(a3)+''+
'k='+'---' +IntToStr(k)+''+
'nn='+'---' +IntToStr(nn) +''+
'v='+'---' +IntToStr(v)+''+
'c='+'---' +IntToStr(c) +''+
'z='+'---' +IntToStr(z)
+''+
'm8='+'---' +IntToStr(m8)+''+
'm9='+'---' +IntToStr(m9) +''+
'm10='+'---' +IntToStr(m10);
Edit2.Text := 'r='+'---'+IntToStr(r)+''+
'e='+'---'+IntToStr(e)+'' +
'e1='+'---'+IntToStr(e1)+'' +
'cc='+'---'+IntToStr(cc)+'' +
'g='+'---'+IntToStr(g)+'' +
't='+'---'+IntToStr(t)+'' +
'u='+'---'+IntToStr(u)+'' +
'x='+'---'+IntToStr(x)+'' +
'x1='+'---'+IntToStr(x1)+'' +
'ccc='+'---'+IntToStr(ccc)+'' +
'g1='+'---'+IntToStr(g1)
+''+
'ff='+'---'+IntToStr(ff)
+'' +
'u1='+'---'+IntToStr(u1)+'' +
'u2='+'---'+IntToStr(u2)
+''+
'u3='+'---'+IntToStr(u3);
Edit3.Text :=
'l1='+'---'+FormatFloat('0.000',l1)+'' +
'l2='+'---'+FormatFloat('0.000',l2)+'' +
'l3='+'---'+FormatFloat('0.000',l3) +'' +
'l4='+'---'+FormatFloat('0.000',l4) +'' +
'tt='+'---'+IntToStr(tt)+'' +
'uu='+'---'+IntToStr(uu)+''+
'ww='+'---'+IntToStr(ww)+''+
'm1='+'---'+IntToStr(m1)+'' +
'm2='+'---'+IntToStr(m2)+'' +
'm3='+'---'+IntToStr(m3)+'' +
'm4='+'---'+IntToStr(m4)+'' +
'm5='+'---'+IntToStr(m5)
+'' +
'm7='+'---'+IntToStr(m7);
Edit4.Text :=
'r7='+'---'+IntToStr(r7)+'' +
'r8='+'---'+IntToStr(r8)
+'' +
'p1='+'---'+FormatFloat('0.000',p1) +'' +
'p2='+'---'+FormatFloat('0.000',p2)
+'' +
's1[v1]='+'---'+FormatFloat('0.000',s1[v1])
+'' +
's1[v1+1]='+'---'+FormatFloat('0.000',s1[v1+2])
+'' +
's1[v-1]='+'---'+FormatFloat('0.000',s1[v-1])
+'' +
's1[v]='+'---'+FormatFloat('0.000',s1[v]);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
end;
////////////////////////////////////////////////////////////////
procedure TForm1.Button5Click(Sender: TObject);
begin
close
end;
//initialization
//randomize;
end.
Дед, если бы ты хотел обсудить свои программы, другое дело. А так тонны непонятного мусора, с битыми ссылками.
Ты ссылки то свои хоть проверяй. Какой смысл? Как на всём этом можно заработать? Объясняй дед, пока живой...

////////////////////////////////////////////////////////////////////////////////////////////////////
[size=28][color=red]Программа «2МЕДИАНА»[/color][/size]
[size=20][color=maroon]
Предисловие
1. Определения
2.Математика
3. Структура программы
4. Алгоритм программы по части 1
5.Алгоритм программы по части2
6.Алгоритм программы по части3
7. Вывод
8. Результат
9. Скачать программу «2Медиана»
Приложение 1
Распечатка программы «2МЕДИАНА»
[/color][/size]
[size=20][color=maroon] ПРЕДИСЛОВИЕ[/color][/size]
В дереве исследуется вершина с minmax расстоянием до вершин дерева.
Проведено моделирование и расчёт по формуле.
[size=20][color=maroon]
1. Определения. [/color][/size]
Дерево - связный граф без циклов.
Смежные вершины связаны неориентированным ребром или двумя противоположно направленными дугами.
В зависимости от решаемой задачи используются оба варианта.
Висячая вершина, вершина инцидентная только одному ребру (паре дуг).
Расстояние между двумя вершинами i и j равно сумме рёбер (дуг) по пути между этими вершинами.
Обозначается, как l(i,j).
Новая вершина дерева вводится на ребре между двумя смежными вершинами исходного дерева.
Если исходные вершины i и j, то для вновь введенной вершины k выполняется
l(l ,k) + l(k, j) = l(i, j)
[size=20][color=maroon]
2. Математика [/color][/size]
2.1. Медиана дерева.
Медиана - вершина исходного дерева или новая вершина, максимальное расстояние которой до остальных вершин дерева– минимально.
2.2. Нахождение медианы
Для нахождения медианы использован следующий алгоритм.
Шаг 1. Произвольно выбирается одна из висячих вершин - А
Шаг 2. Из вершины А определяетсярасстояние (сумма длин рёбер)до всех висячих вершин.
Шаг 3. Находится вершина Б с максимальным расстояниемl(А –Б).
Если таких вершиннесколько выбирается произвольно одна .
Шаг 4. Находится вершина В с максимальным расстоянием l(Б-В).
Шаг 5. Медиана есть вершина Г, которая лежит на пути Б-В и
l(Б,Г)= l(Г,В)=zg.
[size=20][color=maroon]
3. Структура программы [/color][/size]
3.1. Три части программы
Программа 1МЕДИАНА из трёх частей.
Часть 1
Программа «А - дерево» формирует случайное дерево.
Программа А-Дерево по ссылке
https://fguploniis.mybb.ru/viewtopic.php?id=1025
Часть 2
Находится вершина -медиана дерева.
Часть 3
Вычисление средних величин по циклам суперцикла.
Для набора статистики введен суперцикл.
Результаты суммируются и усредняются.
На каждом шаге суперцикла выполняются три операции.
А) Формируется случайное дерево ( Часть 1).
Б) Для случайного дерева находится медиана ( Часть 2).
По данным циклов суперцикла вычисляются средние величины (Часть 3)
3.3. Исходные данные для расчёта вводятся в текст программы (const)
Это:
x - число циклов суперцикла
n - число вершин исходного дерева
zs- задание средней длины ребра
at- корень степени
[size=20][color=maroon]
3. Алгоритм программы по части 1 [/color][/size]
Алгоритм программы по части 1 повторяет программу А-Дерево.
[size=20][color=maroon]
4.Алгоритм программы по части 2 [/color][/size]
Шаг 1
Вычисляется длины ребер (дуг) на основе средней длины ребра - zc.
Шаг 2
Выбирается случайно висячая вершина А (za)
Шаг 3
Находится вершина Б (zm).
l(А,Б) максимально по множеству вершин дерева
Построение матрицы pb
Матрица содержит информацию о направлении дуг при поиске расстояния от вершины А.
Для таких дуг, как метка, показана их длина.
Шаг 4
Находится вершина В(zf)
l(Б,В) максимально по множеству вершин дерева
Построение матрицы pc.
Матрица содержит информацию о направлении дуг при поиске расстояния от вершины Б.
Для таких дуг, как метка, показана их длина.
Шаг 5
Из вершины В определяется расстояниедо остальных вершин графа.
Находится вершина Б(zy).
l(В,Б) максимально по множеству вершин дерева
Построение матрицы pd.
Матрица содержит информацию о направлении дуг при поиске расстояния от вершины Б.
Для таких дуг, как метка, показана их длина.
Шаг 6
Находится матрица pv.
Матрица содержит только дуги по пути от Б к В и от В к Б.
Шаг 7
Находятся вершины на пути из Б в В.
Это осуществляется так.
Ведется поиск расстояний от В к Б только по дугам пути Б – В.
Шаг 8
Находится медиана – вершина x1.
Максимальное расстояние медианы до вершин дерева – zg.
Таких вершин две и более.
[size=20][color=maroon]
6.Алгоритм программы по части3 [/color][/size]
for i:=1 to x do
w1 := w1 + ww;
w2:= w1/x;
w3 := w2/(n);
w4:= w2/(zs);
w5:= w2/(zs*exp(1/at*ln(n)) );
На каждом цикле суперцикла находится величина zg .
zg = minmax l(x1, множество вершин дерева).
x1 - медиана
Сумма zg по всем циклам суперцикла - w1.
Усредненное по числу циклов - w2.
Усредненное по числу циклов и числу вершин дерева - w3.
Усредненное по числу циклов и средней длине ребра - w4.
Усреднено по числу циклов, средней длине ребра и делится на корень
1.75 (7/4)- w5.
Переменнаяw5 приx>50,zs>=10 и n>=100 слабо меняется при изменении n.
Отсюда принято
1,22 = zg:(zs * корень 1, 75 из n)
zg = 1,22 : (zs * корень 1, 75 из n) (1)
u1 расчёт zg по формуле (1).
u2 погрешность при расчётах по программе и по формуле.
u2 := (u1 - w2):u1;
[size=20][color=maroon]7.Вывод[/color][/size]
[color=blue][size=18]Выводятся следующие результаты в форме массивов
Переменных.
Назначение массивов в распечаткепрограммы – Приложение1.
Вывод переменных по расчёту медианы:
Edit 1 и Edit 2
Вывод переменных по расчёту случайного дерева:
Edit 3 и Edit 4
Основные переменные по
Вывод переменных по расчёту случайного дерева:
Edit 1 иEdit 2
Основные переменные по
Edit 1
y1=---0y2=---32y3=---88y4=---14y5=---72w2=---1131,700w3=---22,634w4=---11,317w5=---1,210u1=---1122,073u2=----0,009
Где
y1 – номер вершины, если медиана совпадает с вершиной.
И y=0, если не совпадает.
y2, y4 ребро, на котором введена медиана
y3, y5 длины ребер y2-медиана и медиана - y4
w2, w3, w4, w5, u1 u2 см. в разделе 6[/color=blue][/size=18]
[color=blue][size=18]Основные переменные по
Edit 2
za=---36zb=---18zc=---11zv=---11zn=---1442zm=---13zd=---2116zf=---14zg=---1058zq=---49zw=---49ze=---49zr=---2116zt=---0zy=---13x0=---113,15
za – вершина А
zn – l(А,Б)
zm – вершина Б
zf- вершинаВ
zd- l(Б,В)
zg -l(Б,В):2[color=blue][size=18]
[size=20][color=maroon]8.Результат[/color][/size]
Результаты расчёта по программе и формуле показали близкое совпадение.
Nu2
500,046
1000,008
2000,038
3000,029
4000,042
5000,069
600-0,021
700-0,007
800-0,012
900-0,002
1000-0,077
[size=20][color=maroon]
9. Скачать программу «2МЕДИАНА» [/size=20][/color=maroon]
https://disk.yandex.ru/d/b7WMbTGfVYohqg
////////////////
////////
[size=20][color=maroon]
Приложение 1 [/color][/size=20]
Распечатка программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
Button5: TButton;
Label1: TLabel;
StringGrid3: TStringGrid;
StringGrid4: TStringGrid;
Edit1: TEdit;
Edit2: TEdit;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label8: TLabel;
Label10: TLabel;
Edit3: TEdit;
Label11: TLabel;
StringGrid2: TStringGrid;
Label7: TLabel;
Label9: TLabel;
StringGrid5: TStringGrid;
StringGrid6: TStringGrid;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Edit4: TEdit;
StringGrid7: TStringGrid;
Label16: TLabel;
StringGrid8: TStringGrid;
StringGrid9: TStringGrid;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
StringGrid10: TStringGrid;
Label20: TLabel;
Label21: TLabel;
Label22: TLabel;
Label23: TLabel;
Label24: TLabel;
Label25: TLabel;
Label26: TLabel;
Label28: TLabel;
procedure Button1click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
x=20;// число суперциклов
n=100;//число вершин
zs =100;//задание длины рёбер
at =1.75;// корень степени
var
Tick: Cardinal;
u:array [ 1..n, 1 ..n] of integer;//матрица фрагментов дерева при выполнении
//основного циклана пследнем цикле суперцикла
p : array [1..2*n,1..n] of integer;//матрица инциденций дуг
// на последнем цикле суперцикла
uu :array [1..5*n] of integer;//мартица номеров фрагментов
//по номерам циклов основного цикла на последнем цикле суперцикла
ua :array [1..5*n] of integer;//мартица номеров фрагментов
// по порядковому номеру объединения на последнем цикле суперцикла
r :array [1..n] of integer;// integer;//матрица инциденцийчисла дуг
//исходящих из вершин деревапосле последнего цикла суперцикла
pa :array [1..n, 1 ..n] of integer;//матрицадлин рёбер
pb :array [1..n, 1 ..n] of integer;//матрицарасстояний от вершины А
pc :array [1..n, 1 ..n] of integer;//матрицарасстояний от вершины Б
pd:array [1..n, 1 ..n] of integer;//матрицарасстояний от вершины В
pv :array [1..n, 1 ..n] of integer;//матрица
s1:array [1..n] of integer;// матрица суммы исходящих дуг
// с разбивкой по числу дуг инцидентных вершинам: 1,2, 3 ...n-1.//
s2:array [1..n] of variant;/// Число дуг в массиве S1 делится
//на число циклов в суперцикле
s3:array [1..n] of variant;//Число дуг в массиве S1 делится
//произведение число циклов в суперциклеи числа вершин.
// Ччисло циклов в суперцикле
ra : array [1..n] of integer;// матрица расстояний отвершины А
rb:array [1..n] of integer;//номера итераций при нахождении
//растояний от вершины А
rc:array [1..n] of integer;// матрица расстояний отвершины Б
rw:array [1..n] of integer;// /номера итераций при нахождении
//растояний от вершины Б
rd:array [1..n] of integer;// матрица расстояний отвершины В
rf:array [1..n] of integer;//номера итераций при нахождении
//растояний от вершины В
r1:array [1..n] of integer;//матрица расстояний
// на пути из вершины Б в В
r2:array [1..n] of integer;// номера итераций
// на пути изБ в В
r3:array [1..n] of integer;// перечень расстояний
// на пути из Б в В
r4:array [1..n] of integer;// перечень вершин
ww:array [1..x] of real; //
// на пути изБ в В
a, b, k, g, h, h1, q,i,j: integer; //
j1,j2,j3,j4,j5,j6,j7,j8,i2,i1,e, i3,i4,i5,i6,i7,i8,i9,i0: integer; //
m, aa, bb, z, f, c, w,v: integer;//
m1 ,m2,vv: integer;//
kk,ii , jj,t1, k1: integer;//
ia, ib, ic ,id,iw,ie, ja, jb,jc,jd,jw,je,jk : integer;//
za, zb, zc, zv, zn, zm,zd, zf, zg, zh, zk, zq, zw, ze, zr,zt,zy: integer;//
a1,tt: integer;//
z1, z2,z3: integer;//
x1, x2,x3,x4, y1,y2, y3, y4, y5: integer;//
x0, w1, w2,w3,w4, w5 :real; //
h2: variant;//
u1, u2, u3: real ;// вычислено по формуле
procedure TForm1.Button1click(Sender: TObject);
// окантовка
begin
begin
for q:=1 to n //нумерация по горизонтали в табл №1 ,
do StringGrid1.Cells[q,0]:=IntToStr(q);
for q:=1 to n// нумерация по вертикалив табл №1 ,
doStringGrid1.Cells[0,q]:=IntToStr(q);
for q:=1 to 42 //нумерация по горизонтали в табл №2,
do StringGrid2.Cells[q,0]:=IntToStr(q);
for q:=1 to 50// нумерация по вертикалив табл №2 ,
do StringGrid2.Cells[0,q]:=IntToStr(q);
for q:=1 to 3*n //нумерация по горизонтали в табл №3,
do StringGrid3.Cells[q,0]:=IntToStr(q);
for q:=1 to 25// нумерация по вертикалив табл №3 ,
doStringGrid3.Cells[0,q]:=IntToStr(q);
for q:=1 to n //нумерация по горизонтали в табл №4,
do StringGrid4.Cells[q,0]:=IntToStr(q);
for q:=1 to 2*n// нумерация по вертикалив табл №4 ,
doStringGrid4.Cells[0,q]:=IntToStr(q);
for q:=1 to n //нумерация по горизонтали в табл №1 ,
do StringGrid5.Cells[q,0]:=IntToStr(q);
for q:=1 to n// нумерация по вертикалив табл №1 ,
doStringGrid5.Cells[0,q]:=IntToStr(q);
for q:=1 to 50 //нумерация по горизонтали в табл №1 ,
do StringGrid6.Cells[q,0]:=IntToStr(q);
for q:=1 to 2*n// нумерация по вертикалив табл №1 ,
doStringGrid6.Cells[0,q]:=IntToStr(q);
for q:=1 to n //нумерация по горизонтали в табл №1 ,
do StringGrid7.Cells[q,0]:=IntToStr(q);
for q:=1 to n// нумерация по вертикалив табл №1 ,
doStringGrid7.Cells[0,q]:=IntToStr(q);
for q:=1 to n //нумерация по горизонтали в табл №1 ,
do StringGrid8.Cells[q,0]:=IntToStr(q);
for q:=1 to n// нумерация по вертикалив табл №1 ,
doStringGrid8.Cells[0,q]:=IntToStr(q) ;
for q:=1 to n //нумерация по горизонтали в табл №1 ,
do StringGrid9.Cells[q,0]:=IntToStr(q);
for q:=1 to n// нумерация по вертикалив табл №1 ,
doStringGrid9.Cells[0,q]:=IntToStr(q) ;
for q:=1 to n //нумерация по горизонтали в табл №1 ,
do StringGrid10.Cells[q,0]:=IntToStr(q);
for q:=1 to n// нумерация по вертикалив табл №1 ,
doStringGrid10.Cells[0,q]:=IntToStr(q)
end;
//суперцикл
for m:=1 to xdo
begin
/////////////////////////////////
// обнуление
za:=0;zb:=0;zc:=0;zv:=0;zn:=0;zm:=0;
zd:=0;zf:=0;zg:=0;zh:=0;zk:=0;zq:=0;
zw:=0;zr:=0;zt:=0;zy:=0;Ze:=0;
x0:=0;z1:=0; Z2:=0; Z3:=0;
f:=0;
for i:=1 to n do
for j:= 1 to n dobegin
pa[i,j] :=0;
pb[i,j] :=0;
pc[i,j] :=0;
pd[i,j] :=0;
pv[i,j] :=0;
end;
for i:=1 to n do
begin
ra:=0;
rb:=0;
rc:=0;
rw:=0 ;
rd:=0;
rf :=0;
r1:=0;
r2 :=0;
r3 :=0;
r4 :=0;
end;
////////////////////////////////////////
////////////////////////////////////////////////////////
////////////////////////////////////
//ЧАСТЬ 1
//нахождение случайного дерева
// обнуление
for id:=1 to 2*n do
for jd:=1 to n do
p[id,jd] :=0;
for iw := 1 to n do
for jw :=1 to n do
u[iw,jw] :=0;
for ie :=1 to 5*n do
uu[ie] :=0;
for ie :=1 to 5*n do
ua[ie] :=0;
for ie := 1 to n do
r[ie] := 0;
// исходные фрагменты
begin
for i:=1 to ndo
for j:=1 to ndo
if i=j thenp[i,j] :=1;
for i:= 1 to n do uu := 1;
for w:= 1 to (n-1) do// основной цикл
begin
Form1.Caption:=IntToStr(GetTickCount-Tick);
for i5 := 1 to 2do// пара фрагментов
begin // двойка
if i5 = 2 then//
C:=c+1;
//выбор фрагмента
V:=0;a:=0;
for i1 := 1 to (2*n) do
if uu[i1] >0 then
beginv:= v+1;
a:=random(v)+1;
end;
Z :=0;i2:=0;k:=0;
repeatbegin i2:= i2+1;k:=i2;
ifuu[i2] >0 then
z:= z+1 ; end;
until (z=a) ;
if i5 = 1 thenm1 := k;
if i5 = 2 thenm2 :=k;
if m=x then
begin
f:= f+1;
ua[f] :=k;
end;
//объединение фрагментов
vv := 0;
for i3 := 1 to n do
if p[k,i3]>0 then begin
vv:= vv+1;
p[w+n,i3]:=vv;
end;
//////////////////////////////////
//ввод ребра между соединяемыми фрагментами
//////////////////////////////// ii
begin
if i5 =1 then
begin
I7:=0;kk:= 0;; tt := 0;ii :=0;
for i6:=1 to n do
ifp[m1,i6]>0 thenkk := kk +1;
aa := random (kk) +1;
repeat
begin
Form1.Caption:=IntToStr(GetTickCount-Tick);
i7 := i7+1;
if p[m1,i7] >0 then tt:= tt+1; end;
until tt =aa;
end;
ii :=i7;
///////////////////////////////////
if i5 =2 then
begin
i0 := 0;k1:=0;t1:=0;jj:=0;
for i9:=1 to n do
ifp[m2,i9]>0 thenk1 := k1 +1;
bb := random (k1) +1;
repeat
begin
Form1.Caption:=IntToStr(GetTickCount-Tick);
i0 := i0+1;
if p[m2,i0] >0 then t1:= t1+1; end;
until t1 =bb;
jj :=i0;
u[ii,jj] := w;
u[jj,ii] := u[ii,jj];
end;
end;
/////////////////////////////////
if i5=2 then
uu[w+n] := w;
uu[k] := -w;
end ;
end;
h:=0;
for ia := 1 to n do
forja := 1 to n do
if u[ia,ja] >0 then
r[ia] := r[ia]+1;
for i:=1 to ndo
h := h+ r ;
for ib := 1 to n do
forjb := 1 to n do
if r[ib] = jb then s1[jb] := s1[jb] +1;
end;
/////////////////////////
for i:=1 to ndo
s2 := s1/x;
e:= h div 2;
for ic:=1 to n do
s3[ic] :=s1[ic]/(x*n);
for i:= 1 to n do
h1 := h1 + s1*i;
h2 := h1/x;
// ЧАСТЬ 2
// Нахождение медианы
begin
//Шаг1
//Расчёт длин рёбер
for i:=1 to n do
for j:=1 to n do
if j<ithen
if u[i,j]> 0 then
begin
pa[i,j] := (random (zs)+1)*2;
pa[j,i] := pa[i,j];
end;
//шаг 2
// Нахождение вершины А
for i:=1 to ndo
if r =1 thenzb:=zb+1;
zc:= random (zb) +1;
for i:=1 to n do begin
Form1.Caption:=IntToStr(GetTickCount-Tick);
if r =1 thenzv :=zv +1;
if zv = zc then
begin
za := i;break
end;
end;
/////
//Шаг 3
//Находится вершина Б (zm).
//l(А,Б) максимально по множеству вершин дерева
//Построение матрицы pb
//Матрица содержит информацию о направлении дуг при поиске расстояния от вершины А.
//Для таких дуг, как метка, показана их длина.
ra[za] := 100;
for ie := 1 to n-1 do
begin
Form1.Caption:=IntToStr(GetTickCount-Tick);
for i:=1 to n do
for j:=1 to n do
ifpa[i,j]>0then
if ((ra>0) and (ra[j] =0))
then
begin
ra[j] := (ra + pa[i,j]); zq:= zq+1;
pb[i,j] := pa[i,j]; rc[j] := zq;
end;
end;
for i:=1 to n do ra:= ra -100;
//нахождение вершины Б
zn := ra[1]; zm :=1;
for i:=1 to n-1do
if ra[i+1]> zn then
begin zn := ra[i+1] ;
zm :=i+1 ;
end ;
//Шаг 4
//Находится вершина В(zf)
//l(Б,В) максимально по множеству вершин дерева
//Построение матрицы pc.
//Матрица содержит информацию о направлении дуг при поиске расстояния от вершины Б.
//Для таких дуг, как метка, показана их длина.
rb[zm] := 100;
for ie := 1 to n-1 do begin
Form1.Caption:=IntToStr(GetTickCount-Tick);
for i:=1 to n do
for j:=1 to n do
if pa[i,j]>0 then
if ((rb>0) and (rb[j] =0))
then begin rb[j] := (rb + pa[i,j]) ;zw := zw +1;
pc[i,j] := pa[i,j];rw[j]:=zw;
end;
end;
for i:=1 to n do rb:= rb -100;
//построение матрицы pd
zd := rb[1]; zf :=1;
for i:=1 to n-1do
if rb[i+1]> zd then
begin zd := rb[i+1] ;
zf :=i+1
end ;
// Шаг 5
//Из вершины В определяется расстояниедо остальных вершин графа.
//Находится вершина Б(zy).
//l(В,Б) максимально по множеству вершин дерева
//Построение матрицы pd.
//Матрица содержит информацию о направлении дуг при поиске расстояния от вершины Б.
//Для таких дуг, как метка, показана их длина.
rd[zf] := 100;
for ie := 1 to n-1 do begin
Form1.Caption:=IntToStr(GetTickCount-Tick);
for i:=1 to n do
for j:=1 to n do
if pa[i,j]>0 then
if ((rd>0) and (rd[j] =0))
then begin rd[j] := (rd + pa[i,j]) ; ze := ze +1;
pd[i,j] := pa[i,j]; rf[j] := ze;
end;
end;
for i:=1 to n do rd:= rd -100;
// Нахождение вершины Б
zr := rd[1]; zy :=1;
for i:=1 to n-1do
if rd[i+1]> zr then
begin zr := rd[i+1] ;
zy :=i+1
end ;
///////////////////////////////////////////////////////////
//////////////////////////////////////////
/////////////////////////////////////////////////////////////
zg := zd div 2;
//
x0 := zg/exp(1/at*ln(n));
//// сбор статистики
ww[m]:=zg ;
//Шаг 6
//Находится матрица pv.
//Матрица содержит только дуги по пути от Б к В и от В к Б.
for i:=1 to n do
for j:=1 to n do
begin
ifpc[i,j] = pd[j,i] then pv[i,j] := pa[i,j]
end;
// Шг 7
///////////// повторно расстояния от вершины В
//по матрице pv
// нахождение вершин в пути Б-В
// Ведется поиск расстояний от В к Б только по дугам пути Б - В.
r1[zy] := 100;
for ie := 1 to n-1 do begin
Form1.Caption:=IntToStr(GetTickCount-Tick);
for i:=1 to n do
for j:=1 to n do
if pv[i,j]>0 then
if ((r1>0) and (r1[j] =0))
then begin r1[j] := (r1 + pv[i,j]) ;z1 := z1 +1;
r2[j] := z1;
end;
end;
for i:=1 to n do
if r1<>zq then
r1:= r1 -100;
// Нахождение вершины В
z2 := r2[1]; z3 :=1;
for i:=1 to n-1do
if r2[i+1]> z2 then
begin
Form1.Caption:=IntToStr(GetTickCount-Tick);
z2 := r2[i+1] ;
z3 :=i+1
end ;
////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
// Шаг 8
//Находится медиана - вершина x1.
//Максимальное расстояние медианы до вершин дерева - zg.
//Таких вершин две и более.
for i:=1 to n do
if r2>0 thenbegin
Form1.Caption:=IntToStr(GetTickCount-Tick);
r3[r2+1] := r1 ;
r4[r2+1] := i ;
end;
r4[1] := zy;
for i:=1 to n do
ifzg = r3 then y1 :=r4;
if y1 =0 then
for i:=1 to n-1 do
if (zg>r3) and (zg< r3[i+1]) then
begin y2 := r4 ;
y3 := zg- r3;
y4 := r4[i+1];
y5 := r3[i+1]-zg;
end;
end;
end;// суперцикл конец
// Обработка статистики
////
////
for i:=1 to x do
w1 := w1 + ww;
w2:= w1/x;
w3 := w2/(n);
w4:= w2/(zs);
w5:= w2/(zs*exp(1/at*ln(n)) );
w5:= w1/(zs*x*exp(1/at*ln(n)) );
//Эмпирическая формула (1)
u1 := 1.22* (zs*exp(1/at*ln(n)));
u2 := (u1 - w2)/u1;
/////////////////////////////
for i:=1 to ndo
for j:= 1 to ndo
StringGrid5.Cells[j,i]:=
IntToStr( pa[i,j]);
for i:=1 to ndo
StringGrid2.Cells[i,3]:=
IntToStr( r);
for i:=1 to 2*ndo
StringGrid2.Cells[i,1]:=
IntToStr( ua);
for i:=1 to ndo
StringGrid2.Cells[i,5]:=IntToStr(s1);
for i:=1 to ndo
StringGrid2.Cells[i,6]:=FormatFloat('0.0000',s2);
for i:=1 to ndo
StringGrid2.Cells[i,7]:=FormatFloat('0.0000',1000*s3);
for i:=1 to ndo
for j:= 1 to ndo
StringGrid1.Cells[j,i]:=
IntToStr( u[i,j]);
for i:=1 to 2*ndo
for j:= 1 to ndo
StringGrid4.Cells[j,i]:=
IntToStr( p[i,j]);
for i:=1 to 2*ndo
StringGrid3.Cells[i,1]:=
IntToStr( uu);
////////////////
Edit1.Text :=
'y1='+'---'+IntToStr(y1)+''+
'y2='+'---'+IntToStr(y2)+''+
'y3='+'---'+IntToStr(y3)+''+
'y4='+'---'+IntToStr(y4) +''+
'y5='+'---'+IntToStr(y5)+''+
//'w1='+'---'+FormatFloat('0.0',w1)+''+
'w2='+'---'+FormatFloat('0.000',w2) +''+
'w3='+'---'+FormatFloat('0.000',w3)+''+
'w4='+'---'+FormatFloat('0.000',w4)+''+
'w5='+'---'+FormatFloat('0.000',w5)+''+
' u1='+'---' +FormatFloat('0.000',u1)+'' +
'u2='+'--'+FormatFloat('0.000',u2);
Edit2.Text :=
'za='+'---'+IntToStr(za)+''+
'zb='+'---'+IntToStr(zb)+''+
'zc='+'---'+IntToStr(zc) +'' +
'zv='+'---'+IntToStr(zv) +'' +
'zn='+'---'+IntToStr(zn)+'' +
'zm='+'---'+IntToStr(zm) +'' +
'zd='+'---'+IntToStr(zd)+'' +
'zf='+'---'+IntToStr(zf) +'' +
'zg='+'---'+IntToStr(zg) +'' +'zq='+'---'+IntToStr(zq) +'' +
'zw='+'---'+IntToStr(zw)+'' +
'ze='+'---'+IntToStr(ze) +'' +
'zr='+'---'+IntToStr(zr)+'' +
'zt='+'---'+IntToStr(zt) +'' +
'zy='+'---'+IntToStr(zy)+'' +
'x0='+'---'+FormatFloat('0.00',x0);
Edit3.Text := 'kk='+'---'+IntToStr(kk)+''+
'aa='+'---'+IntToStr(aa)+'' +
'bb='+'---'+IntToStr(bb)+''+
'tt='+'---'+IntToStr(tt)+'' +
'ii='+'---'+IntToStr(ii)+'' +
'jj='+'---'+IntToStr(jj)+'' +
'k1='+'---'+IntToStr(k1)+''+
't1='+'---'+IntToStr(t1)+''+
'f='+'---'+IntToStr(f)+''+
'e='+'---'+IntToStr(e)+''+
'h='+'---'+IntToStr(h)+''+
't1='+'---'+IntToStr(t1)+''+
'k='+'---'+IntToStr(k) +''+
'w='+'---'+IntToStr(w)+''+
'c='+'---'+IntToStr(c)+''+
'z='+'---'+IntToStr(z)+''+
'v='+'---'+IntToStr(v)+' '+
'a='+'---'+IntToStr(a);
Edit4.Text :=
'm1='+'---'+IntToStr(m1)+''+
'm2='+'---'+IntToStr(m2) +''+
'i1='+'---'+IntToStr(i2) +''+
'i2='+'---'+IntToStr(i3) +''+
'i4='+'---'+IntToStr(i4) +''+
'i5='+'---'+IntToStr(i5)+''+
'i6='+'---'+IntToStr(i6)+''+
'i7='+'---'+IntToStr(i7) +''+
'i8'+'---'+IntToStr(i8) +''+
'i9='+'---'+IntToStr(i9)+''+
'i0='+'---'+IntToStr(i0) +''+
'h='+'---'+IntToStr(h) +''+
'h1='+'---'+IntToStr(h1) +''+
'h2='+'---'+FormatFloat('0.00',h2);
///////////////////////////////////////
for i:=1 to xdo
StringGrid6.Cells[i,11]:= FormatFloat('0.00',ww) ;
for i:=1 to ndo
for j:= 1 to ndobegin
StringGrid9.Cells[j,i]:=
IntToStr( pa[i,j]);
StringGrid7.Cells[j,i]:=
IntToStr( pb[i,j]);
StringGrid8.Cells[j,i]:=
IntToStr( pc[i,j]);
StringGrid5.Cells[j,i]:=
IntToStr( pd[i,j]);
StringGrid10.Cells[j,i]:=
IntToStr( pv[i,j]);
end;
for i:=1 to ndobegin
StringGrid6.Cells[i,1]:=IntToStr(ra);
StringGrid6.Cells[i,2]:=IntToStr(rc);
StringGrid6.Cells[i,3]:=IntToStr(rb);
StringGrid6.Cells[i,4]:=IntToStr(rw);
StringGrid6.Cells[i,5]:=IntToStr(rd);
StringGrid6.Cells[i,6]:=IntToStr(rf);
StringGrid6.Cells[i,7]:=IntToStr(r1);
StringGrid6.Cells[i,8]:=IntToStr(r2);
StringGrid6.Cells[i,9]:=IntToStr(r3);
StringGrid6.Cells[i,10]:=IntToStr(r4);
end;
end;
////////////////////////////////////////////////////////////////
procedure TForm1.Button5Click(Sender: TObject);
begin
close
end;
initialization
randomize;
end.
научитесь пользоваться гитхабом, тогда возващайтесь. А эти простыни здесь не нужны
Фашизм будет разбит
Человека карают только те боги, в которых он верит