我的编程经验有限(机械工程专业学生,所以有点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值取自的补丁的补丁坐标。
感谢您的帮助,
布拉德
答案 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