在以下函数中,我想根据变异概率改变BitSet。
public static Cell mutate(Cell original_){
Double mProb = 0.2;
BitSet original = new BitSet(original_.getChrom().size());
original = (BitSet) original_.getChrom().clone();
Random rand = new Random();
System.out.print(" " + original.length() + " "); //to check the length of original before applying flip()
for(int m = 0; m < original.length(); m++)
{
if(rand.nextDouble() <= mProb){
original.flip(m);
}
}
System.out.print(" " + original.length() + " "); //to check the length of original after applying flip()
Cell mutated = new Cell(original);
//System.out.print("{" + mutated.getFitness() + "} ");
return mutated;
}
我注意到的问题是,有时在翻转一些位后BitSet的长度会减少!!
以下一些结果可以解释这个问题:
original before flip || length before flip || original after flip || length after flip
110111 || 6 || 110111 || 6
101111 || 6 || 111 || 3
110111 || 6 || 10111 || 5
110111 || 6 || 111111 || 6
111010 || 6 || 11010 || 5
如你所见,翻转后第一和第四次没有减少。而另一方则减少了。我试图了解导致问题的原因,但我无法理解。我需要的是在翻转之后,bitset应该与翻转之前的原始长度相同。
答案 0 :(得分:2)
BitSet flip()会影响BitSet的长度吗?
是强>
BitSet::length
的{p> Javadoc说:
public int length()
返回&#34;逻辑大小&#34;此BitSet:BitSet中最高设置位的索引加1。如果BitSet不包含设置位,则返回零。
BitSet b = new BitSet();
System.out.println(b.length()); // 0
b.flip(1);
System.out.println(b.length()); // 2
b.flip(1);
System.out.println(b.length()); // 0