1。問題定義:
これらのアレイの値は、どのようにして重量を拾うために優先させることができますか?交差点
例えば:
次のようにコードコードをコピーします。
体重:8 2 11 79
重量で返される値:0 1 2 3
2。問題の分析:
アイデア1:サイズと重量のサイズと重量の配列を作成します。カテゴリは順番にプッシュされます。
次に、乱数の重量とサイズを使用して、乱数を生成します。欠点はメモリが多すぎるはずです。
アイデア2:
重量とアレイw [i] [0、i]のすべての要素の重量と時間の複雑さを保存します。
ランダム[0、w [399]]]乱数がどの時間に落ちているかを確認してください。
したがって、合計時間の複雑さの複雑さo(n)空間複雑さo(n)
pseudocode:
ギャンブルの回転は特に良い選択肢ではありませんが、達成するのは簡単です。
まず第一に、Cross-および-mutationおよび他の演算子のために、進化の方向を制御できないため、進化の重い責任は選択演算子にあることを理解する必要があります。
これを理解すれば、簡単です。
ギャンブルの回転は、通常、選択される確率を蓄積することです。
FITが配列の適応である場合、合計Mコピーコードコードは次のとおりです。
i = 1からm '
sum = sum+fit(i)
次の私
i = 1からn 'n-あなたは何人の個人を生成したいですか?
temp = temp + fit(i)
rnd <= temp / sの場合
出力Iが結果です
出口機能
ifを終了します
次の私
第三に、問題を解決します。
次のようにコードコードをコピーします。
パッケージデータストラクチャ。
java.util.hashmapをインポートします。
java.util.mapをインポートします。
/**
体重乱数:
重量の場合:8 2 11 79
重量で返される値:0 1 2 3
@author ajian005 [email protected]
2014-2-16 21:12
出力の結果:{2.0 = 184128、11.0 = 348551、79.0 = 1308100、8.0 = 159221}}
*/
パブリッククラスのweightrandomtest {
Private static double [] weightArrays = {8.0、2.0、11.0、79.0};
public static void main(string [] args){{
weightrandom weightrandom = new weightrandom();
map <double、integer> stat = new Hashmap <double、integer>();
for(int i = 0; i <2000000; i ++){
int weightValue = weightrandom.getWeightrandom(weightArrays);
if(weightValue <0){{
続く;
}
System.out.println( "乱数が重量で返される:" + weightValue);
if(stat.get(weightArrays [weightValue])== null){
stat.put(weightArrays [weightValue]、1);
} それ以外 {
stat.put(weightArrays [weightValue]、stat.get(weightArrays [weightValue])+1);
}
}
System.out.println(stat);
}
}
クラスのweightrandom {
java.util.random r = new Java.util.random();
プライベートダブルウェイトアレイスム(double [] weightarrays){{{
double weightsum = 0;
for(double weightValue:weightArrays){
WeightSum += weightValue;
}
ウェイトサムを返します。
}
public int getWeightrandom(double [] weightarrays){{
double weightsum = weightarraysum(weightarrays);
double stepweightsum = 0;
for(int i = 0; i <weightarrays.length; i ++){
stepweightsum += weightarrays [i];
if(math.random()<= stepweightsum/weightsum){
//system.out.println(i);
私を返します。
}
}
System.out.println( "error");
return -1;
}
}
第4、要約の要約:
ロシアのラウンドギャンブルは、達成する確率を蓄積することです
従属負荷スケジューリングなど。