问题描述
您好,我正在构建我的第一个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
]
]