对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发布于 2014-08-05 02:30:13
在这种情况下,您使用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 (即所有的真空)而不是ask vacinne (只剩下一个假期,没有太多意义)。hamming-distance报告器,您需要从vaccines-own中删除hamming-distance变量;无论如何,您并不需要它。other antibody-here,但是使用other是不必要的,因为您正在寻找不同种类的成员。string1和string2。通常,您应该尽量避免调用变量something1和something2 (除非它在一些非常通用的代码中,比如我前面建议的hamming-distance报告程序中)。这串代表DNA吗?那就叫它DNA!如果两个不同的品种有相同的名称变量,那么没有什么问题:如果1和2代表相同的东西,就不要追加它们。<= 1,而不是> 1。或者更好的是,检查它是否是<= (1 / 3) * length string1。https://stackoverflow.com/questions/25125268
复制相似问题