首页 > 解决方案 > NetLogo IF 语句颜色变化

问题描述

嗨,我正在构建我的第一个 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

标签: if-statementnetlogoagent-based-modeling

解决方案


我假设红色和蓝色代表意见。你的代码中没有关于海龟实际相遇的任何内容。但是,这应该让你接近:

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 海龟之间的唯一区别是它们的颜色,这也是他们的意见,那么你不需要使用品种。事实上,我写的代码改变了海龟的颜色,但没有改变它的组。没有严格的规则,但初学者最容易使用品种来表示完全不同的事物(例如汽车和人) - 如果您的品种都有相同的变量集,那么您可能不需要品种。

您可以继续使用颜色来表示意见。但最好将变量与可视化分开。随着您的模型变得越来越复杂,您可能会发现您想要可视化几种不同的东西,而将一种附加到颜色会使事情变得更加困难。它还使您的代码更难阅读(和调试),因为您没有一个好的变量名。

who2/在你的代码中使用它几乎总是一个坏主意。在您的情况下,您已经引入了偏见,因为您将红色与平静的精神状态联系起来。这是因为who编号是按照创建海龟的顺序分配的。所以who0 到 49 是红色,who50 到 99 是蓝色。如果你的乌龟有 50% 是平静的,那么所有的乌龟要么是平静的红色,要么是激动的蓝色。

如果你想这样做,你应该明确地这样做。如果你不这样做,你已经引入了一个错误。

为避免重复设置颜色的代码(并允许您将来轻松更改可视化),您可以有一个单独的过程来匹配意见和颜色。

这是您的代码的一个版本,它不使用品种或谁,并且随机分配意见和心理状态。

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
  ]
]

推荐阅读