⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arbitraryfunctionexperiment.java~

📁 Java遗传算法库
💻 JAVA~
字号:
package jaga.pj.circuits.experiment;

import jaga.*;
import jaga.experiment.*;

/** Experiment which evaluates behaviour as a given Boolean Function.
 * GetDesiredOutputs not working currently!
 * @author  unknown
 * @version 
 */
public class ArbitraryFunctionExperiment implements ConfigurableRandomInputExperiment
{
    // Config
    protected BooleanFunction function;
    protected FitnessFunction[] fitnessFunctions = { new CorrelationFitnessFunction() };
    
    // Working
    protected SampleData[] currTestData;
    protected SampleData[] currInputs;
    protected SampleData[] currDesOuts;
    protected int lastInputSampleSeparation = -1;
    protected int lastInputLength = -1;

    /** @param function The Boolean Function to evaluate behaviour as.
     * @param fitnessFunction Algorithm to determine fitness from inputs, outputs and desired ouptputs.
     */
    public ArbitraryFunctionExperiment( BooleanFunction function, FitnessFunction[] fitnessFunctions )
    {
        this( function );
        this.fitnessFunctions = fitnessFunctions;
    }

    /** @param function The Boolean Function to evaluate behaviour as.
     * @param fitnessFunction Algorithm to determine fitness from inputs, outputs and desired ouptputs.
     */
    public ArbitraryFunctionExperiment( BooleanFunction function, FitnessFunction fitnessFunction )
    {
        this( function );
        fitnessFunctions[ 0 ] = fitnessFunction;
    }
       
    public ArbitraryFunctionExperiment( BooleanFunction function ) {
        this.function = function;
        set( new Long( System.currentTimeMillis() ) );
    }

    public int getNumOfInputs()
    {
        return function.getNumOfInputs();
    }
    
    public int getNumOfOutputs()
    {
        return 1;
    }
    
    /** Generate input using default parameters
    */
    public SampleData[] generateInput()
    {
        final int DEFAULT_INPUT_SAMPLE_SEPARATION = 30;
        return generateInput( DEFAULT_INPUT_SAMPLE_SEPARATION );
    }

    /** generates an array of inputs suitable for this experiment.
     * @param inputSampleSeparation relative frequency of input to output samples.  If this is n, then n outputs will be sampled for every change in inputs.
    */
    public SampleData[] generateInput( int inputSampleSeparation)
    {
        int defaultInputDataLength = (int)( currTestData[0].length() * 1 );// 2.4 gives some random as well
        return generateInput( inputSampleSeparation, defaultInputDataLength );
    }
    
    /** Generate input suitable for testing this experiment using
     * custom parameters
     * @param inputDataLength how long the input data should be
     * @param inputSampleSeparation how often the input samples should change in time.  Greater value -> less often
    */
    public SampleData[] generateInput( int inputSampleSeparation, int inputDataLength )
    {
        final double NON_RANDOM_TEST_PROPORTION = 1;
        if( inputDataLength != lastInputLength || inputSampleSeparation != lastInputSampleSeparation )
        {
            currInputs = ExperimentLib.generateInputFromTest( currTestData , NON_RANDOM_TEST_PROPORTION, inputDataLength, inputSampleSeparation );
        }
        return currInputs;
    }
    
    public double getFitness(SampleData[] in,SampleData[] out)
    {
        // calculate what output should be,
        int inputSampleSeparation = in[ 0 ].getSampleSeparation();
        int inputSamples = in[ 0 ].length();
        int numInputs = getNumOfInputs();
        SampleData Q = out[ 0 ];
        SampleData desQ = new SampleData( inputSampleSeparation, Q.length() );
        boolean[] currentInputs = new boolean[ numInputs ];
        
        // calculate what Q should have been
        for( int idl = 0; idl < inputSamples; idl++ )
        {
            for( int il = 0; il < numInputs; il++ )
            {
                currentInputs[ il ] = in[ il ].get( idl );
            }
            boolean desiredQ = function.getResult( currentInputs );
            for( int odl = 0; odl < inputSampleSeparation; odl++ )
            {   
                int currIdx = idl * inputSampleSeparation + odl;
                desQ.setTo( currIdx, desiredQ );
            }
        }
        SampleData[] Qs = { Q };    SampleData[] desQs = { desQ };
        double rv = fitnessFunction.getFitness( in, Qs, desQs );
        return rv;        
    }
         
    public String toString()
    {
        String rv = "ArbitraryFunctionExperiment with:";
        rv += "\n   Function: " + function;
        rv += "\n   Fitness Function: " + fitnessFunction;
        return rv;
    }
    
    protected Object savedParam;
    
    /** Sets the random number generator seed.
    */
    public void set( Object param )
    {
        long seed = ( ( Long ) param ).longValue();
        ExperimentLib.setRandomSeed( seed );
        function.setRandomSeed( seed );
        currTestData = function.getTestData();
        lastInputLength = -1; // uncomment this for changing inputs every generation!
        if( fitnessFunction instanceof NoisyComponent )
        {
            ( ( NoisyComponent ) fitnessFunction ).setSeed( seed );
        }
        savedParam = param;
    }
    
    public Object get(Object param) {
        return savedParam;
    }    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -