7

Juliaでマイクロシミュレーションモデルを構築しています。私は自分の関数の構造を構築しましたが、それは1人の「人」に最適です。モデルを通じて 100000 人以上の人々を実行し、結果を 1 つの場所に保存するスクリプトを書きたいと思います。

最終的にはこれを並行して実行したいと思います。

以下に、ダミーの確率を持つコードの単純な作業バージョンを含めました。

using Distributions

# Microsim function
function  MicroSim(start_age, stages)
  stage = 0
  age = start_age

  # Set all trackers to 0
  Death_tracker = 0
  Disease_tracker = 0

  # While loop
  while stage <= stages
    age = age

    ###########################################################
    # Probability of Death
    pD = 0.02

    if age == 100
      pD = 1.0
    else
      pD = pD
    end

    # Coin flip
    dist_pD = Bernoulli(pD)
    Died = rand(dist_pD, 1)

    if Died == [1]
      Death_tracker = 1
      # death tracker loop break
      if Death_tracker == 1
        # println("I died")
        break
      end
    else
      Death_tracker = Death_tracker
    end
    ###########################################################

  # Update age and stage
  age = age + 1
  stage = stage + 1

  end

return age, Death_tracker

end


MicroSim(18,100)
4

1 に答える 1

9

map関数and pmap(並列化用)を探しています。より最小限の作業例を示すために、関数を単純化しました。(将来的には、質問でこのような最小限の例を作成するためのガイダンスについては、このリンクを参照してください)。

map(指定した) 関数を取り、それを配列内のすべての要素に適用します。関数が複数の引数を取る場合 (あなたのもののように)、単にmap複数の連続した配列をフィードします。 map次に、すべての関数の結果を含む新しい配列を返します。

function MicroSim(start_age, stages)
    return rand(start_age), rand(stages)
end

Start_Ages = [10, 20, 15]
Stages = [1, 4, 5]

Results = map(MicroSim, Start_Ages, Stages)

物事を並列化したい場合は、3 つの簡単な調整を行うだけです。1.addprocs()関数を使用して、必要に応じて多くの追加プロセスを追加します。2.@everywhere関数を宣言するときにマクロを使用して、ワーカー プロセスもそれにアクセスできるようにします。3. のpmap代わりに関数を使用しmapます。

addprocs(2)

@everywhere begin
    function MicroSim(start_age, stages)
        return rand(start_age), rand(stages)
    end
end

Results = pmap(MicroSim, Start_Ages, Stages)
于 2016-07-21T23:42:32.040 に答える