NetLogo:如何根据补丁变量从相邻补丁中提取坐标

时间:2016-02-07 08:27:38

标签: netlogo

我的编程经验有限(机械工程专业学生,所以有点matlab和labview经验),对NetLogo来说还很新,所以如果这个问题非常基本或我的代码质量很差,我会提前道歉。

我需要根据给定的概率函数将我的海龟移动到2个可能的相邻补丁中的1个。我需要输入到概率函数的两个补丁是具有最低嵌套 - 气味值的两个相邻补丁。我已经能够提取两个最低的嵌套 - 气味值,但我无法弄清楚如何实际找出那些补丁,以及如何将这些坐标放入ifelse语句中以将乌龟移动到其中一个基于一个概率函数。我有以下代码显然不起作用:

    to move
  set farthest-patch sort-by < [nest-scent] of neighbors
  let a1x pxcor of item 0 farthest-patch
  let a1y pycor of item 0 farthest-patch
  let a2x pxcor of item 1 farthest-patch
  let a2y pycor of item 1 farthest-patch
  let a1 item 0 farthest-patch
  let a2 item 1 farthest-patch
  let x (((a1 + a2) / 100 ) - 1)
  let probability-move 0.5 * (1 + ((exp(x) - exp( - x)) / (exp(x) + exp( - x))))
  ifelse random-float 1 < probability-move
  [set to-move 1]
  [set to-move 0]
  let a1-probability (a1 / (a1 + a2))
  ifelse random-float 1 < a1-probability
    [set destination [a1x a1y]]
    [set destination [a2x a2y]]
    ifelse count turtles-here >= 20
    [set full 1]
    [set full 0]
  if [a1x a21] = full
  [set destination [a2x a2y]]
  if [a2x a2y] = full
  [set destination [a1x a1y]]
  if [a2x a2y] and [a1x a1y] = full
  [set to-move 0]
  ifelse to-move = 1
  [move-to destination]
  [stop]
end

基本上,我(尝试)在这里做的是通过增加嵌套气味来排序最远的补丁列表,并且我已经拉出了两个最低的嵌套 - 气味值,以便将这些值输入到我的概率函数中(两者都是是否要移动,以及是否要移动两个补丁中的哪一个进行选择)。我不确定如何正确拉出a1和a2值取自的补丁的补丁坐标。

感谢您的帮助,

布拉德

1 个答案:

答案 0 :(得分:1)

好吧,你让生活变得比它需要的更复杂。您可以使用min-n-of选择具有最小变量值的两个补丁(或海龟)。在字典中查找以获取详细信息。

找到两个候选人之后,最好的选择是使用rnd扩展名来选择目的地,因为它有一个按重量随机选择的原语。最后,由于您使用变量的函数作为权重(而不是变量值本身),因此您需要一种方法来构造该权重。最好的选择是把它分开 - 你也可以有一个带有权重值的第二个变量,但这只会增加变量。

这是一个完整的工作模型。请将整个事件复制到NetLogo的新实例中并尝试理解它是如何工作的,而不是仅仅将相关位复制到代码中,因为min-n-of,使用代理集并将变量传递给过程是NetLogo的重要方面。需要了解。我也设置了着色等,这样你就可以看到它的选择。

extensions [rnd]

patches-own [ nest-scent ]

to setup
  clear-all
  create-turtles 1 [ set color red ]
  ask patches
  [ set nest-scent random 100
    set plabel nest-scent
  ]
  reset-ticks
end

to go
  ask one-of turtles [ move ]
  tick
end

to move
  set pcolor blue
  let targets min-n-of 2 neighbors [ nest-scent ]
  let destination rnd:weighted-one-of targets [ calc-weight nest-scent ]
  move-to destination
end

to-report calc-weight [ XX ]
  let weight 0.5 * (1 + ((exp(XX) - exp( - XX)) / (exp(XX) + exp( - XX))))
  report weight
end