如何选择集合中具有不同值的代理程序

时间:2017-11-29 18:38:04

标签: netlogo

我想更改一组代理的变量my-inventory-slot的值,但仅限于不重复该值的情况(即,他的值在集合中是唯一的)。

breed [ tags tag ]
tags-own [ my-inventory-slot inventoried? ]
breed [ readers reader ]

我已经测试了

ask my-tags with [ my-inventory-slot != [my-inventory-slot] of self ] [
      set inventoried? true
      set color red
  ] 

其中my-tags是包含读者周围标签的读者变量。

问题在于选择with [ my-inventory-slot != [my-inventory-slot] of self ],因为我尝试my-inventory-slot = 5并且代码运行良好。

2 个答案:

答案 0 :(得分:2)

已更新

let thistag  [ my-inventory-slot ] of one-of my-tags 
ask tags with [ my-inventory-slot != thistag ] [
      set inventoried? true
      set color red
  ] 

再次更新 - 下载代码后

这是调用问题过程的代码:

to go
  ask reader 0 [
    setup-inventory-in-frame
    one-frame-inventory
  ]
end

因此要求reader运行代码。但是,读者没有变量my-inventory-slot,这是属于tags品种的变量。这是您的问题,您需要计算运行代码的阅读器与您希望匹配的my-inventory-slot变量之间的连接。

在聊天讨论中,您真正想要的是属于阅读器的标签(即变量my-tags),它具有my-inventory-slot的唯一值。我认为这段代码会这样做:

to one-frame-inventory
  let frame-time 0
  let unique-tags my-tags
  let forward-list [ my-inventory-slot ] of my-tags
  let reverse-list reverse forward-list
  let num-tags count my-tags
  ask my-tags
  [ if position my-inventory-slot forward-list + position my-inventory-slot reverse-list != num-tags - 1
    [ set unique-tags other unique-tags ]
  ]
  ask unique-tags
  [ set color red
    set inventoried? true
  ]
end

这非常难看,所以其他人的答案会很好。这样做会将相关标签的my-inventory-values剥离到列表中。它创建该列表的两个副本,一个按正常顺序,另一个相反。它通过查找具有不同位置的非唯一值来识别这两个列表中的第一个外观。如果它不唯一,则会从unique-tags代理集中删除相关标记。

答案 1 :(得分:2)

我已经解决了问任何其他my-tags的问题,如下:

let kk my-tags
  ask my-tags [ 
      if not any? other kk with [ my-inventory-slot = [my-inventory-slot] of myself ] [
      set inventoried? true
      set color red 
  ] ]

简短明了。