主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

parforを使用したモンテカルロコ,ドの高速化

この例では,parforル,プを使用してモンテカルロコ,ドを高速化する方法を説明します。モンテカルロ法は,物理学,数学,生物学,金融学など,さまざまな分野で使用されています。モンテカルロ法では,ランダムに分散された入力によって1の関数が何度も実行されます。并行计算工具箱を使用すると,ルプをparforル,プに置き換えて,コ,ドを簡単に高速化できます。

この例では,ドルオ,クションに基づいて単純な確率的シミュレ,ションを実行します。モンテカルロ法を使用し,複数のシミュレ,ションを実行して1ドル紙幣の市場価値を求めます。この例では,ドルオ,クションは,ランダム過程に依存する出力を生成するブラックボックス関数として扱われます。このモデルの詳細については、ドルオ,クションを参照してください。モンテカルロコ,ドを高速化するための一般的な方法を確認するには,Parforル,プを使用した市場価値の推定を参照してください。

ドルオ,クション

ドルオークションとは,1971年にMartin shubik2009によって紹介されたノンゼロサムゲームです。ゲ,ムの中で,参加者は1ドル紙幣に入札します。1人の参加者が入札後、他の参加者はそれぞれ前の入札者より高額での入札を選ぶことができます。入札を決断する参加者がいなくなると、オークションは終了します。最高額入札者が 1 ドル紙幣を受け取りますが、通常のオークションとは異なり、最高額の入札者と 2 番目に高い金額を提示した入札者の両方が自分の入札額をオークション主催者に渡します。

確率的モデル

確率的モデルを使用すると,ドルオ,クションに似たゲ,ムをモデル化できます。状態(現在の入札額と参加者数)は,マルコフ過程を使用してモデル化できるため,結果(市場価値)は適切に定義された統計量をもつと予測できます。結果は条件付き分布から導き出されるため,ドルオ,クションはモンテカルロ解析には理想的です。市場価値は以下の要因に影響されます。

  • 参加者数 (nPlayers

  • 参加者の行動

この例では,以下のアルゴリズムで,状態次第で参加者がどのような行動を取るか(入札するか離脱するか)を判定します。

  1. 入札額を前の入札額プラス增加に設定します。

  2. 前の入札者以外の参加者の中から,1人の参加者をランダムに選択します。

  3. まだ入札が行われていない場合は,8に進みます。

  4. 前の入札額が1未満の場合は,0から1の間の乱数を生成します。この乱数がdropoutRate未満の場合は,7に進みます。

  5. 参加者が落札した場合に稼ぐことのできる金額(获得)を計算します。

  6. 参加者が2番目に高い金額の入札者となった場合に失う金額(损失)を計算します。获得损失より大きい場合は,8に進みます。

  7. 参加者が離脱します。その参加者を参加者グル,プから削除して,9に進みます。

  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の前に10を付けることによって追加します。

epoch = [1;epoch];numberDropouts = [0;numberDropouts];

nPlayerscumsumを使用して,残りの参加者数を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プロパティをルプンデックスに設定します。dollarAuctiondollarAuctionStreamに置き換え,年代を使用してワ,カ,上で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);

サポ,ト関数dollarAuctionStreamparforル,プ内で計算します。同じ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 (“计算加速”

計算の高速化はワ,カ,数に伴って上昇します。