重组代理和托盘

Reorganize agents and pallets

我有服务器、托盘和标签品种。每个服务器都有许多分配的托盘 pallets-being-served,每个托盘都有一个 tags (tags-in-pallet) 的代理集。分配给服务器的所有标签都在 my-tags 变量中。

我有以下内容:

breed [ servers server ]
breed [ tags tag ]
breed [ pallets pallet ]

pallets-own [
  tags-in-pallet
]

servers-own [
  pallets-being-served
  my-tags
]


to reorganization
  let num-changes-in-reorg (random (num-pallets-by-side ^ 2 - 1) + 1) ; the num of changes
  repeat num-changes-in-reorg [
    let p1 nobody let p2 nobody let t1 nobody let t2 nobody
    let my-pallets n-of 2 pallets  ]
    ask one-of my-pallets [
      set p1 self 
      set p2 other my-pallets
      set t1 [tags-in-pallet] of p1
      set t2 [tags-in-pallet] of p2
    ]
    ask p1 [ set tags-in-pallet t2 ]
    ask p2 [ set tags-in-pallet t1 ]
    ask servers [
      set my-tags (turtle-set [ tags-in-pallet ] of pallets-being-served)
    ]
  ] ; repeat
end

目的是在托盘对之间进行一些 tags-in-pallet 交换,并将更改后的标签分配给相应的服务器。 上面的代码似乎可以工作,但是使用辅助变量 p1、p2、t1、t2 似乎不够优雅。此外,ask servers子句在只需要引用my-tags发生变化的服务器时涉及所有服务器。

有没有更好的方法来交换标签并将它们重新分配给相应的服务器?

此致

标签有什么限制吗?我不完全清楚你在做什么,但在我看来,做我认为你想做的事情的最简单方法就是从每个托盘中选择 n-of,从你拿走它们的托盘中取出它们,然后将它们添加到另一个托盘。如果这是一个正确的解释,你想要这样的东西(注意,未经测试,肯定是错误的):

to reorganization
  let num-changes-in-reorg (random (num-pallets-by-side ^ 2 - 1) + 1) ; the num of changes
  let p1 one-of pallets
  let p2 one-of pallets with [not member? self p1]
  let p1-to-p2 n-of num-changes-in-reorg [tags] of p1
  let p2-to-p1 n-of num-changes-in-reorg [tags] of p2
  ask p1 [set tags (turtle-set tags with [not member? self p1-to-p2] p2-to-p1]
  ask p2 [set tags (turtle-set tags with [not member? self p2-to-p1] p1-to-p2]
end

我还没有回答服务器位,因为我不清楚服务器和 pallet 是如何连接的。