如何仅过滤 netlogo 行为中的独特场景 space

How to filter only the unique scenarios in netlogo behavior space

我想 运行 netlogo 中的一组场景使用行为 space 其中 n 只竞争的海龟使用不同的决策规则。我的意思是说我想在抛硬币的场景中测量一个指标,在这个场景中,每个玩家都被编程为在每次滴答时叫正面或反面,即在 2 只乌龟的情况下,玩家 A 总是叫正面,而玩家 B 总是叫反面.

当海龟数量超过3只时,会出现ABC或ACB或BCD叫正面,一个叫反面的情况。 HHTH 本质上与 HHHT 相同。

所以简而言之,我想做的是只过滤唯一出现的事件,而不考虑样本中 H 或 T 的位置 space 即我只想要那些只有 1H 和3T、2H 和 2T、3H 和 1T。

在此先感谢您的帮助。问候。

你问的问题似乎不涉及行为space。要计算列表中的头部,请使用 table 扩展名。 (你举的例子是二进制的,有固定长度的序列,所以头的数量决定了尾的数量,所以你只需要数其中一个即可。)

extensions [table]

to-report nHeads01 [#lst]
  let _t table:counts #lst
  report ifelse-value (table:has-key? _t "H") [
    table:get _t "H" ;case sensitive ...
  ][
    0
  ]
end

例如,我们可以生成一些长度为 4 的随机序列(来自您的示例)并过滤长度为 2 的序列(或其他任何序列)。

to-report randomHT [#n]
  report n-values #n [[?] -> one-of ["H" "T"]]
end

to test
  let _xss n-values 20 [[?] -> randomHT 4] ;20 lists to filter
  print filter [[?] -> (2 = nHeads01 ?)] _xss ;print those with 2 heads
end

如果您将序列存储为字符串,您可以在使用上述代码之前安装字符串扩展和explode字符串,或者您可以按照NetLogo read in file as list of characters将字符串转换为字符列表。例如,

to-report nHeads02 [#str]
  let _lst map [[?] -> item ? #str] n-values length #str [[?] -> ?]
  report nHeads01 _lst
end