我是Netlogo环境的新手,我正在尝试开发无线通信模型。我遇到了一个问题,我必须阻止两个节点(乌龟)之间的通信,如果我在两个节点之间留下障碍物(作为具有某种颜色的补丁或类似的东西),发送节点应该扫描障碍物并报告结束程序的事情。我在Netlogo社区中浏览了视线模型和避障模型,但它们对我没什么帮助。该节点应该扫描障碍物,而不是仅在前面一个补丁的范围内,而是扫描自身与另一个节点之间的整个距离。适合这个问题的任何想法或原语对我都有很大的帮助。我希望我已经说清楚并抱歉我的英语:)
最好的问候
答案 0 :(得分:1)
这可能不是最有效的解决方案,但假设您有以下品种:
breed [ obstacles obstacle ]
breed [ nodes node ]
您可以使用以下记者:
to-report can-see? [ target ]
let result false
hatch 1 [
face target
fd 0.1
set result ifelse-value (any? turtles-here with [ self = target ])
[ true ]
[ ifelse-value (any? obstacles-here)
[ false ]
[ can-see? target ]
]
die
]
report result
end
它通过hatch
在目标方向上的一系列临时节点来工作。如果沿途的任何节点遇到障碍物,则返回false
。如果它到达目标,则返回true
。这些临时节点是递归创建的,直到获得结果。
您可能需要调整“步长”(此示例中为fd 0.1
):更大的步长更有可能错过障碍物的角落,但速度会稍快。
您还需要确保使用tick based updates instead of continuous updates,否则会非常慢。
这是一个在可以看到彼此的节点之间创建链接的示例:
to setup
ca
ask n-of 100 patches [
sprout-obstacles 1 [
set color red
set shape "square"
]
]
ask n-of 50 patches with [ not any? obstacles-here ] [
sprout-nodes 1 [
set color yellow
set shape "circle"
let targets other nodes
create-links-with targets with [ can-see? myself ]
]
]
end
如果你想使用补丁而不是海龟作为障碍,你可以很容易地修改它。
答案 1 :(得分:0)
我在NetLogo用户列表中发布了这个问题的答案。在此处重新发布完整性:
有许多方法可行。
我首先想到的是模型库中的“相交线”示例。人们可以将障碍视为补丁上的X线。既然如此,似乎可以使用相同的技术来确定节点之间的线是否与障碍物上的任何线相交。
这似乎是找到被障碍物阻挡的所有网络视线的好方法。该方法非常快,可以通过首先找到源节点和目标节点定义的半径内的障碍来改进(测试!)。
以下是其他想法。
另一种方法是将乌龟送出去“走”直道往另一个节点,发现任何障碍物。这必须小心,以避免跳过与线相交的补丁的角落。
另一个是使用相同的方法,但没有乌龟,只需使用数学找到“下一个”补丁,并沿着这条线移动。
另一种方法是使用角度非常小的IN-CONE在节点之间获得一组窄的补丁。人们可以找到从A到B的IN-CONE和从B到A的IN-CONE的交集,以缩小该集合。然后在集合中搜索障碍物或在集合上使用MIN-ONE OF DISTANCE来找到“最近的”障碍物。
另一种方法是使用几何/数学来找到位于两个节点之间的线上的补丁集,然后寻找障碍物。