Netlogo 找到';源海龟&x27;列表中某个项目的名称

Netlogo 找到';源海龟&x27;列表中某个项目的名称,netlogo,Netlogo,我想追踪被小偷偷走的钱包的路径。该模型应该创建一个小偷网络,每个人都有自己的包,把被盗物品放在那里(我将这些物品——钱包——设置为自己) 假设小偷1在他自己的包里有[wallet1 wallet2 wallet4],而他的邻居有[wallet1 wallet3],因为wallet1被添加到了他自己的包里 如果带包的邻居想从这两件物品中随机挑选一件返回警察局,例如,wallet1(这可以通过使用[let picked\u wallet one of turtle set my bag])来实现,我

我想追踪被小偷偷走的钱包的路径。该模型应该创建一个小偷网络,每个人都有自己的包,把被盗物品放在那里(我将这些物品——钱包——设置为自己)

假设
小偷1
在他自己的包里有
[wallet1 wallet2 wallet4]
,而他的邻居有
[wallet1 wallet3]
,因为
wallet1
被添加到了他自己的包里

如果带包的邻居想从这两件物品中随机挑选一件返回警察局,例如,
wallet1
(这可以通过使用
[let picked\u wallet one of turtle set my bag]
)来实现,我怎样才能添加一个“标签”或一些能告诉我第一个偷钱包的贼就是小偷的东西

globals [this-wallet]

breed[thieves thief]
thieves-own [my-bag wallet-id]

to setup
  clear-all

  create-thieves 5
  ask thieves [  set my-bag []  create-links-to other thieves ]
  ask one-of thieves [ set this-wallet self set my-bag fput self my-bag ask link-neighbors [set my-bag fput this-wallet my-bag print "Neighbours " show my-bag  ]]
  ask one-of thieves [ set this-wallet self set my-bag fput self my-bag ask link-neighbors [set my-bag fput this-wallet my-bag print "Neighbours " show my-bag  ]]
  ask thieves [show link-neighbors show my-bag]
   reset-ticks

end
你问

我怎样才能添加一个“标签”或一些可以告诉我第一个 偷钱包的贼是小偷吗

globals [this-wallet]

breed[thieves thief]
thieves-own [my-bag wallet-id]

to setup
  clear-all

  create-thieves 5
  ask thieves [  set my-bag []  create-links-to other thieves ]
  ask one-of thieves [ set this-wallet self set my-bag fput self my-bag ask link-neighbors [set my-bag fput this-wallet my-bag print "Neighbours " show my-bag  ]]
  ask one-of thieves [ set this-wallet self set my-bag fput self my-bag ask link-neighbors [set my-bag fput this-wallet my-bag print "Neighbours " show my-bag  ]]
  ask thieves [show link-neighbors show my-bag]
   reset-ticks

end
我不清楚什么操作与“偷钱包”相对应。是那个把钱包放在别人名单上的人偷的吗?还是被列入名单的人

在你的例子中,有两个不同的人在他们的名单上有“wallet1”,所以我也不清楚谁“拥有”了钱包。一个钱包怎么可能同时放在两个地方?事实上,它不止两个地方,当它被列入一个盗贼名单时,它就被列入每个盗贼的名单。那次行动应该代表什么?那是“偷窃”吗

你是不是想弄清楚wallet1的多个副本中,哪一个被及时放在了任何代理的名单上?当然,这有点困难,因为代理集总是以随机顺序处理的,所以您显示的代码没有给出谁首先得到它的线索

我的意思是,您拥有的数据结构在表示真实世界的操作方面似乎做得不好,如果这没有混淆当前的问题,即谁首先将钱包放在他们的列表上,我认为您正在问这个问题,那么它肯定会混淆接下来的其他问题。您显示的更新列表的操作使得不可能确定是哪个小偷先得到它

这确实使我困惑。我认为如果wallet1只有一个副本,并且一次只在一个代理的列表上,而代理的列表只有一个条目长,并且你有一个“偷钱包”程序,从一个代理的列表中删除一个钱包,并将其完全放在另一个代理的列表上,那么你的编码就会容易得多。那么事情发生的时间就很清楚了

或者这些列表应该代表一个代理对钱包存在的了解吗?或者它们代表历史上任何人拥有的所有钱包,在这种情况下,“同一”钱包可能会出现很多次,每次都代表不同的所有者,甚至同一钱包和同一所有者可能会多次被盗和被盗,甚至这对事实(钱包id和新所有者)不会是独一无二的

首先,如果每个人最终都会得到相同的列表,那么就找个地方把列表放一次,然后完成它——不要给每个人一份副本,因为一份副本就可以了。该列表甚至不需要为任何人所有——它可以只是一个全局变量。这会简化很多。然后你只有一个钱包,每次它改变主人时,你可以在主列表中输入一个条目

条目中应该包含什么?当然不是钱包本身,因为钱包是可以传递的。可能您需要一个描述刚刚发生的交易的子列表,因此您需要一个包含[钱包id、上次所有者id、当前所有者id、易手时间]的子列表,作为主全局列表中的条目

从这一点上,你至少可以在概念上重建谁拥有第一、第二、第三张名单。。或者最后,现在谁拥有它,你想要的任何东西。或者,如果您总是使用“lput”将最新事件作为列表中的最后一项,那么您甚至不需要时间戳,除非您通过对列表进行排序而丢失信息,因为第一个所有者将是列表中第一个拥有钱包id的条目。从概念上讲,问题已经解决。尽管如此,您可能希望有一天对列表进行排序,因此如果您愿意,在列表上添加时间戳将允许您稍后恢复顺序

在所有这些讨论的最后,我的建议是首先找出谁拥有wallet1: *彻底清除我在每个代理上的列表。
使用定义为全局的单个列表

  • 将钱包视为真实的,一次只能有一个钱包副本

  • 定义将钱包从一个所有者转移到另一个所有者的“偷窃钱包”、“创建钱包”和“销毁钱包”程序,并将交易记录为主列表中4个事实的子列表。主列表将是一个列表列表

  • 主列表可能被命名为“事务”,因为它记录的是事务

  • 然后,从概念上讲,你将拥有回答任何关于钱包生活史或小偷生活史的问题所需的所有信息。您不必维护相同信息的20个不同副本

  • 而且,不需要查看交易清单,就可以很容易地查看所有窃贼,并确定谁拥有钱包。(尽管如此,该信息将对应于交易列表中关于该钱包的最后一个条目。)

或者——也许我完全误解了这些列表所代表的含义


把球(或钱包)传给你。

关于你对我上一个答案的评论,这里有一个新的答案

嗯,病毒问题不同于钱包问题,需要不同的数据结构

仍然