Ejemplo n.º 1
0
        /// <summary>
        /// First method for determination of position of the debris.
        /// </summary>
        /// <param name="Splinter">        </param>
        /// <param name="CountOfDimension"></param>
        /// <param name="Amplitude">       </param>
        /// <param name="LowerBounds">     </param>
        /// <param name="UpperBounds">     </param>
        protected void FirstMethodDeterminationOfPosition(Agent Splinter, int CountOfDimension, double Amplitude, IReadOnlyList <double> LowerBounds, IReadOnlyList <double> UpperBounds)
        {
            // The indices are choosing randomly.
            GenerateIndicesOfAxes(CountOfDimension);

            double h = 0;

            // Calculate position of debris.
            for (int i = 0; i < CountOfDimension; i++)
            {
                int axisIndex = _coordNumbers[i];

                h = Amplitude * _uniformRand.URandVal(-1, 1);

                Splinter.Point[axisIndex] += h;

                if (Splinter.Point[axisIndex] < LowerBounds[axisIndex])
                {
                    Splinter.Point[axisIndex] = _uniformRand.URandVal(LowerBounds[axisIndex], 0.5 * (LowerBounds[axisIndex] + UpperBounds[axisIndex]));
                }
                else if (Splinter.Point[axisIndex] > UpperBounds[axisIndex])
                {
                    //Splinter.Point[axisIndex] = _uniformRand.URandVal(0.5 * (LowerBounds[axisIndex] + UpperBounds[axisIndex]), UpperBounds[axisIndex]);
                    Splinter.Point[axisIndex] = UpperBounds[axisIndex];
                }
            }
        }
Ejemplo n.º 2
0
 /// <summary>
 /// If <paramref name="Value"/> out of range [ <paramref name="MinValue"/>;
 /// <paramref name="MaxValue"/>], then clipping to a random value in the range.
 /// </summary>
 /// <param name="Value">     </param>
 /// <param name="MinValue">   A minimum value of the range. </param>
 /// <param name="MaxValue">   A maximum value of the range. </param>
 /// <param name="UniformGen"> A random generator. </param>
 /// <returns>
 /// <para>
 /// A random value in the range [ <paramref name="MinValue"/>; <paramref name="MaxValue"/>]
 /// if <paramref name="Value"/> greater than <paramref name="MaxValue"/> or less than <paramref name="MinValue"/>.
 /// </para>
 /// <para> Otherwise <paramref name="Value"/>. </para>
 /// </returns>
 public static double RandomClamp(double Value, double MinValue, double MaxValue, IContUniformGen UniformGen)
 {
     if (Value < MinValue || Value > MaxValue)
     {
         return(UniformGen.URandVal(MinValue, MaxValue));
     }
     else
     {
         return(Value);
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        /// </summary>
        /// <param name="DimObjs">    </param>
        private void InitAgents(IOOOptProblem Problem, int DimObjs)
        {
            int dimension = Problem.LowerBounds.Count;

            for (int i = 0; i < _parameters.NP; i++)
            {
                PointND point = new PointND(0.0, dimension);

                for (int j = 0; j < dimension; j++)
                {
                    point[j] = _uniformRand.URandVal(Problem.LowerBounds[j], Problem.UpperBounds[j]);
                }

                _agents.Add(new Agent(point, new PointND(0.0, DimObjs)));
            }
        }
        private void GenerateShrapnelesForGrenade(int WhichGrenade, int Dimension)
        {
            double p = Math.Max(1.0 / Dimension,
                                Math.Log10(_radiusGrenade / _radiusExplosion) / Math.Log10(_parameters.Pts));

            if (CheckDouble.GetTypeValue(p) != DoubleTypeValue.Valid)
            {
                p = 0.5;
            }

            double randomValue1, randomValue2;

            bool isShrapnelAdd = true;

            PointND tempPoint = null;

            // Generating shrapnels.
            for (int i = 0; i < _parameters.NShrapnel; i++)
            {
                // Reuse an allocated memory, if 'tempPoint' was not added to the array, otherwise
                // allocate a new memory.
                if (isShrapnelAdd)
                {
                    tempPoint = new PointND(0.0, Dimension);
                }

                randomValue1 = _uniformRand.URandVal(0, 1);

                // Random search direction.
                for (int w = 0; w < _drnd.Count; w++)
                {
                    _drnd[w] = _normalRand.NRandVal(0, 1);
                }

                _drnd.MultiplyByInplace(1 / _drnd.Norm());

                // If exist OSD.
                if (_dosd != null)
                {
                    randomValue2 = _uniformRand.URandVal(0, 1);

                    for (int coordIndex = 0; coordIndex < _dgrs.Count; coordIndex++)
                    {
                        _dgrs[coordIndex] = _mosd * randomValue1 * _dosd[coordIndex] + (1 - _mosd) * randomValue2 * _drnd[coordIndex];
                    }

                    _dgrs.MultiplyByInplace(1 / _dgrs.Norm());

                    randomValue1 = Math.Pow(randomValue1, p) * _radiusExplosion;

                    for (int coordIndex = 0; coordIndex < _dgrs.Count; coordIndex++)
                    {
                        tempPoint[coordIndex] = _grenades[WhichGrenade].Point[coordIndex] + randomValue1 * _dgrs[coordIndex];
                    }
                }
                else
                {
                    randomValue1 = Math.Pow(randomValue1, p) * _radiusExplosion;

                    for (int coordIndex = 0; coordIndex < _dgrs.Count; coordIndex++)
                    {
                        tempPoint[coordIndex] = _grenades[WhichGrenade].Point[coordIndex] + randomValue1 * _drnd[coordIndex];
                    }
                }

                double randNum = 0.0, largeComp = 0.0;

                // Out of range [-1; 1]^n.
                for (int j = 0; j < Dimension; j++)
                {
                    if (tempPoint[j] < -1 || tempPoint[j] > 1)
                    {
                        randNum = _uniformRand.URandVal(0, 1);

                        largeComp = tempPoint.Max(num => Math.Abs(num));

                        double normPos = 0.0;

                        for (int coordIndex = 0; coordIndex < tempPoint.Count; coordIndex++)
                        {
                            normPos = tempPoint[coordIndex] / largeComp;

                            tempPoint[coordIndex] = randNum * (normPos - _grenades[WhichGrenade].Point[coordIndex]) + _grenades[WhichGrenade].Point[coordIndex];
                        }

                        break;
                    }
                }

                double dist = 0.0;

                // Calculate distance to grenades.
                for (int idxGren = 0; idxGren < _parameters.NGrenade; idxGren++)
                {
                    if (idxGren != WhichGrenade)
                    {
                        dist = PointND.Distance(tempPoint, _grenades[idxGren].Point);

                        // Shrapnel does not accept (it is too near to other grenades).
                        if (dist <= _radiusGrenade)
                        {
                            isShrapnelAdd = false;
                            break;
                        }
                    }
                }

                if (isShrapnelAdd)
                {
                    _shrapnels[WhichGrenade].AddLast(new Agent(tempPoint, new PointND(0.0, 1)));
                }
            }
        }