我想更改一组代理的变量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
并且代码运行良好。
答案 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
] ]
简短明了。