#_Lib_Kohhen.mq4

Author: Copyright � 2008, MetaQuotes Software Corp.
#_Lib_Kohhen.mq4
0 Views
0 Downloads
0 Favorites
#_Lib_Kohhen.mq4
//+------------------------------------------------------------------+
//|                                                 #_Lib_Kohhen.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#property library
//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
#define  MAXDISTANCE    100000000000
#define  RAND_MAX       32767

static double     InFreshold=0.0;
static double     MaxDistance=MAXDISTANCE;
static int        Accreditation=0;
static double     LearnRate=0.25;
static int        Inhibition=0;
static int        MAX_INP;                          //×èñëî âõîäîâ â ñåòü
static int        MAX_NEURON;                       //×èñëî íåéðîíîâ â ñåòè
double            delta[];                         //îáó÷åíèå
double            inhibitory[];                    //Òîðìîæåíèå íåéðîíà

//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
static int dx=0,dy=0;   //Ðàçìåð êàðòû
int imax;               //Íåéðîí ïîáåäèòåëü
int nx =0,ny=0;         //Åãî êîîðäèíàòû


void SetSizeNet(int inp, int neur)
{
   MAX_INP =inp;
   MAX_NEURON = neur;
   ArrayResize(delta,MAX_NEURON);
   ArrayResize(inhibitory,MAX_NEURON);
   for(int i=0;i<MAX_NEURON;i++)inhibitory[i]=0;
}
void SetShowDim(int _DX, int _DY){dx=_DX; dy=_DY;}
// çàäàåì íà÷àëüíîå óñëîâèå äëÿ ÃÑ×
void srand(){MathSrand(TimeLocal());}
//
double SetLearnRateUL(double lr){double a;a=LearnRate;LearnRate=lr;return (a);}
// èñïîëüçóåì ãàóññèàí äëÿ îïðåäåëåíèÿ ôîðìû
// îáëàñòè îáó÷åíèÿ è ýôôåêòèâíîñòè âîçäåéñòâèÿ
void SetAccreditationUL(int ac){ Accreditation=ac;}
// ÷èñëî öèêëîâ íà êîòîðûå íåéðîí òîðìîçèòñÿ
// ïîñëå âîçáóæäåíèÿ
void SetInhibitionUL(int in){Inhibition=in;}
// ïîðîã âîçáóæäåíèÿ, èíèöèèðóþùèé òîðìîæåíèå
double SetInhibitionFreshold(double f){double a;a=InFreshold;InFreshold=f; return (a);}
//
double SetMaxDistanceUL(double md){double a;a=MaxDistance;if(md<1.0) Accreditation=0;MaxDistance=md;return (a);}
//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
//Çàïîëíÿåì âåñà ñëó÷àéíûìè âåëè÷èíàìè
void LayerUL_Randomize(double & n[][],double range)
{
   int i,j;
   double p=0.0001;
   for( i=0; i<MAX_NEURON;i++ )
     { for( j=0; j<MAX_INP;j++ )
        {
         n[i][j] =( p+ range*MathRand()/RAND_MAX);
        }
     }

}
//íîðìàëèçóåì âåñà
void NormalizeSynapses(double & n[][])
{
   double s=0;
   int i,j;
   for(i=0;i<MAX_NEURON;i++)
   {
      for(j=0;j<MAX_INP;j++) 
         s+=n[i][j]*n[i][j];
      s=MathSqrt(s);
      if(s !=0 )
         for(j=0;j<MAX_INP;j++)n[i][j]/=s;
   }
}
//Íîðìàëèçàöèÿ ìàññèâà çíà÷åíèå
void Normalize(double &  mv[])
{
   int Size=ArrayRange(mv,0);
   double s=0.;
   for(int i=0;i<Size;i++)
   s+=(mv[i]+0.5)*(mv[i]+0.5);
   s=MathSqrt(s);
   if(s != 0) 
   for(i=0;i<Size;i++)
      mv[i]=(mv[i]+0.5)/s-0.5;
}


//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
//Ðàñ÷åò ñëîÿ Êðõõåíà
void LayerUL_Propagate(double inputs[],double &n[][],double &axon[])
{
   int i,j;
   int cx, cy;
   double fmax, f;
   for(i=0;i<MAX_NEURON;i++)
   {
      //neurons[i].Propagate();
      double state=0.;
      for( j=0;j<MAX_INP;j++)
      {         
         state+=(inputs[j])*(n[i][j]);
      }
      //"Ýêñïîíåíòà áîëåå òåðïèìà ê ïàðàìåòðàì ïðåâûøàþùèì +1;-1 ñ òàíãåíñîì êàê âñåãà âñå ïå÷àëüíî :(
      axon[i]=2.0 / (1.0 + MathExp(-state)) - 1;//MathTan(state);
      
      if(Inhibition !=0)
      {
         if(axon[i]>InFreshold) // âîçáóæäåíèå
         {
            if(inhibitory[i]<=0)  // ïîêà íå çàòîðìîæåí
               inhibitory[i]=axon[i]*Inhibition/0.5; // òîðìîçèì
         }
         // ïîñòåïåííîå âîññòàíîâëåíèå âîçìîæíîñòè âîçáóæäàòüñÿ
         if(inhibitory[i]>0) inhibitory[i]--;
      }     
   }
   
   fmax=MAXDISTANCE;
   imax=-1;
   for(i=0;i<MAX_NEURON;i++)
   {
      //
      double s=0.0;
      for(j=0;j<MAX_INP;j++)
         s+=MathAbs(inputs[j]-n[i][j]);
      delta[i]=s;
      //
      //f=neurons[i].CountDistance();
      f = s;
      if(f<fmax)
      {
         fmax=f;
         imax=i;
      }
   }
   //Ìîæíî è òàê çäåëàòü
   //imax = ArrayMaximum(axon); //Íàõîäèì íåéðîí ìàêñèìàëüíî îòêëèêíóâøèéñÿ íà ñèãíàë
   
   if(imax==-1){return (false);}
   ny=imax/dx;   // âû÷èñëåíèå êîîðäèíàò X & Y
   nx=imax%dx;
   
   for(i=0;i<MAX_NEURON;i++) delta[i] = 0;   //ïîäãîòàâëèâàåì ê ðàáîòå
   
 if(0==Accreditation) //neurons[imax].delta = 1;
   {
      for(cx=MathMax(nx-MathRound(MaxDistance),0); cx<MathMin(nx+MathRound(MaxDistance+1),dx);cx++)
      {
         if(dy > 0)
         {
            for(cy=MathMax(ny-MathRound(MaxDistance),0);cy<MathMin(ny+MathRound(MaxDistance+1),dy);cy++)
            {
               // íåéðîí â çîíå îáó÷åíèÿ
               delta[cy*dx+cx] = 1;
               //neurons[cy*dx+cx].delta = 1;
            }
         }
         else
         {
            delta[cx] = 1;
            //neurons[cx].delta = 1;
         }
      }
   }
   else //if(Accreditation)
   {
      for(i=0;i<MAX_NEURON;i++)
      {
         int y=i/dx;
         int x=i%dx;

         if(MathAbs(MaxDistance)>=1.0)
         {
            delta[i] = MathExp(-MathSqrt((nx-x)*(nx-x)+(ny-y)*(ny-y))/MaxDistance);
            //neurons[i].delta = exp(-sqrt((nx-x)*(nx-x)+(ny-y)*(ny-y))/MaxDistance);
         }
         else 
            Accreditation=0;
            //Accreditation = 1;
      }
   }  
   
   
//   OutSkreenKoh(10,260,delta,"S3");
//   Print("minD = ",imax," nx=",nx," ny=",ny);
   return (true);
}
//Êîððåêöèÿ îøèáêè
void LayerUL_Learn(double inputs[],double &n[][])
{
 
   int i,j,k;

   if(Accreditation==0)
   {
      for(i=0;i<MAX_NEURON;i++)
      {
         // ïî íåéðîíàì
         if(delta[i] == 0) continue;
         // ïî ñèíàïñàì
         for(k=0;k<MAX_INP;k++)
         {
            n[i][k]+=LearnRate*(inputs[k] - n[i][k]);
            //layers[j]->neurons[i].synapses[k]+=LearnRate* (layers[j-1]->neurons[k].axon - layers[j]->neurons[i].synapses[k]);
         }
      }
   }
   else
   {
      for(i=0;i<MAX_NEURON;i++)
      {
         // ïî íåéðîíàì
         // çàòîðìîæåííûå ïðîïóñêàåì
         if(Inhibition > 0 && inhibitory[i]>0) continue;
         // ïî ñèíàïñàì
         for(k=0;k<MAX_INP;k++)
         {
            n[i][k]+=LearnRate * delta[i] * (inputs[k] - n[i][k]); 
 //layers[j]->neurons[i].synapses[k]+=LearnRate *layers[j]->neurons[i].delta *(layers[j-1]->neurons[k].axon - layers[j]->neurons[i].synapses[k]);
         }
         
      }
   }

}

//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
int N=200;           //×èñëî öâåòîâ â ïàëèòðå
int rainbow[10000];  //òóò õðàíèòñÿ ðàäóãà
int nRainbow;        //÷èñëî öâåòîâ ðàäóãè
int GetRGB(int r, int g, int b)
{//ñòðîèò öâåò ïî êîìïîíåíòàì r, g, b
   return (256*(256*b + g) + r);
}
int GetRainbowColor(int c)
{//Âûáèðàåò èç ðàäóãè îòìàñøòàáèðîâàííûé öâåò
   double k=nRainbow/N;
   int n=c*k;
   return (rainbow[n]);
}

int BuildRainbow()
{//ñòðîèò ðàäóãó, âîçâðàùàÿ ÷èñëî öâåòîâ
//âîçìîæíî Âû ïðèäóìàåòå áîëåå âûðàçèòåëüíóþ ïàëèòðó :)
   int r=255, g=0, b=0;
   int n=0;
   
   while(g !=255)
   {
      rainbow[n]=GetRGB(r, g, b);
      g++; n++;
   }   
   while(r !=0)
   {
      rainbow[n]=GetRGB(r, g, b);
      r--; n++;
   }
   while(b !=255)
   {
      rainbow[n]=GetRGB(r, g, b);
      b++; n++;
   }
   while(g !=0)
   {
      rainbow[n]=GetRGB(r, g, b);
      g--; n++;
   }
   while(r !=255)
   {
      rainbow[n]=GetRGB(r, g, b);
      r++; n++;
   }
   nRainbow = n;
   return (n);   
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int ObjectMakeLabel( string n,string text, int xoff, int yoff ,color text_color) {
   ObjectCreate( n, OBJ_LABEL, 0, 0, 0 );
   ObjectSet( n, OBJPROP_CORNER, text_color );
   ObjectSet( n, OBJPROP_XDISTANCE, xoff );
   ObjectSet( n, OBJPROP_YDISTANCE, yoff );
   ObjectSet( n, OBJPROP_BACK, true );
   ObjectSetText( n,text, 4, "Webdings", text_color );
}

//âûâîäèì ñîäåðæèìîå êàðòû íà ýêðàí â êîîðäèíàòó ïðàâîãî âåðõíåãî óãëà Sx, Sy
void OutScreenKoh(int x,int y,double  arr[],string Marcer)
{
int i=0, j=0;
   int k=0;
   for(j=0;j<dy;j++)
      for(i=0;i<dx;i++)   
      {
      int nc =(arr[k]+1) * 100;
      if(nc <0 ) nc = 0;
      int col = GetRainbowColor(nc);
      ObjectDelete(Marcer+"X"+DoubleToStr(i ,0 )+"Y"+DoubleToStr(j ,0 ));
      string str="0";
      string text= StringSetChar(str, 0,103);
      ObjectMakeLabel( Marcer+"X"+DoubleToStr(i ,0 )+"Y"+DoubleToStr(j ,0 ),text, x+i*4, y+j*4, col);
      k++;
      }
}

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---