1

对 NetLogo 非常陌生...我有两个品种“疫苗”和“抗体”。每个都拥有一串符号(例如 ["A" "B" "C"])。我希望抗体在它们占据相同的空间并且至少有 2/3 的符号匹配(后者是问题)时去除疫苗。我一直在尝试使用“地图”功能,但无法使其正常工作。请帮忙!这是我尝试过的:

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
4

1 回答 1

2

在这种情况下你的使用map很棒!您组合的方式lengthremove 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记者,您需要从;中删除hamming-distance变量。vaccines-own反正你不需要它。

  • 在您的原始代码中,您要求 vacinnes 检查other antibody-here,但other由于您正在寻找不同品种的成员,因此没有必要使用 。

  • 在您的原始代码中,我认为您颠倒了string1and string2. 一般来说,你应该尽量避免调用变量something1something2(除非它在一些非常通用的代码中,比如hamming-distance我上面建议的记者)。字符串代表DNA吗?那就叫吧DNA!两个不同的品种有一个同名的变量并没有错:不要附加12如果它们代表相同的东西。

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

于 2014-08-05T02:30:13.250 回答