Exemplo n.º 1
0
Arquivo: IRnd.cs Projeto: Vovanda/GAS
 public static float NextFloat(this IRnd rnd, float a, float b)
 {
     return(a + rnd.NextFloat() * (b - a));
 }
Exemplo n.º 2
0
        // создаем выходные связи для нейрона (рандомно)
        private List <NRelation> _createOutputForNeuron(int x, int y, int z)
        {
            if (NEED_STAT_WEIGHT)
            {
                MinWeight = 0;
                MaxWeight = 0;
            }

            var output = new List <NRelation>();
            // по оси Z распределение норм тут не надо замыкать последний слой на первый
            var minZ = z - MAX_DEEP_RELATIONS_Z; if (minZ < 1)
            {
                minZ = 1;
            }
            var maxZ = z + MAX_DEEP_RELATIONS_Z; if (maxZ > LenZ - 1)
            {
                maxZ = LenZ - 1;
            }

            // а вот по икс и игрек хотелось бы замкнуть первые нейроны на последние
            var minY = y - maxDeepRelationsY; /*if (minY < 0) minY = 0;*/ var maxY = y + maxDeepRelationsY; // if (maxY > LenY - 1) maxY = LenY - 1;
            var minX = x - maxDeepRelationsX; /*if (minX < 0) minX = 0;*/ var maxX = x + maxDeepRelationsX; // if (maxX > LenX - 1) maxX = LenX - 1;

            /*if (z==0 && y==1 && x==2)
             *  _logger.LogInformation(2111, "NNet _createOutputForNeuron  {x}-{xx} {y}-{yy} {z}-{zz}", minX, maxX, minY, maxY, minZ, maxZ);
             * /**/
            for (var zz = minZ; zz <= maxZ; zz++) // первый слой входы (входы исключительно на другие слои)
            {
                for (var yy = minY; yy <= maxY; yy++)
                {
                    for (var xx = minX; xx <= maxX; xx++)
                    {
                        // замыкания по оси икс и игрек
                        var yyy = yy; var xxx = xx;
                        if (yy < 0)
                        {
                            yyy = LenY + yy;
                        }
                        if (yy > LenY - 1)
                        {
                            yyy = yy - (LenY);
                        }
                        if (xx < 0)
                        {
                            xxx = LenX + xx;
                        }
                        if (xx > LenX - 1)
                        {
                            xxx = xx - (LenX);
                        }

                        // связь на себя не допускаем, тока косвенная - через другие нейроны
                        if (x == xxx && yyy == y && z == zz)
                        {
                            continue;
                        }

                        var coords = new NCoords(xxx, yyy, zz);
                        var o      = new NRelation()
                        {
                            Neuron = coords.ToSingle(LenX, LenY), Weight = _rand.NextFloat(MIN_INIT_WEIGHT, MAX_INIT_WEIGHT), WeightChange = 0
                        };
                        if (NEED_STAT_WEIGHT)
                        {
                            // здесь не надо юзать WeightSum так как WeightChange==0
                            if (MinWeight > o.Weight)
                            {
                                MinWeight = o.Weight;
                            }
                            if (MaxWeight < o.Weight)
                            {
                                MaxWeight = o.Weight;
                            }
                        }

                        /*if (z == 0 && y == 1 && x == 2)
                         * {
                         *  _logger.LogInformation(1111, "NNet _createOutputForNeuron for ({x}, {y}, {z}) => {n} ({xx}, {yy}, {zz})", x, y, z, (new NCoords(xxx, yyy, zz)).ToSingle(LenX, LenY), xxx, yyy, zz);
                         * }/**/

                        o.SetNeuron(Neurons[zz][yyy][xxx]);

                        output.Add(o);
                    }
                }
            }

            return(output);
        }