gpt4 book ai didi

social-networking - 创建不同品种的链接 NetLogo 代理的社交网络

转载 作者:行者123 更新时间:2023-12-04 04:45:38 26 4
gpt4 key购买 nike

我正在尝试在 NetLogo 中组合一个“社交网络”。通过链接连接的不同年龄段的一群人。

我在如何将它们组合在一起时遇到了麻烦,因为我仍然不完全熟悉 NetLogo 语法的某些部分。我上周才开始在我的代码中使用品种,我还没有完全解决它们。或者我把它们复杂化了,我不确定。

相关代码如下,所讨论的功能是“创建网络”功能。我需要让每个代理(总共大约有 800 个)连接到一定数量的每种类型的其他代理(只要其他代理未满)。例如,如果乌龟属于幼儿品种,它将总共有 10 个链接,其中 5 个链接到其他幼儿,2 个链接到 child ,2 个链接到成人,1 个链接到 45 岁以上。如果第一个节点是一个蹒跚学步的 child 并且它连接到一个成年人,我将需要减少成人节点在我到达它时也将尝试连接的幼儿数量,如果这是有道理的。

我不知道如何询问当前的海龟它是什么品种,以便我可以链接到适量的正确品种。如果有人可以帮助我,我将不胜感激。这只是代码的一小部分,但它让我疯狂了好几天

每次我尝试一些事情都会导致错误,我完全没有想法和生活的意愿。非常感谢您的时间。即使您对更好的算法有任何想法但没有编码,也将非常受欢迎

breed [toddlers toddler]
breed [children child]
breed [adults adult]
breed [over45s over45]

globals
[
num-nodes
]

toddlers-own
[
tod-total-connections
tod-tods
tod-children
tod-adults
tod-over45s
]

children-own
[
child-total-connections
child-tods
child-children
child-adults
child-over45s
]

adults-own
[
adult-total-connections
adult-tods
adult-children
adult-adults
adult-over45s
]

over45s-own
[
over45-total-connections
over45-tods
over45-children
over45-adults
over45-over45s
]


to generate
clear-all
create-toddlers num-toddlers
create-children num-children
create-adults num-adults
create-over45s num-over45
create-network
setup
reset-ticks
end

to setup
ask turtles
[reset-node]
ask links
[set color gray + 1.5]
ask adults
[set shape "circle"
set size 4]
ask toddlers
[set shape "face happy"
set size 4]
ask over45s
[set shape "triangle"
set size 4]


;;INITIALISE BREEDS

;;Initialise Toddlers
ask toddlers [set total-connections 10]
ask toddlers [set tod-tods 5]
ask toddlers [set tod-children 2]
ask toddlers [set tod-adults 2]
ask toddlers [set tod-over45s 1]

;;Initialise Children
ask children [set total-connections 17]
ask children [set child-tods 3]
ask children [set child-children 8]
ask children [set child-adults 5]
ask children [set child-over45s 1]

;;Initialise Adults
ask adults [set total-connections 13]
ask adults [set adult-tods 1]
ask adults [set adult-children 3]
ask adults [set adult-adults 6]
ask adults [set adult-over45s 3]

;;Initialise Over45s
ask over45s [set total-connections 12]
ask over45s [set over45-tods 1]
ask over45s [set over45-children 1]
ask over45s [set over45-adults 5]
ask over45s [set over45-over45s 5]



;; Layout turtles:
layout-circle (sort turtles) max-pxcor - 8
ask turtles
[
facexy 0 0
if who mod 2 = 0 [fd 4]
]
display
end


;; THIS IS THE PROBLEM FUNCTION
to create-network
let q 0
let n 0
while [q < count turtles]
[
let m 1
while [m < count turtles]
[
make-link-between turtle n
turtle ((n + m) mod count turtles)
set m m + 1
;;results in a fully connected network which I don't want
]
set n n + 1
set q q + 1
]

end


;; connects the two nodes
to make-link-between [node1 node2]
ask node1 [
create-link-with node2
[ set color gray + 1.5]
]
end

我还想知道是否有可能具有“暂停”代理之间链接的功能。例如关闭一些或所有 child 之间的联系。我知道链接具有 tie-mode 属性,但我不确定这是否能够做到这一点。从我读到的内容来看,似乎更多的是将移动代理放在一起?我可以使用解开作为关闭链接但仍然存在链接的方法吗?

编辑:隐藏链接可能更合适。如何隐藏正确的链接是接下来的事情

最佳答案

首先,让我们解决这个问题:

I can't work out how to ask the current turtle what breed it is



龟有 a breed variable .

但我认为,更笼统地说,您还没有接受 NetLogo 的做事方式。您的代码非常必要,使用 while 循环和索引。你应该避免用它们的 who 来称呼海龟数字(尽管您自己的布局代码可能是一个罕见的异常(exception))。 NetLogo 是关于列表、代理集和(如果可能)功能转换。

无论如何,这是我认为解决您的问题的更好方法。最棘手的一点是如何 reverse-num-connexions是计算出来的,但是试图弄清楚它是如何工作的应该是学习如何处理列表的一个很好的练习。

另外,请注意,海龟可能不会以所需的连接数结束,因为它的所有目标都已达到最大值。这将取决于您的人口比例。
breed [ toddlers toddler ]
breed [ children child ]
breed [ adults adult ]
breed [ over45s over45 ]

to setup
clear-all
create-toddlers 200
create-children 200
create-adults 200
create-over45s 200
create-network
reset-ticks
end

to create-network

let connexions (list
(list toddlers toddlers 5)
(list toddlers children 2)
(list toddlers adults 2)
(list toddlers over45s 1)
(list children toddlers 3)
(list children children 8)
(list children adults 5)
(list children over45s 1)
(list adults toddlers 1)
(list adults children 3)
(list adults adults 6)
(list adults over45s 3)
(list over45s toddlers 1)
(list over45s children 1)
(list over45s adults 5)
(list over45s over45s 5)
)

foreach connexions [
let source-breed item 0 ?
let target-breed item 1 ?
let num-connexions item 2 ?
let reverse-num-connexions item 2 first filter [
item 0 ? = target-breed and item 1 ? = source-breed
] connexions
ask source-breed [
repeat num-connexions [
let possible-targets other target-breed with [
(not member? myself link-neighbors) and
(count link-neighbors with [ breed = source-breed ] < reverse-num-connexions)
]
let target one-of possible-targets
if target != nobody [ create-link-with target ]
]
]
]

end

reverse-num-connexions解释(编辑)

假设我们正在遍历我们的连接数列表,我们得到 [toddlers adults 2] .也就是说,每个蹒跚学步的 child 都应该与 2 个成年人有联系。但是,如果我们进一步查看列表,我们会发现成年人应该与不超过 1 个蹒跚学步的 child 建立联系: [adults toddlers 1] .这个数字( 1 )是我们试图提取以存储为 reverse-num-connexions 的数字。 .

首先要做的是找到正确的子列表。这将是“源”和“目标”品种与当前品种相反的品种。表达式 filter [ item 0 ? = target-breed and item 1 ? = source-breed ] connexions将返回一个仅包含该子列表的列表: [[adults toddlers 1]] .为了提取它,我们使用 first ,这给了我们子列表: [adults toddlers 1] .现在,我们想要该子列表的最后一项,即 item 2 .这将为我们提供 1我们所追求的。

关于social-networking - 创建不同品种的链接 NetLogo 代理的社交网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18230305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com