All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sourceforge.cilib.pso.dynamic.responsestrategies.ReevaluationReactionStrategy Maven / Gradle / Ivy

Go to download

A library of composable components enabling simpler Computational Intelligence

There is a newer version: 0.8
Show newest version
/**           __  __
 *    _____ _/ /_/ /_    Computational Intelligence Library (CIlib)
 *   / ___/ / / / __ \   (c) CIRG @ UP
 *  / /__/ / / / /_/ /   http://cilib.net
 *  \___/_/_/_/_.___/
 */
package net.sourceforge.cilib.pso.dynamic.responsestrategies;

import java.util.List;
import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm;
import net.sourceforge.cilib.entity.Entity;
import net.sourceforge.cilib.entity.Topology;
import net.sourceforge.cilib.pso.PSO;
import net.sourceforge.cilib.pso.particle.StandardParticle;
import net.sourceforge.cilib.util.selection.Samples;
import net.sourceforge.cilib.util.selection.recipes.RandomSelector;

/**
 * This reaction strategy reevaluates the specified
 * {@link #setReevaluationRatio(double) ratio} of randomly chosen entities in
 * the given {@link Topology}.
 *
 * @param  some {@link PopulationBasedAlgorithm population based algorithm}
 */
public class ReevaluationReactionStrategy extends EnvironmentChangeResponseStrategy {

    private static final long serialVersionUID = -5549918743502730714L;
    protected double reevaluationRatio = 0.0;

    public ReevaluationReactionStrategy() {
        reevaluationRatio = 0.1;
    }

    public ReevaluationReactionStrategy(ReevaluationReactionStrategy rhs) {
        super(rhs);
        reevaluationRatio = rhs.reevaluationRatio;
    }

    @Override
    public ReevaluationReactionStrategy getClone() {
        return new ReevaluationReactionStrategy(this);
    }

    /**
     * Just reevaluate the {@link Entity entities} inside the topology. An
     * entity's implementation should handle updating anything else that is
     * necessary, e.g. a {@link StandardParticle}'s
     * personal best position in the case of {@link PSO}.
     *
     * {@inheritDoc}
     */
    @Override
    public void performReaction(E algorithm) {
        Topology entities = algorithm.getTopology();
        int reevaluateCount = (int) Math.floor(reevaluationRatio * entities.size());

        reevaluate(entities, reevaluateCount);
    }

    /**
     * Reevaluate a specified percentage of the given entities.
     *
     * @param entities a {@link List} of entities that should be considered for
     * reevaluation
     * @param reevaluateCount an int specifying how many entities should be
     *        reevaluated
     */
    protected void reevaluate(List entities, int reevaluateCount) {
        RandomSelector selector = new RandomSelector();
        List subList = selector.on(entities).select(Samples.first(reevaluateCount));
        for (Entity entity : subList) {
            // FIXME: does not reevaluate the _best_ position.
            entity.calculateFitness();
        }
    }

    /**
     * Set the ratio of entities that should be reevaluated.
     *
     * @param rer a double value in the range (0.0, 1.0)
     * @throws {@link IllegalArgumentException} when the ratio is not within the
     * above mentioned range
     */
    public void setReevaluationRatio(double rer) {
        if (rer < 0.0 || rer > 1.0) {
            throw new IllegalArgumentException("The reevaluationRatio must be in the range (0.0, 1.0)");
        }

        reevaluationRatio = rer;
    }

    /**
     * Get the ratio of entities that should be reevaluated.
     *
     * @return the ratio of entities that should be reevaluated
     */
    public double getReevaluationRatio() {
        return reevaluationRatio;
    }
}