Netlogo按网格百分比添加修补程序



我在网络徽标中添加了4个不同的用户输入滑块。黄色、红色和绿色应代表总补丁网格的百分比,而蓝色则为0-10(非百分比(。绿色、红色和黄色的%滑块的值各不相同。当我使用以下代码设置网格时,只有蓝色补丁插入到网格中。我还希望在整个模拟过程中,每个彩色补丁的百分比都保持不变。感谢您的帮助,因为我已经尝试了好几个小时了,在谷歌上没有任何运气。

let total 961
let p-yellow yellow-patches-amount-% * 100 / total
let p-green (green-patches-amount-% * 100) / total
let p-red  (red-patches-amount-% * 100) / total
let p-blue blue-patches-amount

let patch-yellow p-yellow

ask patches with [pcolor = black] [
if count patches with [pcolor = blue] < p-blue [
ask n-of p-blue patches [set pcolor blue]
]
]

ask patches with [pcolor = black] [
if count patches with [pcolor = yellow] < p-yellow [
ask n-of p-yellow patches [set pcolor yellow]
]
]
end

您的问题是如何定义p-yellow,以及如何使用百分比。假设yellow-patches-amount-%是50。乘以100,得到5000。除以941,得到5.3个黄色斑块。然后用n-of对该数字进行四舍五入。这里使用百分比的正确方法是:

let p-yellow yellow-patches-amount-% / 100 * total

然后,在如何对补丁重新着色方面会出现一些问题。我将逐一向他们讲话。

在您的代码中,您有一个ask patches [ ask patches [...]]构造。这几乎总是一个可怕的想法,因为这意味着每个补丁都可以被要求做多次补丁,而不是一次。让一个代理人要求所有代理人做某事是可以的。让所有的代理人要求一个代理人做某事是可以的。但是,让所有代理要求所有代理执行某些操作几乎总是会导致代码无法执行您想要的操作。我简化了您用来说明这一点的代码。

to setup
ca

let total count patches ;1089 in this case
let p-yellow 5 * total / 100 ;54.45 in this case

ask patches with [pcolor = black] [
if count patches with [pcolor = yellow] < p-yellow [
ask n-of p-yellow patches [set pcolor yellow]
show count patches with [pcolor = yellow] ;first 54, next 108 or a bit lower
]
]
end

使用此设置,您将希望54个补丁变为黄色。您调用的第一个黑色补丁现在将计算所有黄色补丁,即0。正因为如此,它现在要求p黄色,向下取整,随机的补丁变成黄色。现在,第二个黑色补丁出现,并统计所有黄色补丁。它得出了54个,低于54.45,所以它再次要求54个随机补丁变黄。到目前为止,您有超过54.45个黄色补丁,因此所有后续补丁都会对其进行计数,但不再要求任何补丁更改颜色。但这仍然意味着你把一块补丁变黄了108次,而不是54次。

即使你把一块补丁变成黄色108次,你也不一定会把108个不同的补丁变成黄色。如果ask n-of p-yellow patches [set pcolor yellow]一次,则每个补丁只能变黄一次。如果你多次这样做,就会崩溃,因为现在ask n-of p-yellow patches [set pcolor yellow]也可以要求你以前变黄的补丁再次变黄。这可以通过使用ask n-of p-yellow patches with [pcolor = black] [set pcolor yellow]来避免。这一点尤其重要,因为您使用的是多种颜色。

最后,如果一个接一个地将面片变为黄色,直到得到>= p-yellow面片,则if count patches with [pcolor = yellow] < p-yellow构造是有意义的。当你同时变成一块以上的黄色时,这种结构很容易让你超过目标。

考虑到这一点,我有两个不同的建议给你

to setup-1
ca

let total count patches ;1089 in this case
let p-yellow 5 * total / 100 ;54.45 in this case
ask n-of p-yellow patches with [pcolor = black] [set pcolor yellow] ;54 in this case
end
to setup-2
ca

let total count patches ;1089 in this case
let p-yellow 5 * total / 100 ;54.45 in this case


while [count patches with [pcolor = yellow] < p-yellow] [
ask one-of patches with [pcolor = black] [set pcolor yellow]
] ;55 in this case

end

setup-1只需将所需数量的补丁一次性变为黄色即可完成。

setup-2将黑色斑块一个接一个地变为黄色,直到黄色斑块的数量超过p-黄色。注意,这将得到55个黄色补丁,而不是54个,因为p-yellow>54.如果您希望它向下取整,可以使用floor,它将值向下取整到最接近的整数:[count patches with [pcolor = yellow] < floor p-yellow]

最新更新