javascript - JavaScript中多向网络的路由或寻路算法

标签 javascript algorithm networking tree path-finding

我正在尝试用 JavaScript 为以下由节点组成的网络编写路由/路径查找算法。每个节点都有规则来管理它是否可以作为入口点、导出点和/或被遍历。

Routable Network

如果选择了一个有效的入口点,我需要解决以下两个问题:

  1. 网络的有效和可用导出点是什么
  2. 一旦确定并选择了有效的导出点,最佳路线是什么(需要遍历的节点)

网络规则:

  1. 您只能进入具有入口点的节点,即节点 A、B、C、D、E、F、G
  2. 您只能退出具有退出点的节点,即节点 B、C、E、、F、G
  3. 行进方向由入口节点决定 - 这决定了您可以行进和退出的方向。 。例如。经节点A进入时顺时针行进退出
  4. 一旦进入网络就不能改变方向。

我将网络表示为一个对象数组,数组中的每个对象代表网络上的一个节点。

    var network = [{
                     id: 'A',
                     canBeEntry: true,
                     ifEntryRouteIs: 'CW',
                     isExitIfRouteIs: 'N/A',
                     neighbourCW: ['B'],
                     neighbourCCW: ['H']
                    }, {
                     id: 'B',
                     canBeEntry: true,
                     ifEntryRouteIs: 'CW&CCW',
                     isExitIfRouteIs: 'CW',
                     neighbourCW: ['C'],
                     neighbourCCW: ['A']
                    },
                    .
                    .
                    .
                    {
                     id: 'H',
                     canBeEntry: false,
                     ifEntryRouteIs: 'N/A',
                     isExitIfRouteIs: 'N/A',
                     neighbourCW: ['A'],
                     neighbourCCW: ['G']
                    }];

描述有效进入/退出节点、转换和权重的图表如下:

Network Graphs

我对与寻路和路由相关的算法(例如 Dijkstra 或 A* 搜索)做了一些或研究,但它们似乎基于成本和权重,我认为这不适用于我的网络。

有没有人对如何用 JavaScript 编写算法来首先确定导出点,然后再确定路线有任何想法或方法?

我试图用 JavaScript 实现的 jsfiddle 在这里 http://jsfiddle.net/mkov/dgGHm/

最佳答案

如果我没理解错的话,你想找到给定的起始节点和方向、可能的导出和到它们的最短路径。这应该有效:(必须稍微修改原始数据):

var validExitPoints =[];
    var nodes=[];
    var tree_path=[];
    nodes.push({node:entryPoint});
    visited[entryPoint]=true;
    while(!nodes.length==0){
        var node=network_obj[nodes[0].node];

        nodes.shift();
        if(canExit(node.id,dir)){
            validExitPoints.push({node:node.id,path:''});
        }
        var neighbours=getNeighbours(node.id,dir);
        for(var i=0;i<neighbours.length;i++){
            if(visited[neighbours[i]]==false){
                nodes.push({node:neighbours[i]});
                visited[neighbours[i]]=true;
                tree_path[neighbours[i]]=node.id;
            }
        }
    }

这就是主要代码,完整代码在这里:

http://jsfiddle.net/juvian/dgGHm/6/

我为此使用了广度优先搜索,您可以在这里阅读更多相关信息:

http://en.wikipedia.org/wiki/Breadth-first_search

关于javascript - JavaScript中多向网络的路由或寻路算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23124341/

相关文章:

javascript - 如何将此片段添加到现有程序中而不使其太长?

javascript - 如何在 Angular 7 中配置 raw-loader 来加载文本文件?

algorithm - SML : Changing value of INT in a structure

Android 绑定(bind)到特权端口 22

通过网络复制符号链接(symbolic link)

javascript - 在视网膜显示屏上使用 jquery mobile 的数据图标问题

javascript - 将Leaflet map 的JSON转换为GeoJSON的更好方法是什么

具有给定集合的集合集合中最大集合交集的算法/数据结构

C 排序算法没有输出正确的值?

c - 在 C 中观察另一个 linux 进程的网络事件的方法