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

How to choose the agents that have different value in the set

我想更改一组代理的变量 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 是一个 reader 变量,其中包含 reader 周围的标签。

问题出在选择 with [ my-inventory-slot != [my-inventory-slot] of self ] 上,因为我已经尝试 my-inventory-slot = 5 并且代码工作正常。

已更新

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 被要求 运行 代码。但是,readers没有变量my-inventory-slot,这是属于tags品种的变量。这是你的问题,你需要找出 reader 运行 代码和你想要匹配的 my-inventory-slot 变量之间的联系。

根据聊天讨论,您真正想要的是属于 reader(即变量 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 剥离到列表中。它创建该列表的两个副本,一个按正常顺序排列,另一个按相反顺序排列。它通过查找那些在这两个列表中首次出现的位置不同的值来识别非唯一值。如果它不是唯一的,相关标签将从唯一标签代理集中删除。

我已经解决了问任何其他 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 
  ] ]

简短明了。