【问题标题】:How to evaluate the cost of a simulation algorithm如何评估模拟算法的成本
【发布时间】:2014-03-31 06:55:17
【问题描述】:

我有一个蒙特卡洛马尔可夫链模拟要测试。系统大小为n。现在想知道n和cost是什么关系。换句话说,我想知道成本中n 的幂/阶,例如,是n^2.5 还是n^2.8

由于涉及的因素和步骤很多,我不想先分析复杂性。我非常想运行模拟以获得机器时间成本。所以我的问题是如何根据机器时间获得成本关系n^x,其中x 是未知的?

例如n = 1000时,需要t_1运行一次完整的扫描,也就是1000蒙特卡洛步骤。当n = 666 时,需要t_2 运行一个完整的扫描,这次是666 Monte Carlo 步骤。 n的不同大小我可以得到t_1,t_2,t_3,那么如何查看费用的顺序呢?

顺便说一句,使用不同的计算机获取机器时间有关系吗?对不起,我的无知。

【问题讨论】:

  • 使用 tic, toc 获取不同 n 的时间(我猜如果给定时间存在分布,你必须取平均值),然后使用 log 获取指数(假设它是指数形式)并在不同的 n 值上进行最佳拟合。
  • @Lazarus 非常感谢。请您单独回答,以便我可以选择答案?
  • @Lazarus 通过取平均值,你的意思是我需要为一个 n 的系统运行 k*n 次并且平均时间超过 k 吗?
  • 是的。你经营的是蒙特卡罗,所以我认为会有一些差异。如果方差真的很小,那么就忽略平均部分。

标签: matlab complexity-theory simulation time-complexity montecarlo


【解决方案1】:

使用tic, toc 获取不同n 的时间。如果您有给定n 的时间分布,则求平均值。

那么,如果你知道它有指数形式,你可以得到

order = log(avgtime);

对于每个 n 值使用不同的 order 值,您将运行最合适的值(可能是 polyfit)。

【讨论】:

  • 我使用不同的计算机来获取机器时间是否重要?对不起我的无知。我想机器时间应该与特定的计算机无关,对吧?
  • 时间取决于电脑。复杂性不应该。从技术上讲,你会得到一些 A*n^p,其中 p 是复杂度,A 是一些与机器相关的常数。
【解决方案2】:

This MathWorks article 有一些一般性推荐,包括timeittic/toccputime

timeit 函数通常比it accounts for first-time run costs 更好。但是,运行起来稍微复杂一些,因为它需要一个函数句柄,并且可以选择从句柄中获取输出参数的数量:

X = [1 2; 3 4; 5 6; 7 8];
f = @() svd(X);
t = timeit(f, 3)

相比tic/toc,之所以这么方便、准确,是因为:

timeit 多次调用指定函数,并计算测量值的中位数。

cputime 函数很有趣,因为与多线程机器上的 tic/toctimeit 相比,它会给出更高的数字。如果您对计算负担感兴趣,也许这是一个更相关的指标。 The cputime Function vs. tic/toc and timeit.

以前有flops命令返回浮点运算次数,但那是removed ages ago。如果你真的想计算翻牌数,Lightspeed toolbox 有用于此目的的功能。

【讨论】:

  • 非常感谢您提供信息丰富的回复。我正在调查你提到的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 2021-05-13
  • 2020-03-29
相关资源
最近更新 更多