NetLogo技术问询:如何基于变量同属列表条件构建海龟间连接
NetLogo 网络建模问题解决方案
我来帮你搞定这两个NetLogo的建模需求,都是关于网络构建的,咱们一步步拆解:
1. 基于海龟变量同属同一列表构建连接
首先得明确核心逻辑:我们要让共享同一个目标列表的海龟之间建立连接。这里分两种常见场景,我分别给你代码示例和解释:
场景A:海龟属于全局定义的分组列表
假设你已经有一个全局列表group-collection,里面包含多个子列表(每个子列表是一组海龟),每个海龟有变量assigned-group标记自己所属的子列表。要让同组的海龟互相连接,代码可以这么写:
to setup-group-connections ; 遍历每个分组 foreach group-collection [ current-group -> ; 让当前分组里的所有海龟,和组内其他海龟创建连接 ask turtles with [assigned-group = current-group] [ create-links-with other turtles with [assigned-group = current-group] ] ] end
场景B:海龟持有列表变量,有共同元素则连接
如果每个海龟有一个类似shared-tags的列表变量,你想让拥有至少一个共同标签的海龟建立连接,就用这个版本:
to setup-shared-tag-connections ask turtles [ ; 找到所有和自己有标签交集的其他海龟,创建连接 create-links-with other turtles with [any? intersection shared-tags [shared-tags] of myself] ] end
这里intersection是NetLogo内置的取列表交集的命令,any?用来判断交集是否非空——只要有共同标签,就建立连接。
2. 代际网络模型的后续实现
你已经完成了亲代按财富排序并划分为10个子列表的步骤,接下来核心就是给子代分配亲代,同时满足parent变量的规则(子代who = 亲代who + N)。我给你两种常见分配逻辑的代码:
基础版:随机分配子代到亲代组
如果不需要严格的比例,只是让子代随机从某个亲代组里选亲代,代码如下:
to assign-random-parents let N 10 ; 单代海龟数量,替换成你模型里的实际值 let target-gen 1 ; 要分配亲代的子代所在代(比如g=1的子代对应g=0的亲代) ; 假设你已经有划分好的亲代分组列表parent-groups ask turtles with [g = target-gen] [ ; 随机选一个亲代分组 let chosen-group one-of parent-groups ; 从分组里随机选一个亲代 let chosen-parent one-of chosen-group ; 设置parent变量为亲代的who(自动满足子代who = 亲代who + N的规则,因为亲代属于上一代) set parent [who] of chosen-parent ; 可选:创建可视化的亲代-子代连接 create-link-to chosen-parent ] end
进阶版:按组均匀分配子代
如果需要每个亲代组分配相同数量的子代,保证分组的权重一致,用这个代码:
to assign-even-parents let N 10 let target-gen 1 let parent-groups ; 你的已划分好的亲代分组列表 ; 计算每个组要分配的子代数量(假设分组数是10,这里就是1个/组) let offspring-per-group N / length parent-groups ; 把子代按who排序,方便批量分配 let sorted-offspring sort turtles with [g = target-gen] foreach parent-groups [ current-group -> ; 从子代列表里截取对应数量的个体 let assigned-kids sublist sorted-offspring 0 offspring-per-group ; 更新剩余子代列表 set sorted-offspring sublist sorted-offspring offspring-per-group length sorted-offspring ; 给这些子代分配亲代 ask assigned-kids [ let chosen-parent one-of current-group set parent [who] of chosen-parent create-link-to chosen-parent ] ] end
额外优化:传递亲代属性(可选)
如果需要让亲代的财富影响子代,比如子代初始财富继承亲代的一部分,可以在分配后加这段代码:
ask turtles with [g = target-gen] [ ; 比如子代财富是亲代的1.1倍,可根据模型需求调整 set wealth [wealth] of turtle parent * 1.1 ]
内容的提问来源于stack exchange,提问作者Elif Cansu Akoğuz
相关产品推荐
相关产品推荐

