NetLogo IF 语句颜色变化
NetLogo IF statement color change
嗨,我正在构建我的第一个 NetLogo 模型,这是我想在我的代码中包含的声明
ask turtles
[ ifelse calm <= agigated 20%
[set opposite turtle color]
]
如果一个冷静的代理人遇到一个情绪激动的代理人,并且投票不同,那么冷静的代理人有 20% 的机会改变意见。
设置如下。有 2 个品种,分别称为 group1 和 group2,它们的颜色分别为红色和蓝色。颜色代表他们的投票。每个特工或平静或激动。
globals [ color-changed calm agitated ]
breed [groups1 group1]
breed [groups2 group2]
turtles-own [ mental-state ]
to setup
clear-all
ask patches [ set pcolor black ]
set-default-shape turtles "person"
create-groups1 50
[ setxy random-xcor random-ycor
set color red
]
create-groups2 50
[ setxy random-xcor random-ycor
set color blue
]
ask turtles
[ ifelse who <= share-of-calm-people
[ set mental-state "calm" ]
[ set mental-state "agitated" ]
]
end
我假设红色和蓝色代表意见。您的代码中没有任何关于海龟实际相遇的信息。然而,这应该会让你接近:
ask turtles with [mental-state = "calm"]
[ let meeter min-one-of other turtles [distance myself]
if ([mental-state] of meeter = "agitated") and ([color] of meeter != color) and random-float 1 < 0.2
[ set color [color] of meeter
]
]
请注意,这未经测试。代码 if random-float 1 < 0.2 []
是关于以给定概率使某事发生的特定问题的答案。它从 0 到 1 的区间均匀地抽取一个随机数,然后将其与你想要的概率值进行比较。所以 20% 的时间,这样的随机数将 <0.2 例如。
其余代码遍历所有平静的海龟,找到最近的另一只海龟(min-one-of other turtles [distance myself]
),然后检查它是否既激动又具有不同的颜色。如果是这样,提出请求的乌龟有 20% 的概率将颜色更改为另一只乌龟的颜色。
我对您的代码有几个一般性的评论:
1/ 如果 group1 和 group2 海龟之间的唯一区别是它们的颜色,这也是他们的意见,那么您不需要使用品种。事实上,我写的代码改变了海龟的颜色,但没有改变它的组。没有硬性规定,但初学者最容易使用品种来表示完全不同的事物(例如汽车和人)——如果您的品种都具有相同的变量集,那么您可能不需要品种。
您可以继续使用颜色来表示意见。但将变量与可视化分开是一种很好的做法。随着您的模型变得越来越复杂,您可能会发现您有几个不同的东西想要可视化,而将其中一个附加到颜色会使事情变得更难。它还会使您的代码更难阅读(和调试),因为您没有好的变量名。
2/ 在代码中使用 who
几乎总是一个坏主意。在您的情况下,您已经引入了偏见,因为您将红色与平静的精神状态联系起来。这是因为 who
编号是在创建海龟时按顺序分配的。所以 who
0 到 49 是红色,who
50 到 99 是蓝色。如果你有 50% 的海龟是平静的,那么所有的海龟要么是平静的、红色的,要么是激动的、蓝色的。
如果你想那样做,你应该明确地做。如果你不这样做,你已经引入了一个错误。
为避免重复设置颜色的代码(并允许您将来轻松更改可视化效果),您可以有一个单独的过程来匹配意见和颜色。
这是您的代码的一个版本,它不使用 breeds 或 who,而是随机分配意见和心理状态。
turtles-own
[ mental-state
opinion
]
to setup
clear-all
ask patches [ set pcolor black ]
set-default-shape turtles "person"
create turtles 100
[ setxy random-xcor random-ycor
; set and visualise opinion
set opinion one-of ["yes" "no"]
colour-opinion
; set mental state with given proportion as calm
ifelse random-float 1 < share-of-calm-people ; assumes slider is 0 to 1
[ set mental-state "calm" ]
[ set mental-state "agitated" ]
]
end
to colour-opinion ; turtle procedure
ifelse opinion = "yes"
[ set color red ]
[ set color blue ]
end
那么你问的代码改写为:
ask turtles with [mental-state = "calm"]
[ let meeter min-one-of other turtles [distance myself]
if ([mental-state] of meeter = "agitated") and ([opinon] of meeter != opinion) and random-float 1 < 0.2
[ set opinion [opinion] of meeter
colour-opinion
]
]
嗨,我正在构建我的第一个 NetLogo 模型,这是我想在我的代码中包含的声明
ask turtles
[ ifelse calm <= agigated 20%
[set opposite turtle color]
]
如果一个冷静的代理人遇到一个情绪激动的代理人,并且投票不同,那么冷静的代理人有 20% 的机会改变意见。
设置如下。有 2 个品种,分别称为 group1 和 group2,它们的颜色分别为红色和蓝色。颜色代表他们的投票。每个特工或平静或激动。
globals [ color-changed calm agitated ]
breed [groups1 group1]
breed [groups2 group2]
turtles-own [ mental-state ]
to setup
clear-all
ask patches [ set pcolor black ]
set-default-shape turtles "person"
create-groups1 50
[ setxy random-xcor random-ycor
set color red
]
create-groups2 50
[ setxy random-xcor random-ycor
set color blue
]
ask turtles
[ ifelse who <= share-of-calm-people
[ set mental-state "calm" ]
[ set mental-state "agitated" ]
]
end
我假设红色和蓝色代表意见。您的代码中没有任何关于海龟实际相遇的信息。然而,这应该会让你接近:
ask turtles with [mental-state = "calm"]
[ let meeter min-one-of other turtles [distance myself]
if ([mental-state] of meeter = "agitated") and ([color] of meeter != color) and random-float 1 < 0.2
[ set color [color] of meeter
]
]
请注意,这未经测试。代码 if random-float 1 < 0.2 []
是关于以给定概率使某事发生的特定问题的答案。它从 0 到 1 的区间均匀地抽取一个随机数,然后将其与你想要的概率值进行比较。所以 20% 的时间,这样的随机数将 <0.2 例如。
其余代码遍历所有平静的海龟,找到最近的另一只海龟(min-one-of other turtles [distance myself]
),然后检查它是否既激动又具有不同的颜色。如果是这样,提出请求的乌龟有 20% 的概率将颜色更改为另一只乌龟的颜色。
我对您的代码有几个一般性的评论:
1/ 如果 group1 和 group2 海龟之间的唯一区别是它们的颜色,这也是他们的意见,那么您不需要使用品种。事实上,我写的代码改变了海龟的颜色,但没有改变它的组。没有硬性规定,但初学者最容易使用品种来表示完全不同的事物(例如汽车和人)——如果您的品种都具有相同的变量集,那么您可能不需要品种。
您可以继续使用颜色来表示意见。但将变量与可视化分开是一种很好的做法。随着您的模型变得越来越复杂,您可能会发现您有几个不同的东西想要可视化,而将其中一个附加到颜色会使事情变得更难。它还会使您的代码更难阅读(和调试),因为您没有好的变量名。
2/ 在代码中使用 who
几乎总是一个坏主意。在您的情况下,您已经引入了偏见,因为您将红色与平静的精神状态联系起来。这是因为 who
编号是在创建海龟时按顺序分配的。所以 who
0 到 49 是红色,who
50 到 99 是蓝色。如果你有 50% 的海龟是平静的,那么所有的海龟要么是平静的、红色的,要么是激动的、蓝色的。
如果你想那样做,你应该明确地做。如果你不这样做,你已经引入了一个错误。
为避免重复设置颜色的代码(并允许您将来轻松更改可视化效果),您可以有一个单独的过程来匹配意见和颜色。
这是您的代码的一个版本,它不使用 breeds 或 who,而是随机分配意见和心理状态。
turtles-own
[ mental-state
opinion
]
to setup
clear-all
ask patches [ set pcolor black ]
set-default-shape turtles "person"
create turtles 100
[ setxy random-xcor random-ycor
; set and visualise opinion
set opinion one-of ["yes" "no"]
colour-opinion
; set mental state with given proportion as calm
ifelse random-float 1 < share-of-calm-people ; assumes slider is 0 to 1
[ set mental-state "calm" ]
[ set mental-state "agitated" ]
]
end
to colour-opinion ; turtle procedure
ifelse opinion = "yes"
[ set color red ]
[ set color blue ]
end
那么你问的代码改写为:
ask turtles with [mental-state = "calm"]
[ let meeter min-one-of other turtles [distance myself]
if ([mental-state] of meeter = "agitated") and ([opinon] of meeter != opinion) and random-float 1 < 0.2
[ set opinion [opinion] of meeter
colour-opinion
]
]