このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
parfor
を使用したモンテカルロコ,ドの高速化
この例では,parfor
ル,プを使用してモンテカルロコ,ドを高速化する方法を説明します。モンテカルロ法は,物理学,数学,生物学,金融学など,さまざまな分野で使用されています。モンテカルロ法では,ランダムに分散された入力によって1の関数が何度も実行されます。并行计算工具箱を使用すると,为
ルプをparfor
ル,プに置き換えて,コ,ドを簡単に高速化できます。
この例では,ドルオ,クションに基づいて単純な確率的シミュレ,ションを実行します。モンテカルロ法を使用し,複数のシミュレ,ションを実行して1ドル紙幣の市場価値を求めます。この例では,ドルオ,クションは,ランダム過程に依存する出力を生成するブラックボックス関数として扱われます。このモデルの詳細については、ドルオ,クションを参照してください。モンテカルロコ,ドを高速化するための一般的な方法を確認するには,Parforル,プを使用した市場価値の推定を参照してください。
ドルオ,クション
ドルオークションとは,1971年にMartin shubik2009によって紹介されたノンゼロサムゲームです。ゲ,ムの中で,参加者は1ドル紙幣に入札します。1人の参加者が入札後、他の参加者はそれぞれ前の入札者より高額での入札を選ぶことができます。入札を決断する参加者がいなくなると、オークションは終了します。最高額入札者が 1 ドル紙幣を受け取りますが、通常のオークションとは異なり、最高額の入札者と 2 番目に高い金額を提示した入札者の両方が自分の入札額をオークション主催者に渡します。
確率的モデル
確率的モデルを使用すると,ドルオ,クションに似たゲ,ムをモデル化できます。状態(現在の入札額と参加者数)は,マルコフ過程を使用してモデル化できるため,結果(市場価値)は適切に定義された統計量をもつと予測できます。結果は条件付き分布から導き出されるため,ドルオ,クションはモンテカルロ解析には理想的です。市場価値は以下の要因に影響されます。
参加者数 (
nPlayers
)参加者の行動
この例では,以下のアルゴリズムで,状態次第で参加者がどのような行動を取るか(入札するか離脱するか)を判定します。
入札額を前の入札額プラス
增加
に設定します。前の入札者以外の参加者の中から,1人の参加者をランダムに選択します。
まだ入札が行われていない場合は,8に進みます。
前の入札額が1未満の場合は,0から1の間の乱数を生成します。この乱数が
dropoutRate
未満の場合は,7に進みます。参加者が落札した場合に稼ぐことのできる金額(
获得
)を計算します。参加者が2番目に高い金額の入札者となった場合に失う金額(
损失
)を計算します。获得
が损失
より大きい場合は,8に進みます。参加者が離脱します。その参加者を参加者グル,プから削除して,9に進みます。
参加者が入札します。
2人以上の参加者が残っている場合は,手順1に進みます。
サポ,ト関数dollarAuction
がドルオ,クションをシミュレ,トします。コ,ドを表示するには,dollarAuction.m
を参照してください。この関数は,nPlayers
、增加
およびdropoutRate
の3の入力を取ります。それぞれの値を設定します。
nPlayers =20.;增加=0.05;dropoutRate =0.01;
関数dollarAuction
を実行することにより,ランダムなシナリオを実行します。出力投标
および辍学
を保存します。
[出价,dropouts] =美元拍卖(nPlayers,incr, dropoutate);
ゲムが進むにれ,入札する参加者と離脱する参加者が出てきます。入札額が1を超えた場合,残り1名になるまで,参加者たは“入札合戦”に陥ります。
表格辍学
には,2の変数が含まれており,球员
は各参加者に割り当てられている一意な番号,时代
は,球员
が何周目の入札時に離脱したかを示します。findgroups
を使用して辍学。时代
をグル,プ化し,splitapply
を使用して辍学。时代
のそれぞれの周回で離脱した参加者の数を取得します。
[G,epoch] = findgroups(dropouts.Epoch);numberDropouts = splitapply(@ number,dropouts.Epoch,G);
最初は,離脱者はいません。この情報を,时代
とnumberDropouts
の前に1
と0
を付けることによって追加します。
epoch = [1;epoch];numberDropouts = [0;numberDropouts];
nPlayers
とcumsum
を使用して,残りの参加者数をnumberDropouts
から計算します。增加
と时代
を使用して入札額を計算します。楼梯
を使用して,numberDropouts
の累積和に対して入札額をプロットします。
playersRemaining = nPlayers - cumsum(numberDropouts);楼梯(增加*时代,playersRemaining)包含(“收购”) ylabel (“剩余玩家数量”)
モンテカルロ法を使用した市場価値の推定
モンテカルロ法を使用することにより,紙幣の市場価値を値origValue
で推定できます。ここでは,モンテカルロモデルを生成し,并行计算工具箱を使用する場合と使用しない場合の速度を比較します。結果をランダムにサンプリングするために使用する試行回数nTrials
を設定します。
nTrials = 10000;
サポ,ト関数dollarAuction
を複数回実行すると,起こり得る結果をサンプリングできます。为
ル,プを使用してnTrials
個のサンプルを生成し,各試行の最後の入札額をB
に保存します。関数dollarAuction
を実行するたびに,異なる結果が得られます。しかし,関数の実行回数が多くなると,すべての実行から得られる結果は適切に定義された統計量をもちます。
nTrials
回のシミュレ,ションの計算が完了するまでの所要時間を記録します。経過時間の統計ノ电子邮箱ズを削減するために,この処理を 5 回繰り返して、最短の経過時間を取ります。
T = 0 (1,5);为j = 1:5 tic B =零(1,n个试验);为i = 1:nTrials投标=美元拍卖(nPlayers,incr, dropoutate);B(i) = bids.Bid(end);结束T (j) = toc;结束forTime = min(t)
forTime = 21.4323
柱状图
を使用して,最終入札額B
のヒストグラムをプロットします。参照线
を使用して,元の値(1ドル)と的意思是
によって得られた平均市場価値をプロットに重ね合わせます。
直方图(B);origLine = xline(1,“k”,“线宽”3);marketLine = xline(均值(B),“k——”,“线宽”3);包含(“市场价值”) ylabel (“频率”) legend([origLine, marketLine],{“原值”,“市场价值”},“位置”,“东北”)
与えられたアルゴリズムと入力パラメ,タ,では,平均市場価値は元の価値より大きくなりました。
parfor
ル,プを使用した市場価値の推定
并行计算工具箱を使用すると,モンテカルロコードを簡単に高速化できます。まず,“本地”
。
P = parpool(“本地”4);
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工人数量:4)。
为
ルプをparfor
ル,プに置き換えます。nTrials
回のシミュレ,ションの計算が完了するまでの所要時間を記録します。経過時間の統計ノ电子邮箱ズを削減するために,この処理を 5 回繰り返して、最短の経過時間を取ります。
T = 0 (1,5);为J = 1:5 ticparfori = 1:nTrials投标=美元拍卖(nPlayers,incr, dropoutate);B(i) = bids.Bid(end);结束T (j) = toc;结束parforTime = min(t)
parforTime = 5.9174
ワカが4の場合,parfor
ルプを使用するとコドを3倍以上高速で実行できることが結果によって示されています。
parfor
ル,プでの乱数による再現可能な結果の生成
parfor
ル,プで乱数を生成すると,ル,プを実行するたびに異なる結果が生成される可能性があります。再現可能な結果を作成するには,ル,プの各反復で,乱数発生器の状態が確定的でなければなりません。詳細にいては,Parforル,プでの乱数の繰り返しを参照してください。
サポ,ト関数dollarAuctionStream
は,4番目の引数年代
を取ります。このサポ,ト関数は,指定されたストリ,ムを使用して乱数を生成します。コ,ドを表示するには,dollarAuctionStream.m
を参照してください。
ストリ,ムを作成するとき,そのストリ,ムのサブストリ,ムは統計的に独立しています。詳細にいては,RandStream
を参照してください。コ,ドで生成される結果の分布を毎回同じにするには,ル,プの反復ごとに乱数発生器ストリ,ムを作成し,Substream
プロパティをルプンデックスに設定します。dollarAuction
をdollarAuctionStream
に置き換え,年代
を使用してワ,カ,上でdollarAuctionStream
を実行します。
nTrials
回のシミュレ,ションの計算が完了するまでの所要時間を記録します。経過時間の統計ノ电子邮箱ズを削減するために,この処理を 5 回繰り返して、最短の経過時間を取ります。
T = 0 (1,5);为J = 1:5 ticparfori = 1:nTrials s = RandStream(“Threefry”);s.Substream = i;bids = dollarAuctionStream(nPlayers,incr, dropoutate,s);B(i) = bids.Bid(end);结束T (j) = toc;结束parforTime = min(t)
parforTime = 8.7355
デスクトップからクラスタ,へのスケ,ルアップ
デスクトップから,より多くのワーカーをもつクラスターへ,コードをスケールアップすることができます。デスクトップからクラスタへのスケルアップの詳細にいては,デスクトップからクラスタ,へのスケ,ルアップを参照してください。
删除
を使用して既存の並列プ,ルをシャットダウンします。
删除(p);
サポ,ト関数dollarAuctionStream
をparfor
ル,プ内で計算します。同じparfor
ル,プを異なる数のワ,カ,で実行し,経過時間を記録します。経過時間の統計ノ电子邮箱ズを削減するために,parfor
ル,プを5回実行して,最短の経過時間を取ります。最短時間を配列elapsedTimes
に記録します。次のコ,ドのMyCluster
をクラスタプロファルの名前に置き換えます。
工人= [1 2 4 8 16 32];elapsedTimes = 0(1,数字(工人));使用'MyCluster'集群配置文件创建一个池P = parpool(“MyCluster”、32);
启动并行池(parpool)使用'MyCluster'配置文件…连接到并行池(工人数:32)。
为K = 1:数字(工人)t =零(1,5);为J = 1:5 ticparfor(i = 1:nTrials, workers(k)) s = RandStream(“Threefry”);s.Substream = i;bids = dollarAuctionStream(nPlayers,incr, dropoutate,s);B(i) = bids.Bid(end);结束T (j) = toc;结束elapsedTimes(k) = min(t);结束
分析文件并将文件传输给工作人员…完成。
elapsedTimes (1)
をelapsedTimes
の時間で除算して,計算の高速化を計算します。ワ,カ,数に対する高速化をプロットすることにより,ストロングスケ,リングを調べます。
speedup = elapsedTimes(1) ./ elapsedTimes;情节(工人,加速)包含(“工人人数”) ylabel (“计算加速”)
計算の高速化はワ,カ,数に伴って上昇します。