我是Netlogo环境的新手,我正在尝试开发一种无线通信模型。我遇到了一个问题,我必须阻止两个节点(海龟)之间的通信,如果我在两个节点之间保留一个障碍物(作为带有某种颜色的补丁或类似的东西),传输节点应该扫描障碍物并报告一些东西来结束该过程。我在Netlogo社区中经历了视线模型和避障模型,但它们对我帮助不大。节点应该扫描障碍物,不只是在前面一个补丁的范围内,而是在它与另一个节点之间的整个距离内。任何适合这个问题的想法或原语都会对我有很大的帮助。我希望我已经说清楚了,并对我的英语表示抱歉:)
诚挚的问候
发布于 2014-09-11 12:54:19
这可能不是最有效的解决方案,但假设您有以下几种:
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如果您想使用补丁而不是乌龟作为障碍,您可能可以相当容易地修改它。
发布于 2014-09-16 03:13:10
我在NetLogo用户列表上发布了这个问题的答案。为了完整起见,请在此处重新发布:
有许多方法可能会起作用。
在这种情况下,似乎可以使用相同的技术来确定节点之间的线是否与障碍物上的任何线相交。
这里有一些其他的想法。
另一种方法是派一只乌龟去“走”到另一个节点的笔直的路径,以发现任何障碍。这必须小心,以避免跳过与线相交的补丁的角落。
另一种是使用具有非常小角度的IN-CONE,以获得节点之间的一组狭窄的面片。可以找到从A到B的IN锥体和从B到A的IN锥体的交点,以缩小集合的范围。然后在集合中搜索障碍物或在集合上使用MIN-ONE with DISTANCE来找到“最近”的障碍物。
另一种是使用几何/数学来找到位于两个节点之间的线上的补丁集,然后查找障碍物。
https://stackoverflow.com/questions/25771488
复制相似问题