NetLogo:删除给出汉明距离的海龟

时间:2014-08-04 18:33:08

标签: map netlogo hamming-distance

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

1 个答案:

答案 0 :(得分:2)

在这种情况下,您使用map非常棒!将lengthremove truemap组合起来计算汉明距离的方式可以很好地理解这些概念。

您的问题在于代码的结构。我认为你应该首先将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

  • 原始代码中的
  • ,我认为您已将string1string2置换。一般情况下,您应该尽量避免调用变量something1something2(除非它在某些非常通用的代码中,例如我上面建议的hamming-distance报告者)。字符串代表DNA吗?然后称它为DNA!两个不同品种的同名变量没有任何问题:如果它们代表相同的事物,请不要追加12

  • 如果您希望疫苗在2/3的符号相同时死亡,则应检查汉明距离是<= 1,而不是> 1。或者甚至更好,检查它是<= (1 / 3) * length string1