114 lines
4.3 KiB
Java
114 lines
4.3 KiB
Java
package eva2.server.go.individuals.codings.ga;
|
|
|
|
import java.util.BitSet;
|
|
|
|
/** This is a gray coding for integers, sorry no variable number of bits here.
|
|
* Created by IntelliJ IDEA.
|
|
* User: streiche
|
|
* Date: 24.03.2003
|
|
* Time: 18:40:03
|
|
* To change this template use Options | File Templates.
|
|
*/
|
|
public class GAGrayCodingInteger implements InterfaceGAIntegerCoding,java.io.Serializable {
|
|
|
|
GAStandardCodingInteger m_HelpingHand = new GAStandardCodingInteger();
|
|
|
|
/** This method decodes a part of a given BitSet into a int value. This method may change the contens
|
|
* of the BitSet if it doesn't describe a valid value.
|
|
* The method checks wether or not the value is within the given range.
|
|
* @param refBitSet The BitSet where the integer value is stored.
|
|
* @param range The allowed range of the value.
|
|
* @param locus The position and length on the BitSet that is to be decoded.
|
|
* @param correction Enable automatic correction is enabled.
|
|
* @return The int value.
|
|
*/
|
|
@Override
|
|
public int decodeValue(BitSet refBitSet, int[] range, int[] locus, boolean correction) {
|
|
BitSet tmpBitSet;
|
|
int[] tmpLocus;
|
|
boolean tmpB = false;
|
|
|
|
tmpLocus = new int[2];
|
|
tmpLocus[0] = 0;
|
|
tmpLocus[1] = locus[1];
|
|
tmpBitSet = new BitSet(tmpLocus.length);
|
|
|
|
// for (int i = 0; i < tmpLocus.length; i++) {
|
|
// tmpB = (tmpB ^ refBitSet.get(locus[1] + i));
|
|
// if (tmpB) tmpBitSet.set(i);
|
|
// else tmpBitSet.clear(i);
|
|
// }
|
|
for (int i = 0; i < tmpLocus[1]; i++) {
|
|
tmpB = refBitSet.get(locus[0]);
|
|
for (int j = 1; j <= i; j++) tmpB = tmpB ^ refBitSet.get(locus[0] + j);
|
|
if (tmpB) tmpBitSet.set(i);
|
|
else tmpBitSet.clear(i);
|
|
}
|
|
return this.m_HelpingHand.decodeValue(tmpBitSet, range, tmpLocus, correction);
|
|
}
|
|
|
|
/** This method codes a given int value directly into a BitSet at
|
|
* the position which is specified by locus.
|
|
* The method checks wether or not the value is within the given range.
|
|
* @param value The value to be coded.
|
|
* @param range The allowed range of the value.
|
|
* @param refBitSet The BitSet where the questioned value is stored.
|
|
* @param locus The position and length on the BitSet that is to be coded.
|
|
*/
|
|
@Override
|
|
public void codeValue(int value, int[] range, BitSet refBitSet, int[] locus) {
|
|
BitSet tmpBitSet;
|
|
int[] tmpLocus;
|
|
|
|
tmpLocus = new int[2];
|
|
tmpLocus[0] = 0;
|
|
tmpLocus[1] = locus[1];
|
|
tmpBitSet = new BitSet(tmpLocus.length);
|
|
this.m_HelpingHand.codeValue(value, range, tmpBitSet, tmpLocus);
|
|
|
|
// if (tmpBitSet.get(0)) refBitSet.set(locus[1]);
|
|
// else refBitSet.clear(locus[1]);
|
|
// for (int i = 1; i < locus.length; i++) {
|
|
// if (tmpBitSet.get(i)^tmpBitSet.get(i-1)) refBitSet.set(locus[1] + i);
|
|
// else refBitSet.clear(locus[1] + i);
|
|
// }
|
|
if (tmpBitSet.get(0)) refBitSet.set(locus[0]);
|
|
else refBitSet.clear(locus[0]);
|
|
for (int i = 1; i < locus[1]; i++) {
|
|
if (tmpBitSet.get(i)^tmpBitSet.get(i-1)) refBitSet.set(locus[0] + i);
|
|
else refBitSet.clear(locus[0] + i);
|
|
}
|
|
}
|
|
|
|
/** This method will calculate how many bits are to be used to code a given value
|
|
* @param range The range for the value.
|
|
*/
|
|
@Override
|
|
public int calculateNecessaryBits(int[] range) {
|
|
return this.m_HelpingHand.calculateNecessaryBits(range);
|
|
}
|
|
|
|
/** Perhaps a special output is necessary.
|
|
* @param b The BitString.
|
|
* @return A printable String.
|
|
*/
|
|
public String printBitSet(BitSet b) {
|
|
return this.printBitSet(b, b.size());
|
|
}
|
|
|
|
/** Perhaps a special output is necessary.
|
|
* @param b The BitString.
|
|
* @return A printable String.
|
|
*/
|
|
public String printBitSet(BitSet b, int length) {
|
|
String output = "{";
|
|
|
|
for (int i = 0; i < length; i++) {
|
|
if (b.get(i)) output += "1";
|
|
else output += "0";
|
|
}
|
|
output += "}\n";
|
|
return output;
|
|
}
|
|
}
|