7

我正在 Julia 中建立一个微观模拟模型。我已经构建了我的函数结构,它对于 1 个“人”来说运行得很好。我想编写脚本通过模型运行 100000 多人并将结果保存在一个位置。

最终我想并行执行这个。

下面我包含了一个带有虚拟概率的简单工作版本的代码。

using Distributions

# Microsim function
function  MicroSim(start_age, stages)
  stage = 0
  age = start_age

  # Set all trackers to 0
  Death_tracker = 0
  Disease_tracker = 0

  # While loop
  while stage <= stages
    age = age

    ###########################################################
    # Probability of Death
    pD = 0.02

    if age == 100
      pD = 1.0
    else
      pD = pD
    end

    # Coin flip
    dist_pD = Bernoulli(pD)
    Died = rand(dist_pD, 1)

    if Died == [1]
      Death_tracker = 1
      # death tracker loop break
      if Death_tracker == 1
        # println("I died")
        break
      end
    else
      Death_tracker = Death_tracker
    end
    ###########################################################

  # Update age and stage
  age = age + 1
  stage = stage + 1

  end

return age, Death_tracker

end


MicroSim(18,100)
4

1 回答 1

9

您正在寻找函数mappmap(用于并行化)。我已经简化了您的功能,以提供一个更简单的工作示例。(将来,请参阅此链接以获取有关在您的问题中创建此类最小示例的指导)。

map接受一个函数(您指定)并将其应用于数组中的所有元素。如果您的函数采用多个参数(如您的那样),那么您只需提供map多个连续的数组。 map然后返回一个包含所有函数结果的新数组。

function MicroSim(start_age, stages)
    return rand(start_age), rand(stages)
end

Start_Ages = [10, 20, 15]
Stages = [1, 4, 5]

Results = map(MicroSim, Start_Ages, Stages)

如果你想并行化,只有三个简单的调整。1.使用该addprocs()功能添加您想要的许多其他流程。2.@everywhere声明函数时使用宏,以便您的工作进程也可以访问它。3.使用函数pmap代替map

addprocs(2)

@everywhere begin
    function MicroSim(start_age, stages)
        return rand(start_age), rand(stages)
    end
end

Results = pmap(MicroSim, Start_Ages, Stages)
于 2016-07-21T23:42:32.040 回答