Julia,运行 函数多次,将结果保存在数组中
Julia, run function multiple times, save results in array
我正在用 Julia 构建微观仿真模型。我已经构建了我的函数的结构,它 运行 非常适合 1 "person"。我想通过模型将脚本编写给 运行 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)
您正在查找函数 map
和 pmap
(用于并行化)。我已经简化了您的功能以提供一个更简单的工作示例。 (将来,请参阅 this link 以获取有关在您的问题中创建此类最少示例的指导)。
map
采用一个函数(您指定)并将其应用于数组中的所有元素。如果您的函数接受多个参数(就像您的函数一样),那么您只需输入 map
多个连续的数组。 map
然后 returns 一个包含所有函数结果的新数组。
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)
我正在用 Julia 构建微观仿真模型。我已经构建了我的函数的结构,它 运行 非常适合 1 "person"。我想通过模型将脚本编写给 运行 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)
您正在查找函数 map
和 pmap
(用于并行化)。我已经简化了您的功能以提供一个更简单的工作示例。 (将来,请参阅 this link 以获取有关在您的问题中创建此类最少示例的指导)。
map
采用一个函数(您指定)并将其应用于数组中的所有元素。如果您的函数接受多个参数(就像您的函数一样),那么您只需输入 map
多个连续的数组。 map
然后 returns 一个包含所有函数结果的新数组。
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)