📄 arbitraryfunctionexperiment.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 + -