我在cytoscape.js中设置了图表。其中的一些节点具有数据字段“feature = true”。对于我选择的节点,我想找到具有“feature = true”的最近的连接节点。
我已经查看了不同的算法,但是如果它们接受对多个节点进行验证的选择器,它们似乎没有按照预期的方式将最短路径返回到与选择器匹配的节点。例如,如果我正在寻找最接近#start的节点,该节点在其数据字段中具有feature = true:
var closestFeatureSearch = cytoGraph.elements().aStar({
root: '#start',
goal: 'node[?feature]',
directed : false
});
似乎总是选择相同的结束节点...如果你执行了cytoGraph.filter('[?feature]'),列表中的第一项就会返回,无论我放入root的哪个节点,即使其他节点也是如此让“feature = true”更接近。
我错过了一些明显的东西吗?我已经查阅了文档,但找不到任何针对此特定问题的内容,只是特定的节点到节点用例。谢谢!
答案 0 :(得分:0)
好的,我能够添加一个案例来处理这个功能。在第390行附近取消未缩小的当前版本(2.7.8),您应该看到如下条件:
if( cMin.id() == target.id() ){
var rPath = reconstructPath( source.id(), target.id(), cameFrom, [] );
rPath.reverse();
return {
found: true,
distance: gScore[ cMin.id() ],
path: eles.spawn( rPath ),
steps: steps
};
}

我添加了一个单独的案例来处理传递过滤器,该过滤器匹配紧随其后的多个项目:
//if there was a filter passed in, check the array of ids matching that to see if cMin.id() is in there
if (is.string( options.goal ) && this.filter( options.goal ).map(function(item){return item.id()}).indexOf(cMin.id()) > -1 ) {
var rPath = reconstructPath( source.id(), cMin.id(), cameFrom, [] );
rPath.reverse();
return {
found: true,
distance: gScore[ cMin.id() ],
path: eles.spawn( rPath ),
steps: steps
};
}

关键的两个变化是if条件(显然),并且rPath将当前的cMin.id()作为目标,而不是target.id()。
无论如何,它适用于我的用例!希望它对其他人有用。
答案 1 :(得分:0)
我的理解是,当您知道要成为目的地的确切节点时,A *就是您的意思。因此,只接受一个节点作为目标。如果指定大小超过1的集合,则只能使用第一个集合。
我最近没有看过这个算法,但我的直觉是你的改变可能不适用于所有情况 - 特别是与启发式一起使用。
使用Djikstra可能更好。运行后,您可以查看它为每个[?feature]节点找到的距离 - 使用最小的节点,并获取其路径。
答案 2 :(得分:0)
var closestFeatureSearch = cytoGraph.elements().aStar({
root: '#start',
goal: 'node[?feature]',
directed : false
});