2016-04-07 16 views
1

は、私はMATLABでこのコードがあるとします。並列計算(MATLAB)の乱数ジェネレータ、並列ループごとに異なる初期乱数?

% Predefined data 
SX = [1, 2, 3, 4]; 
    parfor xx = 1:4 
     naming2 = SX(xx); 
     [BestM, BestX{xx}, fina_M{xx}, final_D{xx}, BestAA{xx}, final_Data{xx}] = Optmz(naming2, v_data); 
    end 

Optmzは、最適化アルゴリズムです。この最適化アルゴリズムは、回帰モデルを最適化するために実行する必要があります(異なる出力と最適化された入力 - 特徴選択を使用します)。ヒューリスティックな最適化アルゴリズムは、乱数に基づいています。 parlorループごとに異なる初期乱数がありますか?これは私のアプリケーションの時間を短縮するための適切な構造ですか?私は現在、上記の構造にループforを使用しています。

これは印刷された出力の一部です。反復はソートされません。何の問題?上記のコードに基づいて、私たちは同じ数の4つの反復を持つべきです。最初の乱数発生器が異なる4人すべての労働者で、合計の計算が必要です。たとえば、並列計算を行わずに順番に計算を実行するような方法です。最初の1つ、2つ目、3つ目、最後に4番目を実行します。

******Iteration 24, Best Cost = 0.041201****** 
******Iteration 26, Best Cost = 0.034994****** 
******Iteration 26, Best Cost = 0.036624****** 
******Iteration 26, Best Cost = 0.039317****** 
******Iteration 25, Best Cost = 0.039584****** 
******Iteration 27, Best Cost = 0.034994****** 
******Iteration 27, Best Cost = 0.036624****** 
******Iteration 27, Best Cost = 0.039317****** 
******Iteration 28, Best Cost = 0.034994****** 
******Iteration 26, Best Cost = 0.039242****** 
******Iteration 28, Best Cost = 0.036624****** 
******Iteration 28, Best Cost = 0.03931****** 
******Iteration 29, Best Cost = 0.034994****** 
******Iteration 29, Best Cost = 0.036624****** 
******Iteration 27, Best Cost = 0.039048****** 
******Iteration 29, Best Cost = 0.03931****** 
******Iteration 30, Best Cost = 0.034994****** 
******Iteration 30, Best Cost = 0.036624****** 
******Iteration 28, Best Cost = 0.039048****** 
+0

@ MZimmerman6私たちはすべてのパーラーループで異なる初期乱数を持っていますか?これは私のアプリケーションの時間を短縮するための適切な構造ですか?反復はソートされません。何の問題? – user2991243

+1

'parfor'ループでは、アクセスされたインデックスは決して順番になることは決してありません。順序と並行処理を保証するのは通常矛盾です。 – rayryeng

+1

反復の順番が間違っているかどうかを確認する場合は、@rayryengによると、何らかの順序を保証することはほとんど不可能です。このため、コードが特定の順序で処理されていないかどうかを気にしないようにコードを設計する必要があります。 – MZimmerman6

答えて

1

多分これは多分、あなたが求めているものではありませんが、各ループごとに異なる種をしたい場合は、タイム・スタンプまたはそのようなもので乱数ジェネレータをシードすることができます。これは、各ループは異なるシード及びその乱数

nLoops = 10 
parfor ii = 1:nLoops 
    timeVals = strsplit(sprintf('%.9f',now),'.') 
    rng(str2double(timeVals{2})) 
    % do some stuff 
end 

それとも、したくない場合は、rng

nLoops = 10 
parfor ii = 1:nLoops 
    rng('shuffle') 
    % do some stuff 
end 

のためにMATLABのシャッフル機能で構築を使用できるの異なるセットを持っていることを確認しますすべてのループでランダムになるようにするには、ループに入る前に配列を作成し、必要なサイズの配列を作成し、各ループにこの同じ情報にアクセスさせます。非常に

nLoops = 10; 
randNums = rand(1,100) 
parfor ii = 1:nLoops 
    %do something with randNums(someNum) 
end 

いずれかのオプションが比較的容易ですが、ループのどれもが、この配列については何も編集しないことをお勧めします。最適化の問題を抱えている場合は、乱数が異なることを確認したいと思う可能性があります。つまり、最適化のポイントのようなものです。

+0

これについてあなたの考えは何ですか? http://www.mathworks.com/help/distcomp/control-random-number-streams.html。 'シャッフル'や最初の提案された手続きを使用して、すべての作業者に異なる乱数を持たせ、疑問のある構造体を使用しないならば( 'for'ループと同じように、新しいコード行なしで)、同じランダムまたは異なるランダムすべての労働者の数字? 'rng(str2double(timeVals {2}))')や 'シャッフル'を使う必要がありますか? – user2991243

+0

正直に分かりません。なぜあなたの他のコードなしでテストを実行し、各ループが同じ乱数を持っているかどうかを確認してください。私が提供したコードは、一定の同一乱数と異なる乱数を保証するカップルの方法を提供していますか?あなたはそれをどのように使いたいかを決めます。あなたが実際に私に求めていることをもう明確にしないと、私はもう助けを提供することができません。 – MZimmerman6