使用算法A *查找路径

时间:2014-02-24 01:03:35

标签: javascript algorithm a-star gephi

你好,我想问一些使用算法A *查找路径的javascript代码。路径将包含source nodetarget node,这里是示例代码

do{
    var cursor = nodes.node1 //this is source node
    for (var i in GexfJS.graph.edgeList) { // search all edgeList on graph
        var _e = GexfJS.graph.edgeList[i] //each list has variable _e
        var position = []; // where i put the pointer
        if ( _e.source == cursor ) { //when some edge source is match from the cursor(source node/initial node)
            var _n = GexfJS.graph.nodeList[_e.target]; // edge target from the node which match with the cursor
            _str += 'Found '; // just give string if it's works
            position.push(_e.target); // for pointer?
            cursor = _e.target // go to the next node, but how can i move to previos node?
            }
    }
} while(cursor!=nodes.node2); //until find the target node

问题是即时使用position.push并且它是数组但我无法实现指针,如果它已经移动了下一步,或者在找到目标节点的路径时移动到前一步。感谢

2 个答案:

答案 0 :(得分:0)

也许你不需要push position.push(_e.target);,只需将光标放到最后,光标没有更多目标后,你可以将光标初始化回第一个节点而不要忘记您访问的每个节点都必须设置为true

答案 1 :(得分:0)

我得到了答案,将光标从第一个节点初始化到目标节点,并且不要忘记如果节点已经访问过,则必须将您访问的每个节点设置为true,然后再返回尝试查找来自节点的第一个边,如果节点没有,则转到下一个节点,如果节点有真正找到其他节点。这是我的示例代码

pathed={};
            ketemu=false;
            cursor1="";
            if(path==true){
            while(ketemu!=true){
                var cursor = nodes.node1;
                var lala = new Array();
                var visit = new Array();
                var j = 0;
                for (var i in GexfJS.graph.edgeList) { // relasi yang dituju 
                    var _e = GexfJS.graph.edgeList[i];
                    if ( _e.source == cursor ) {
                        var _n = GexfJS.graph.nodeList[_e.target];
                        if(pathed[_n.label] != true){
                            if(_e.target==nodes.node2){

                            cursor = _e.target;
                            cursor1 = _e.target;
                            lala[j] = cursor;
                            visit[j] = cursor;
                            j++;

                            ketemu=true;
                            break;
                            }

                             if(_e.target !=nodes.node2){

                                cursor = _e.target;
                                lala[j] = cursor;
                                visit[j] = cursor;
                                j++;
                            }


                            //alert(cursor);
                            //alert(lala[j]);

                        }

                    }
                    //else if(cursor1==_e.target){
                    //cursor = nodes.node1;
                    //alert(cursor);
                    //}


                }
                if(ketemu!=true){
                i=0;
                for(var j=lala.length-1;j>=0;j--){
                var test = lala.length-1;
                var ujung = lala[test];
                var koyong = nodes.node1;

                i++;

                }

                ujung = GexfJS.graph.nodeList[ujung];
                pathed[ujung.label] = true;
                cursor = koyong;

                }

            }

                for(var k=0;k<visit.length;k++){
                var visitednya = visit[k];
                var _n = GexfJS.graph.nodeList[visitednya];
                _str += '<li><div class="smallpill" style="background: ' + _n.color.base +'"></div><a href="#" onmouseover="GexfJS.params.activeNode = ' + _e.source + '" onclick="displayNode(' + _e.source + ', true); return false;">' + _n.label + '</a>' + ( GexfJS.params.showEdgeWeight && _e.weight ? ' [' + _e.weight + ']' : '') + '</li>';
                }
                visit=[];



            //end
            }

感谢