package bsearch.representations;
import java.util.LinkedHashMap;
import org.nlogo.util.MersenneTwisterFast;
import bsearch.space.SearchSpace;
/**
* A Chromosomal representation that uses Gray code for integers
*/
public strictfp class GrayBinaryChromosome extends BinaryChromosome
{
public GrayBinaryChromosome( SearchSpace searchSpace , MersenneTwisterFast rng )
{
super(searchSpace, rng);
}
public GrayBinaryChromosome( SearchSpace searchSpace , LinkedHashMap<String,Object> paramSettings )
{
super(searchSpace, paramSettings);
}
public GrayBinaryChromosome( boolean[] bitstring, SearchSpace searchSpace )
{
super(bitstring, searchSpace);
}
@Override
public GrayBinaryChromosome clone()
{
return new GrayBinaryChromosome(bitstring, searchSpace);
}
@Override
public void binaryEncode(long binval, boolean[] graybits, int offset, int len)
{
// efficient shortcut for converting to Gray encoding
long gray = binval ^ (binval >> 1);
long bitMask = 1;
for (int i = 0 ; i < len ; i++)
{
graybits[offset + i] = ((gray & bitMask) != 0) ;
bitMask = bitMask << 1;
}
// Let B[n:0] be the input array of bits in the
// usual binary representation, [0] being LSB
// Let G[n:0] be the output array of bits in Gray code
// G[n] = B[n]
// for i = n-1 downto 0
// G[i] = B[i+1] XOR B[i]
}
@Override
public long binaryDecode(boolean[] graybits, int offset, int len )
{
long bitMask = 1L << (len - 1);
long result = 0;
boolean previousBit = false;
if (graybits [offset + len - 1])
{
result |= bitMask;
previousBit = true;
}
bitMask = bitMask >> 1;
for (int i = len - 2; i >= 0; i--)
{
if (previousBit ^ graybits[ offset + i ] )
{
result = result | bitMask;
previousBit = true;
}
else
{
previousBit = false;
}
bitMask = bitMask >> 1;
}
return result;
}
public static class Factory implements ChromosomeFactory
{
public Chromosome createChromosome(SearchSpace searchSpace,
MersenneTwisterFast rng) {
return new GrayBinaryChromosome(searchSpace, rng);
}
public Chromosome createChromosome( SearchSpace searchSpace, LinkedHashMap<String,Object> paramSettings)
{
return new GrayBinaryChromosome(searchSpace, paramSettings);
}
public String getHTMLHelpText() {
return "<strong>GrayBinaryChromosome</strong> Similar to StandardBinaryChromosome, " +
"except that numeric values are encoded to binary strings using a Gray code, " +
"instead of the standard 'high order' bit ordering. " +
"Gray codes have generally been found to give better performance for search representations, " +
"since numeric values that are close together are more likely to be fewer mutations away from each other.";
}
}
}