1

你好,我想问一些使用算法 A* 查找路径的 javascript 代码。路径将具有source nodeand target 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它,它是数组,但我无法实现指针,如果它在找到目标节点的路径时移动下一个或移动上一个。谢谢

4

2 回答 2

0

也许你不需要push position.push(_e.target);,只要让光标进入到最后,当光标没有更多目标后,你可以初始化光标回到第一个节点,不要忘记你访问的每个节点都必须设置是真实的

于 2014-02-24T02:35:43.060 回答
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
            }

谢谢

于 2014-02-27T13:42:37.487 回答