Пример #1
0
        public override void resetVelocity(MersenneTwister rng)
        {
            double maxVelocity = (this.max - this.min) / 5.0;

            this._velocity  = maxVelocity; //min(abs(this._velocity), maxVelocity)
            this._velocity *= rng.Choice(new[] { 1, -1 });
        }
Пример #2
0
        public override void pushAwayFrom(List <double> otherPositions, MersenneTwister rng)
        {
            // If min and max are the same, nothing to do
            if (this.max == this.min)
            {
                return;
            }

            // How many potential other positions to evaluate?
            int numPositions = otherPositions.Count * 4;

            if (numPositions == 0)
            {
                return;
            }

            // Assign a weight to each potential position based on how close it is
            // to other particles.
            stepSize = (double)(this.max - this.min) / numPositions;
            double[] positions = ArrayUtils.Arrange(this.min, this.max + stepSize.Value, stepSize.Value);

            // Get rid of duplicates.
            numPositions = positions.Length;
            double[] weights = new double[numPositions];

            // Assign a weight to each potential position, based on a gaussian falloff
            // from each existing variable. The weight of a variable to each potential
            // position is given as:
            //    e ^ -(dist^2/stepSize^2)
            double maxDistanceSq = -1 * Math.Pow(stepSize.Value, 2);

            foreach (var pos in otherPositions)
            {
                var distances = ArrayUtils.Sub(positions, pos);// pos - positions;

                var varWeights = distances.Select(d => Math.Exp(Math.Pow(d, 2) / maxDistanceSq)).ToArray();

                //var varWeights = Math.Exp(Math.Pow(distances, 2) / maxDistanceSq);
                weights = ArrayUtils.Add(weights, varWeights);
            }


            // Put this particle at the position with smallest weight.
            int positionIdx = ArrayUtils.Argmin(weights);

            this._position = positions[positionIdx];

            // Set its best position to this.
            this._bestPosition = this.getPosition();

            // Give it a random direction.
            this._velocity *= rng.Choice(new[] { 1, -1 });
        }