Netlogo 将每个数字分配给3只海龟
我正在创建一个项目,在一个有1500个“学科”的世界里创建1500个“科学家”(海龟) 我需要给每只海龟分配一个“规程”,作为1-500之间的数字,并确保每个规程有3只海龟 这意味着set(random)不合适。有我可以使用的原语吗 没关系,我想我已经弄明白了。这有意义吗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
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门。对吗?