Netlogo 将每个数字分配给3只海龟

Netlogo 将每个数字分配给3只海龟,netlogo,Netlogo,我正在创建一个项目,在一个有1500个“学科”的世界里创建1500个“科学家”(海龟) 我需要给每只海龟分配一个“规程”,作为1-500之间的数字,并确保每个规程有3只海龟 这意味着set(random)不合适。有我可以使用的原语吗 没关系,我想我已经弄明白了。这有意义吗 to set-discipline ask turtles [ set discipline -1 ] let unassigned turtles let current 1 while

我正在创建一个项目,在一个有1500个“学科”的世界里创建1500个“科学家”(海龟)

我需要给每只海龟分配一个“规程”,作为1-500之间的数字,并确保每个规程有3只海龟

这意味着set(random)不合适。有我可以使用的原语吗

没关系,我想我已经弄明白了。这有意义吗

  to set-discipline
    ask turtles [ set discipline -1 ]
    let unassigned turtles
    let current 1
    while [any? unassigned]
    [
      ask n-of (min (list group-size (count unassigned))) unassigned
        [ set discipline current ]
      set current current + 1
      set unassigned unassigned with [discipline = -1]
    ]
  end

您的代码可以工作,但非常。。。令人不安<代码>而在NetLogo中,循环和索引通常是一种迹象,表明您没有充分利用该语言的功能。至少,我会将您的
while
替换为
foreach

ask turtles [ set discipline -1 ]
foreach n-values 500 [ 1 + ? ] [
  let unassigned turtles with [ discipline = -1 ]
  ask n-of (min (list group-size (count unassigned))) unassigned [
    set discipline ?
  ]    
]
您可以在命令中心使用以下命令检查结果:

observer> print remove-duplicates map [ count turtles with [ discipline = ? ] ] n-values 500 [ 1 + ? ]
[3]
但我建议再进一步

让学科仅仅是数字有点限制。当然,这是你在传统数学模型中会做的事情。但这是一种反弹道导弹。您可以使用NetLogo的所有功能。你可以让你的纪律。。。海龟!这将使您的模型更加灵活。你的学科最终可能是异质的:它们有自己的变量,通过这些变量,它们可以彼此不同。我想你会发现用代理替换数字会使代码更具可读性

以下是我心目中的一个完整例子:

breed [ scientists scientist ]
scientists-own [ my-discipline ]
breed [ disciplines discipline ]

to setup
  clear-all
  let nb-scientists 1500
  let nb-disciplines 500
  let group-size 3  
  create-scientists nb-scientists [
    set my-discipline nobody
  ]
  create-disciplines nb-disciplines [
    let unassigned scientists with [ my-discipline = nobody ]
    ask n-of (min (list group-size (count unassigned))) unassigned [ 
      set my-discipline myself
    ] 
  ]
end
您可以检查它是否工作:

observer> setup
observer> print remove-duplicates [ count scientists with [ my-discipline = myself ] ] of disciplines
[3]
但是你知道吗?如果是我,我会更进一步,把科学家与其学科之间的关系变成一个真正的网络标志
link
。这样,你最终可以想象一个科学家属于(喘息!)多个学科。下面是它的样子:

breed [ scientists scientist ]
breed [ disciplines discipline ]

to setup
  clear-all
  let nb-scientists 1500
  let nb-disciplines 500
  let group-size 3
  create-scientists nb-scientists
  create-disciplines nb-disciplines [
    let unassigned scientists with [ not any? my-links ]
    ask n-of (min (list group-size (count unassigned))) unassigned [ 
      create-link-with myself
    ] 
  ]
end
你不觉得这样的代码更好吗?它的工作原理是:

observer> print remove-duplicates [ count my-links ] of disciplines
[3]

尼古拉斯说的。但也要考虑这种替代方法:

to test
  let disciplines reduce sentence map [(list ? ? ?)] n-values 500 [? + 1]
  ask turtles [
    set discipline first disciplines
    set disciplines butfirst disciplines
  ]
end
ask
是按随机顺序排列的,因此我们不需要对
规程
列表进行洗牌

或者,如果海龟还不存在,你可以自由创造它们:

to test
  let disciplines reduce sentence map [(list ? ? ?)] n-values 500 [? + 1]
  foreach shuffle disciplines [
    create-turtles 1 [ set discipline ? ]
  ]
end

在这一次中,我们必须重新排列学科列表,因为海龟是按照世界卫生组织的编号顺序创建的。

不确定为什么要进行向下投票和关闭投票;约翰,你说有1500门学科,但我想你可能指的是500门。对吗?