并行计算中的随机数生成器(MATLAB),每个并行循环中的初始随机数不同?
Random number generator in parallel computing (MATLAB), different initial random numbers in every parallel loop?
假设我在 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******
也许这就是您要问的,也许不是,但是如果您希望每个循环使用不同的种子,您可以为随机数生成器播种时间戳或类似的东西。这将确保每个循环都有不同的种子,因此有一组不同的随机数
nLoops = 10
parfor ii = 1:nLoops
timeVals = strsplit(sprintf('%.9f',now),'.')
rng(str2double(timeVals{2}))
% do some stuff
end
或者您可以使用 MATLAB 的内置随机播放函数 rng
nLoops = 10
parfor ii = 1:nLoops
rng('shuffle')
% do some stuff
end
如果您不希望它在每个循环中都是随机的,只需在进入循环之前创建一个数组,无论您需要什么大小,并让每个循环访问相同的信息。强烈建议 none 的循环编辑关于此数组的任何内容
nLoops = 10;
randNums = rand(1,100)
parfor ii = 1:nLoops
%do something with randNums(someNum)
end
这两种选择都相对容易。如果你正在做一个优化问题,你可能想要确保你的随机数是不同的,这就是优化的重点。
假设我在 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******
也许这就是您要问的,也许不是,但是如果您希望每个循环使用不同的种子,您可以为随机数生成器播种时间戳或类似的东西。这将确保每个循环都有不同的种子,因此有一组不同的随机数
nLoops = 10
parfor ii = 1:nLoops
timeVals = strsplit(sprintf('%.9f',now),'.')
rng(str2double(timeVals{2}))
% do some stuff
end
或者您可以使用 MATLAB 的内置随机播放函数 rng
nLoops = 10
parfor ii = 1:nLoops
rng('shuffle')
% do some stuff
end
如果您不希望它在每个循环中都是随机的,只需在进入循环之前创建一个数组,无论您需要什么大小,并让每个循环访问相同的信息。强烈建议 none 的循环编辑关于此数组的任何内容
nLoops = 10;
randNums = rand(1,100)
parfor ii = 1:nLoops
%do something with randNums(someNum)
end
这两种选择都相对容易。如果你正在做一个优化问题,你可能想要确保你的随机数是不同的,这就是优化的重点。