2016-07-23 75 views
0

在下面的函數中,我想根據變異概率變異一個BitSet。BitSet flip()是否會影響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 

正如你所看到的,第一和第四不翻轉後還原。而另一個已經減少。我試圖瞭解是什麼導致了這個問題,但我不能。所有我需要的是,在翻轉之後,位集應該與原文在翻轉之前具有相同的長度。

+1

也許無關,但爲什麼還要指定'original'兩次,第二次緊隨第一? –

回答

1

BitSet flip()會影響BitSet的長度嗎?

JavadocBitSet::length說:

公衆詮釋長度()
返回此BitSet的 「邏輯大小」:在最高設置位的索引BitSet加一個。如果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 
+0

謝謝。在這種情況下,如何在翻轉一些位並保留其他位後返回原件? – Nasser

+0

@Nasser,我不完全確定你的意思,但如果你想跟蹤一些固定的長度,你需要將它保存在一個單獨的變量中(可能是'Cell'類中的一個字段) – binoternary