并行计算中的随机数发生器(MATLAB),每个并行循环中的不同初始随机数?

时间:2016-04-07 13:57:57

标签: algorithm matlab optimization parallel-processing parfor

假设我在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******

1 个答案:

答案 0 :(得分:1)

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

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

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

编辑有关此数组的任何内容
nLoops = 10;
randNums = rand(1,100)
parfor ii = 1:nLoops
     %do something with randNums(someNum)
end

任一选项都相对容易。如果您正在进行优化问题,您可能希望确保您的随机数不同,这是优化的一种方式。