在我的netlogo模拟中,我有一群海龟,它们具有多种与社会学相关的属性(例如,性别,种族,年龄等)。我希望他们形成一个在多个这些属性上相互配合的网络。我一直试图用来实现这一目标的策略是:(i)形成海龟之间所有可能的联系,(ii)计算这些“潜在”链接中每一个的配对倾向,这是一个加权线性组合关于相关属性上两只乌龟的相似之处,以及(iii)然后从模型库运行修改版本的“抽奖”代码,以便更有可能选择具有更高倾向的链接,然后将所选链接设置为是“真实的”,并且所有未赢得彩票的潜在链接(即,未设置为真实的)都将被删除。我遇到的问题是,在第一步中形成所有可能的链接会导致内存不足。我已经尽我所能来最大化netlogo可以在我的系统上使用的内存,所以这个问题与内存大小无关。相反,它是关于建模策略。我想知道是否有人可能有不同的策略来形成一个与多个乌龟属性相关的网络,而不必形成所有潜在的链接。我之所以形成所有潜在链接的原因是因为为了计算在彩票代码中使用的索引配对的倾向,似乎有必要这样做,但我对任何其他想法持开放态度,我们将非常感谢任何建议。
我已经包含了我一直在使用的彩票代码的修改版本的草稿,以防它对任何人都有帮助,但它可能有点切,因为我的问题更多是关于策略而不是特定的编码问题。谢谢!
to initial-pair-up
ask winning-link [set real? true]
end
to-report winning-link
let pick random-float sum [propensitypair] of links
let winner nobody
ask not real? links
[if winner=nobody
[ifelse similarity > pick
[set winner self] [set pick pick-similarity] ] ]
report winner
end
答案 0 :(得分:1)
对于“彩票”问题,我通常建议使用Rnd extension,但我怀疑它对你没有帮助,因为你仍然需要创建一个所有倾向对的列表,它仍然是大。
所以,假设你有一个propensity
记者(我在下面放了一个虚拟记者),这是一种可以避免炸掉记忆的方法:
to create-network [ nb-links ]
; get our total without creating links:
let total 0
ask turtles [
ask turtles with [ who > [ who ] of myself ] [
set total total + propensity self myself
]
]
; pre-pick all winning numbers of the lottery:
let picks sort n-values nb-links [ random-float total ]
let running-sum 0
; loop through all possible pairs...
ask turtles [
if empty? picks [ stop ]
ask turtles with [ who > [ who ] of myself ] [
if empty? picks [ stop ]
set running-sum running-sum + propensity self myself
if first picks < running-sum [
; ...and create a link if we have a winning pair
create-link-with myself
set picks but-first picks
]
]
]
end
to-report propensity [ t1 t2 ]
; this is just an example, your own function is probably very different
report
(1 / (1 + abs ([xcor] of t1 - [xcor] of t2))) +
(1 / (1 + abs ([ycor] of t1 - [ycor] of t2)))
end
我用10000只乌龟尝试过它:
to setup
clear-all
create-turtles 10000 [
set xcor random-xcor
set ycor random-ycor
]
create-network 1000
end
运行需要一段时间,但不需要花费太多内存。
答案 1 :(得分:0)
也许我误解了,但我不清楚为什么你需要建立(潜在的)链接来运行你的彩票代码。相反,您可以计算一对节点(nodeA和nodeB)的倾向,并在随机浮点数低于倾向时创建它们之间的链接。如果你想让它与“分享”成比例。对于倾向,首先计算所有对的总倾向,然后创建链接的概率是这对倾向/总倾向。
然后唯一的问题是每对完成一次。最简单的方法可能是所有代理的外部循环(nodeA)和代理的内部循环(nodeB),其编号大于外部循环提问者(我自己)。类似的东西:
to setup
clear-all
create-turtles 30
[ set xcor random-xcor
set ycor random-ycor
]
ask turtles
[ ask turtles with [ who > [who] of myself ]
[ if random-float 1 < 0.4 [create-link-with myself]
]
]
end