NetLogo很新... 我有两个品种“疫苗”和“抗体”。每个都拥有一串符号(例如[“A”“B”“C”])。我希望抗体在它们占据相同空间时移除疫苗并且如果至少2/3个符号匹配(后者是问题)。我一直在尝试使用'map'功能但无法使其工作。请帮忙!这是我尝试过的:
breed [vaccine vaccines]
breed [antibody antibodies]
vaccine-own [
string2
hamming-distance
]
antibody-own [
string1
]
to setup
clear-all
create-antibody 10 [ setxy random-xcor random-ycor
set string1 n-values 3 [one-of["A" "B" "C"]]]
create-vaccine 2 [ setxy random-xcor random-ycor set color red
set string2 n-values 3 [one-of["A" "B" "C"]] ]
reset-ticks
end
to go
move-antibody
remove-antigen
tick
end
to move-antibody
ask antibody [
right random 360
forward 1
]
end
to remove-antigen
ask vaccine [
if any? other antibody-here [
set hamming-distance (length remove true (map [?1 = ?2] string2 [string1] of myself))
]
if any? other antibody-here with [hamming-distance > 1] [die]
]
end
答案 0 :(得分:2)
在这种情况下,您使用map
非常棒!将length
,remove true
和map
组合起来计算汉明距离的方式可以很好地理解这些概念。
您的问题在于代码的结构。我认为你应该首先将hamming-distance
定义为一个单独的记者,这将使其余的代码更容易编写:
to-report hamming-distance [ list1 list2 ]
report length remove true (map [?1 = ?2] list1 list2)
end
如果您在命令中心进行测试,您会发现它有效:
observer> show hamming-distance ["A" "B" "C"] ["A" "B" "B"]
observer: 1
observer> show hamming-distance ["A" "B" "C"] ["C" "C" "C"]
observer: 2
一旦你有了这个,就可以很容易地正确地写出remove-antigen
:
to remove-antigen
ask vaccines [
if any? antibodies-here with [
hamming-distance string1 [ string2 ] of myself <= 1
] [ die ]
]
end
一些注意事项:
您在breed
定义中将复数和单数反转。复数总是第一位的。这样,你ask vaccines
(即所有的vacinnes)而不是ask vacinne
(这只是一个vacinne而且没有多大意义)。
为了能够定义hamming-distance
报告者,您需要从hamming-distance
移除vaccines-own
变量;你还是不需要它。
在原始代码中,您要求vacinnes检查other antibody-here
,但由于您正在寻找不同品种的成员,因此无需使用other
。
,我认为您已将string1
和string2
置换。一般情况下,您应该尽量避免调用变量something1
和something2
(除非它在某些非常通用的代码中,例如我上面建议的hamming-distance
报告者)。字符串代表DNA吗?然后称它为DNA
!两个不同品种的同名变量没有任何问题:如果它们代表相同的事物,请不要追加1
和2
。
如果您希望疫苗在2/3的符号相同时死亡,则应检查汉明距离是<= 1
,而不是> 1
。或者甚至更好,检查它是<= (1 / 3) * length string1
。