主要内容

使用parfor加快蒙特卡罗代码

这个例子展示了如何加快蒙特卡罗代码通过使用parfor循环。蒙特卡罗方法在许多领域,包括物理、数学、生物学、和融资。蒙特卡罗方法包括多次执行一个函数与随机分布的输入。并行计算工具箱,你可以换一个循环用parfor循环很容易加速代码。

这个例子中运行一个简单的随机模拟基于美元拍卖。运行多个模拟来找到一美元的市场价值使用蒙特卡罗方法。在这个例子中,美元拍卖都被视为一个黑盒功能,产生输出,取决于随机过程。找到更多关于模型,明白了美元拍卖。如何加快蒙特卡罗代码一般来说,明白了使用parfor-loop估计市场价值

美元拍卖

美元拍卖是一个零和游戏在1971年首次引入的Martin shubik2009。在游戏中,玩家一美元。玩家提出报价后,其他玩家可以选择出价高于先前的出价。拍卖结束当没有更多的球员决定放置一个出价。出价最高的人接收到一美元的钞票,但是,与一个典型的拍卖最高和第二高的出价给拍卖人投标。

随机模型

你可以使用随机模型游戏类似于美元拍卖模型。状态(当前出价和活跃玩家数量)可以使用马尔可夫过程,建模,因此结果(市场价值)预计会有定义良好的统计数据。结果来自条件分布,因此美元拍卖是理想的蒙特卡罗分析。市场价值是受到以下因素的影响:

  • 的玩家数量,(nPlayers)

  • 玩家采取的行动

在这个例子中,下面的算法决定了玩家采取什么行动(招标或辍学)根据状态。

  1. 把加到前面的报价增加

  2. 随机选择一个球员从球员不是先前的出价。

  3. 如果以前没有报价,去8。

  4. 如果之前的出价小于1,生成一个随机数在0和1之间。如果随机数小于dropoutRate,去7所示。

  5. 计算多少钱获得可以获得如果玩家得标者。

  6. 计算多少钱损失玩家失去了如果他们出价第二高的人。如果获得大于损失,去8所示。

  7. 玩家滴。从组中删除玩家的球员,然后去9。

  8. 玩家出价。

  9. 如果有2个或更多的玩家剩余,步骤1。

支持函数金宝appdollarAuction模拟1美元拍卖。查看代码,看看dollarAuction.m。这个函数接受三个输入:nPlayers,增加,dropoutRate。设置的值。

nPlayers =20.;增加=0.05;dropoutRate =0.01;

运行一个随机场景中通过执行dollarAuction函数。存储输出投标辍学

(投标,辍学)= dollarAuction (nPlayers、增加dropoutRate);

随着比赛的继续,一些球员报价和一些辍学的地方。如果出价超过1,球员们被关在一个“竞购战”,直到只剩下一个球员。

辍学包含两个变量:球员一个惟一的编号分配给每个玩家;时代一轮招标时球员辍学了。使用findgroupsdropouts.Epoch,并使用splitapply让球员的数量在每个独特的轮的退出dropouts.Epoch

[G时代]= findgroups (dropouts.Epoch);numberDropouts = splitapply (@numel, dropouts.Epoch, G);

最初,没有辍学。添加这些信息时代numberDropouts通过将10

时代=(1;时代);numberDropouts = [0; numberDropouts];

使用nPlayerscumsum计算剩余的玩家数量numberDropouts。计算投标使用增加时代。使用楼梯情节竞价的总合numberDropouts

playersRemaining = nPlayers - cumsum (numberDropouts);楼梯(增加*时代,playersRemaining)包含(“收购”)ylabel (“剩下的玩家数量”)

使用蒙特卡罗方法估计市场价值

你可以估计该法案的市场价值与价值origValue利用蒙特卡罗方法。在这里,你产生一个蒙特卡罗模型和比较的速度和并行计算工具箱。设定试验的数量nTrials用于随机样本的结果。

nTrials = 10000;

您可以通过执行示例可能的结果支持功能金宝appdollarAuction很多次了。使用一个循环生产nTrials从每个试验样本,存储最后报价B。每次运行dollarAuction函数,得到不同的结果。然而,当您运行的函数很多次,你从所有的生产运行的结果会有定义良好的统计数据。

记录的时间计算nTrials模拟。减少运行时间的统计噪声,5次重复这个过程,然后将最小运行时间。

t = 0 (1、5);j = 1:5抽搐B = 0 (1, nTrials);i = 1: nTrials报价= dollarAuction (nPlayers、增加dropoutRate);B (i) = bids.Bid(结束);结束t (j) = toc;结束forTime = min (t)
forTime = 21.4323

使用柱状图画一个柱状图最终的报价B。使用参照线与原始值叠加情节(1美元)和平均的市场价值的意思是

直方图(B);origLine =参照线(1,“k”,“线宽”3);marketLine =参照线(意思是(B),“k——”,“线宽”3);包含(“市场价值”)ylabel (“频率”)传说([origLine, marketLine], {“原值”,“市场价值”},“位置”,“东北”)

用给定的算法和输入参数,平均市场价值大于原始值。

使用parfor循环评估市场价值

您可以使用并行计算工具箱很容易加速蒙特卡罗代码。首先,创建一个平行池有四个工人使用“过程”概要文件。

p = parpool (“过程”4);
开始平行池(parpool)使用过程的概要文件…连接到平行池4工人。

取代循环用parfor循环。记录的时间计算nTrials模拟。减少运行时间的统计噪声,重复这个过程5次取最小运行时间。

t = 0 (1、5);j = 1:5抽搐parfori = 1: nTrials报价= dollarAuction (nPlayers、增加dropoutRate);B (i) = bids.Bid(结束);结束t (j) = toc;结束parforTime = min (t)
parforTime = 5.9174

有四个工人,结果indiciate,代码可以运行/当你使用快3倍parfor循环。

随机数的产生可重复的结果parfor循环

当你生成随机数parfor循环,每个循环的运行可以产生不同的结果。循环的每次迭代,创建可重复的结果必须有一个确定的随机数字生成器的状态。有关更多信息,请参见在parfor-Loops重复随机数字

支持函数金宝appdollarAuctionStream接受第四个参数,年代。这支持函数金宝app使用一个指定的流产生随机数。查看代码,看看dollarAuctionStream.m

当您创建一个流,substreams流是统计独立的。有关更多信息,请参见RandStream。确保您的代码每次产生相同的分布结果,创建一个随机数字生成器流的每个迭代循环,然后设置Substream房地产循环指数。取代dollarAuctiondollarAuctionStream,然后用年代运行dollarAuctionStream一个工人。

记录的时间计算nTrials模拟。减少运行时间的统计噪声,5次重复这个过程,然后将最小运行时间。

t = 0 (1、5);j = 1:5抽搐parfori = 1: nTrials s = RandStream (“Threefry”);年代。Substream =我;报价= dollarAuctionStream (nPlayers,增加dropoutRate s);B (i) = bids.Bid(结束);结束t (j) = toc;结束parforTime = min (t)
parforTime = 8.7355

从桌面到集群规模

你可以从你的桌面代码规模和更多的工人一个集群。关于扩大的更多信息从桌面到一个集群,明白了从桌面到集群规模

使用删除关闭现有的并行池。

删除(p);

计算支持功能金宝appdollarAuctionStream在一个parfor循环。运行相同的parfor循环与不同数量的工人,并记录运行时间。为了减少运行时间统计噪音,运行parfor循环五次,然后把最小运行时间。记录的最低次数组elapsedTimes。在以下代码中,替换MyCluster集群的配置文件的名称。

工人= [1 2 4 8 16 32];elapsedTimes = 0(1,元素个数(工人));%使用“MyCluster”集群配置文件创建一个池p = parpool (“MyCluster”、32);
开始平行池(parpool)使用“MyCluster”概要文件…连接到平行池(工人数量:32)。
k = 1:元素个数(工人)t = 0 (1、5);j = 1:5抽搐parfor(i = 1: nTrials,工人(k)) s = RandStream (“Threefry”);年代。Substream =我;报价= dollarAuctionStream (nPlayers,增加dropoutRate s);B (i) = bids.Bid(结束);结束t (j) = toc;结束elapsedTimes (k) = min (t);结束
工人们…做分析和传输文件。

计算计算加速除以elapsedTimes (1)《纽约时报》的elapsedTimes。检查强大的扩展通过绘制加速对工人的数量。

加速= elapsedTimes (1)。/ elapsedTimes;情节(工人,加速)包含(工人的数量)ylabel (“计算加速”)

计算加速增加工人的数量。