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

NetLogo:如何根据面片变量从相邻面片中提取坐标,netlogo,Netlogo,我有有限的编程经验(机械工程专业的学生,所以有一点matlab和labview的经验),而且我对NetLogo非常陌生,所以如果这个问题很基本或者我的代码质量很差,我提前道歉 我需要让我的海龟根据给定的概率函数移动到2个可能相邻的补丁中的1个。我需要输入到概率函数的两个补丁是嵌套气味值最低的两个相邻补丁。我已经能够提取出两个最低的巢穴气味值,但我无法计算出如何实际计算出它们是哪些补丁,以及如何将这些坐标放入ifelse语句中,以便根据前面提到的概率函数将海龟移动到其中一个。我有以下代码显然不起作

我有有限的编程经验(机械工程专业的学生,所以有一点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
移动
按邻居的<[nest scent]设置最远补丁排序
让项目0的a1x pxcor最远的补丁
让项目0的一个pycor最远的补丁
让项目1的a2x pxcor最远的补丁
让项目1的a2y pycor最远补丁
让a1项目0最远的补丁
让a2项目1最远的补丁
设x(((a1+a2)/100)-1)
让概率移动0.5*(1+((exp(x)-exp(-x))/(exp(x)+exp(-x)))
ifelse随机浮动1<概率移动
[设置为移动1]
[设置为移动0]
设a1概率(a1/(a1+a2))
ifelse随机浮点1=20
[设定满1]
[设置满0]
如果[a1x a21]=满
[设置目的地[a2x a2y]]
如果[a2x a2y]=满
[设置目的地[a1x a1y]]
如果[a2x a2y]和[a1x a1y]=满
[设置为移动0]
ifelse要移动=1
[移动到目的地]
[停止]
结束
基本上,我(试图)在这里做的是通过增加嵌套气味对最远的补丁列表进行排序,我提取了两个最低的嵌套气味值,以便将这些值输入到概率函数中(用于是否移动,以及是否移动两个补丁中的哪一个)。我不知道如何正确地提取a1和a2值取自的面片的面片坐标

谢谢你的帮助


布拉德

好吧,你让生活变得比需要的更复杂了。您可以使用
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

哇,太谢谢你了。我有一种感觉,我是在以一种糟糕的方式处理这件事。非常感谢你的帮助。