2016-07-23 11 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の長さに影響しますか?

はいBitSet::lengthため

Javadocは言う:

公共int型の長さ()
返します。このたBitSetの "論理サイズ":最上位セットビットのインデックスビットセット+ 1。ビットセットにビットが設定されていない場合はゼロを返します。

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