Concurrency Nim:具有突变状态的并行循环
我不熟悉这门语言。我想通过实现一个简单的遗传算法来学习它,通过将工作分配到CPU核心来进化字符串(整数数组atm): 我已经成功地并行化了“代理”的创建,但无法调用必须改变传入状态的函数“life”:Concurrency Nim:具有突变状态的并行循环,concurrency,pass-by-reference,nim-lang,Concurrency,Pass By Reference,Nim Lang,我不熟悉这门语言。我想通过实现一个简单的遗传算法来学习它,通过将工作分配到CPU核心来进化字符串(整数数组atm): 我已经成功地并行化了“代理”的创建,但无法调用必须改变传入状态的函数“life”: ... type Agent* = ref object data*: seq[int] fitness*: float ... var pool: seq[Agent] = newAgentsParallel(POPULATION_SIZE) # Run generatio
...
type
Agent* = ref object
data*: seq[int]
fitness*: float
...
var pool: seq[Agent] = newAgentsParallel(POPULATION_SIZE)
# Run generations
for gen in 0..<N_GENERATIONS:
let wheel = createWheel(pool)
let partitions: seq[seq[Agent]] = partition(pool, N_THREADS)
parallel:
for part in partitions:
echo "spawning"
spawn life(part, pool, wheel)
pool = createPool(pool, wheel)
...
proc life(part: seq[Agent], pool: seq[Agent], wheel: seq[float]) =
for a in part:
if random(1.0) < CROSSOVER_PROP:
a.crossover(pool, wheel)
if random(1.0) < MUTATE_PROP:
a.mutate()
a.calcFitness()
echo "life done"
。。。
类型
代理*=ref对象
数据*:seq[int]
健身*:浮球
...
变量池:seq[Agent]=newagentspallel(总体大小)
#世代相传
对于0中的gen..Update:通过检查生成的C或CPP代码,我可以看到life函数的包装,它复制了参数“pool”、“wheel”和“part”。这是我不想要的。代码片段:N_NIMCALL(void,lifeWrapper3iD9bvP7DZjU3JFcD7cH26g_2)(void*thread,void*args){…genericSeqDeepCopy(&colontmp)),((tyObject_Env_nim_geneticdotnim_9;keiv9cjznnodvqd0yrpbpa)(args))。第0部分,(&nti827srmgabitaei6xt9cyzxa);