首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetLogo IF语句颜色变化

NetLogo IF语句颜色变化
EN

Stack Overflow用户
提问于 2020-09-26 21:37:28
回答 1查看 305关注 0票数 0

嗨,我正在构建我的第一个NetLogo模型,这是我想要在代码中包含的一个语句。

代码语言:javascript
复制
ask turtles
[ ifelse calm <= agigated 20% 
  [set opposite turtle color]
]

如果一个冷静的代理人遇到一个焦躁不安的代理人以不同的投票,有20%的机会,冷静的代理人将改变意见。

设置如下。有两个品种,称为group1和group2,他们自己的颜色是红色和蓝色。颜色代表他们的选票。每个特工要么冷静,要么激动。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-27 16:48:17

我认为红色和蓝色代表了这一观点。在你的代码中没有任何关于海龟实际会面的信息。但是,这应该会让您接近:

代码语言:javascript
复制
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%的概率,问龟将颜色改为另一只海龟的颜色。

我对您的代码有几点一般性评论:

如果group1和group2海龟唯一的区别是它们的颜色,这也是它们的观点,那么你就不需要使用品种了。事实上,我写的代码改变了海龟的颜色,但并没有改变它的群。没有严格的规则,但初学者最容易使用品种来表示完全不同的东西(如汽车和人)--如果你的品种都有相同的变量集,那么你可能不需要品种。

你可以继续用颜色来表示意见。但是,将变量从可视化中分离出来是很好的做法。当你的模型变得更加复杂,你可能会发现你有几个不同的东西,你想要想象,而有一个附加到颜色使事情变得更难。它还使您的代码更难阅读(和调试),因为您没有一个好的变量名。

[2]在代码中使用who几乎总是一个坏主意。在你的例子中,你已经引入了一种偏见,因为你把红色和平静的精神状态联系在一起。这是因为当海龟被创建时,who号是按顺序分配的。所以who 0到49是红色的,who 50到99是蓝色的。如果你有50%的海龟是平静的,那么所有的海龟要么是平静的、红色的,要么是激动的和蓝色的。

如果你想这么做,你应该显式地去做。如果你不这样做,你已经引入了一个bug。

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

这里有一个版本的代码,不使用品种或谁和谁随机分配意见和精神状态。

代码语言:javascript
复制
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

然后将您询问的代码重写为:

代码语言:javascript
复制
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
  ]
]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64082743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档