【问题标题】:Random number generator in parallel computing (MATLAB), different initial random numbers in every parallel loop?并行计算中的随机数生成器(MATLAB),每个并行循环中的不同初始随机数?
【发布时间】:2016-04-07 22:57:21
【问题描述】:

假设我在 MATLAB 中有这段代码:

% Predefined data
SX = [1, 2, 3, 4];
    parfor xx = 1:4
        naming2 = SX(xx);
        [BestM, BestX{xx},  fina_M{xx}, final_D{xx}, BestAA{xx}, final_Data{xx}] = Optmz(naming2,  v_data); 
    end

Optmz 是一种优化算法。该优化算法应该运行以优化回归模型(具有不同的输出和优化的输入特征选择)。如您所知,启发式优化算法基于随机数。我们在每个parlor 循环中都有不同的初始随机数?这是减少我的申请时间的适当结构吗?我目前在上述结构中使用for 循环。

这是打印输出的一部分。迭代没有排序。任何问题?基于上面的代码,我们应该有四个相同数量的迭代。我需要在所有 4 个具有不同初始随机数生成器的工作人员中进行完全不同的计算。例如,就像我们在没有并行计算的情况下按顺序运行计算的方式一样。运行第一个,第二个,第三个,最后第四个。

******Iteration 24,   Best Cost = 0.041201******
******Iteration 26,   Best Cost = 0.034994******
******Iteration 26,   Best Cost = 0.036624******
******Iteration 26,   Best Cost = 0.039317******
******Iteration 25,   Best Cost = 0.039584******
******Iteration 27,   Best Cost = 0.034994******
******Iteration 27,   Best Cost = 0.036624******
******Iteration 27,   Best Cost = 0.039317******
******Iteration 28,   Best Cost = 0.034994******
******Iteration 26,   Best Cost = 0.039242******
******Iteration 28,   Best Cost = 0.036624******
******Iteration 28,   Best Cost = 0.03931******
******Iteration 29,   Best Cost = 0.034994******
******Iteration 29,   Best Cost = 0.036624******
******Iteration 27,   Best Cost = 0.039048******
******Iteration 29,   Best Cost = 0.03931******
******Iteration 30,   Best Cost = 0.034994******
******Iteration 30,   Best Cost = 0.036624******
******Iteration 28,   Best Cost = 0.039048******

【问题讨论】:

  • @MZimmerman6 我们在每个客厅循环中都有不同的初始随机数?这是减少我的申请时间的适当结构吗?迭代没有排序。有什么问题吗?
  • parfor 循环中,永远不能保证访问的索引是有序的。保证顺序和并行化通常是矛盾的。
  • 如果你问迭代是否可以乱序,那么,正如@rayryeng 所说,几乎不可能保证任何排序。因此,您的代码必须设计为不在乎事情是否没有按特定顺序完成。
  • 感谢两位 cmets。第二个问题是关于我的优化算法中的随机数(这里我使用的是遗传算法)。我们需要在每个工人中具有相同初始条件的相同随机数生成器吗?我预测每个工人有 4 种不同的输出。假设它是一个系统的高温、低温、中温和平均温度。
  • 如果你需要相同的随机数流,只需在进入循环之前生成一个随机数数组,并给每个循环相同的数组。这将消除确保您的随机生成同步的任何必要性。这也没有多大意义。无论如何,您为什么想要相同的随机数集。他们是同一组破坏了它的整个“随机”性质。

标签: algorithm matlab optimization parallel-processing parfor


【解决方案1】:

也许这就是你要问的,也许不是,但如果你想为每个循环使用不同的种子,你可以用时间戳或类似的东西为随机数生成器播种。这将确保每个循环都有不同的种子,因此有一组不同的随机数

nLoops = 10
parfor ii = 1:nLoops
     timeVals = strsplit(sprintf('%.9f',now),'.')
     rng(str2double(timeVals{2}))
     % do some stuff
end

或者您可以使用 MATLAB 内置的 shuffle 函数来处理rng

nLoops = 10
parfor ii = 1:nLoops
     rng('shuffle')
     % do some stuff
end

如果您不希望它在每个循环中都是随机的,只需在进入循环之前创建一个数组,无论您需要什么大小,并让每个循环都访问相同的信息。强烈建议不要在任何循环中编辑有关此数组的任何内容

nLoops = 10;
randNums = rand(1,100)
parfor ii = 1:nLoops
     %do something with randNums(someNum)
end

任何一个选项都相对容易。如果您正在做一个优化问题,您可能希望确保您的随机数是不同的,这就是优化的重点。

【讨论】:

  • 您对此有何看法? mathworks.com/help/distcomp/control-random-number-streams.html。如果我们不使用shuffle 或您的第一个建议程序在每个工人中使用不同的随机数并使用我的结构(没有任何新的代码行,与for 循环相同)我们有相同的随机数或不同的随机数每个工人的数字?我们必须使用rng(str2double(timeVals{2}))shuffle?
  • 我真的不知道。为什么不在没有其他代码的情况下运行测试,看看每个循环是否具有相同的随机数。我提供的代码提供了几种保证相同随机数和不同随机数的方法?您决定如何使用它。如果您不更清楚您的实际要求,我将无法提供更多帮助。
猜你喜欢
  • 2014-03-03
  • 2017-03-04
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
相关资源
最近更新 更多