NetLogo IF语句颜色更改

问题描述

您好,我正在构建我的第一个Netlogo模型,这是我想包含在代码中的一条语句

ask turtles
[ ifelse calm <= agigated 20% 
  [set opposite turtle color]
]

如果镇静剂与投票结果不同的躁动剂相遇,则镇静剂会改变观点的可能性为20%。

设置如下。有两个品种,分别称为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%的时间中,这样的随机数将为

其余的代码遍历所有平静的海龟,找到最接近的另一只海龟(min-one-of other turtles [distance myself]),然后检查它是否既被搅动又具有不同的颜色。如果是这样,问到的乌龟会以20%的概率将颜色更改为另一只乌龟的颜色。

关于您的代码,我有几点一般评论:

1 /如果第1组和第2组龟之间的唯一区别是它们的颜色,这也是它们的看法,那么您就无需使用品种。实际上,我编写的代码会更改乌龟的颜色,但不会更改其组。没有严格的规定,但是对于初学者而言,最简单的方法是使用品种来表示完全不同的事物(例如汽车和人)-如果您的品种都具有相同的变量集,那么您可能就不需要品种了。 / p>

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

2 /在代码中使用who几乎总是一个坏主意。在您的情况下,您已经引入了偏见,因为您将红色链接到了平静的心理状态。这是因为who号是在创建海龟时按顺序分配的。因此who 0到49是红色,而who 50到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
  ]
]