【问题标题】:how to calculate the network diameter如何计算网络直径
【发布时间】:2009-05-10 01:40:56
【问题描述】:

我将数据存储在关系数据库 mysql 和 PHP 中。 我有一个名为“rel”的表,它有两个字段:

from_node  |  to_node
=====================
1               2
1               3
2               3

等等……

如何计算网络的网络直径。我知道这是任何两对之间最长或最短的路径,但我该如何计算呢? 是否有任何 PHP 脚本或函数可以帮助我做到这一点?

【问题讨论】:

  • 你是指周长吗?网络什么时候有了形状?
  • “直径”到底是什么意思
  • 这是一个网络分析/图论相关的问题。他的意思是en.wikipedia.org/wiki/Graph_diameter
  • 我猜“查找直径”的意思是“对于所有节点对,将“路由”定义为“该对之间的最小跳数”,然后将“直径”定义为“这些路线中最大的””:即直径定义为每对节点之间的最小距离的最大值。

标签: php mysql algorithm networking


【解决方案1】:

假设您有一个连通图(否则最大距离是无限的)并且您的所有节点点都是数字......

使用 (from_node, to_node, 1) 为表 (from, to, distance) 播种。对于每个元组,必须保证from_node的值永远小于to_node的值

CREATE TABLE hops (
    from_node int not null,
    to_node int not null,
    distance int not null default 0,
    primary key (from_node, to_node, distance)
)

-- first load:
INSERT INTO hops (from_node, to_node)
SELECT from_node, to_node FROM rel;

-- iterative step
INSERT INTO hops (from_node, to_node, distance)
SELECT a.from_node, b.to_node, min(a.distance+b.distance)
FROM hops a, hops b
WHERE a.to_node = b.from_node
  AND a.from_node <> b.from_node  -- not self
  AND a.to_node <> b.to_node      -- still not self
  AND a.from_node <> b.from_node  -- no loops
  AND NOT EXISTS (                -- avoid duplicates
          SELECT * FROM hops c
          WHERE c.from_node = a.from_node
            AND c.to_node = b.to_node
            AND c.distance = a.distance+b.distance)
GROUP BY a.from_node, b.to_node

重复执行插入,直到没有插入任何行。然后选择最大距离以获得您的直径。

编辑:对于具有加权顶点的图,您只需使用权重而不是使用 1 为距离场播种。

【讨论】:

    【解决方案2】:

    请参阅与距离和直径相关的图表(网络)术语上的Wikipedia article。它提到了一些关于如何找到直径的注释。 This section 关于图的连通分量的文章还建议了一种算法来发现这些连通分量,可以很容易地调整它来告诉您图的直径。 (如果有多个组件,那么我相信直径是无限的。)该算法是一种基于面包/深度优先搜索的简单算法,因此实现起来应该不会很麻烦,效率也不应该是也是个大问题。

    如果您不适合写这篇文章(尽管我认为不会花费太多精力),我建议您寻找一个好的网络/图形分析库。那里有一些,但我不确定您想使用 PHP 看看哪些。 (您可能必须使用某种互操作。)

    希望对你有所帮助。

    【讨论】:

      【解决方案3】:

      我真的认为你的意思是你想找到一个网络的cluster coefficient。此外,您想在 PHP 中执行此操作。不知道有多少好的网络分析库被移植到PHP扩展中了。

      但是,如果您按照文章进行操作,那么想出自己的文章应该不会(太)困难。你不需要制作漂亮的图表,你只需要找到系数。

      如果这不是您的意思,请更新/澄清您的问题。

      【讨论】:

        【解决方案4】:

        网络是一个连通图。那么为什么不尝试从数据中构建一些图形表示并在此基础上执行 BFS 或 DFS?你会得到你正在寻找的。​​p>

        【讨论】:

          【解决方案5】:

          这很简单:

          • 准备
            • 添加一个名为distance的列
            • 给所有节点-1的距离
          • 第一次迭代
            • 选择任意节点(例如第一个)
            • 给它1的距离
            • 现在迭代直到有距离为-1的节点
              • UPDATE table SET distance=:i+1 WHERE from_node IN (SELECT to_node FROM table WHERE distance=:i)
          • 第二次迭代
            • 选择一个距离最大的节点(任意)——记住它
            • 将所有距离设置回-1
            • 将您的记忆节点设置为1
            • 再次调用迭代

          这次最大距离是你的图/网络的直径。

          【讨论】:

            【解决方案6】:

            在您的示例中,您显示每个节点都链接到其他每个节点。如果在整个设置过程中都是这种情况,则直径为 1。

            如果你的设置是像这样的线形:

            n=1, n = 2, n = 3, ... n
            

            那么你的直径是 (n+1)/3。

            如果你的设置比较不规则,有一系列N个节点和K个链接,那么你的直径至少logN/LogK

            编辑:为了澄清,我正在计算节点对之间的平均最短距离。

            n1 - n2 - n3
            (n+1)/3 = 4/3
            
            n1-n2 = 1 hop
            n2 - n3 = 1 hop
            n1- n2 - n3 = 2 hops
            (1+1+2)/3 = 4/3
            

            【讨论】:

            • 这是真的,尽管我怀疑他的例子可能过于简化了情况。
            • 在线性阵型中,直径不是(n-1)吗?它是任何两个节点之间最长的路径,因此线性设置肯定是直径 (n-1),因为从第一个节点到最后一个节点有很多跳。我认为,一个简单的循环(节点 n 连接到节点 1)的直径为 (n-1)/2。另外,一般来说,应该给出节点之间的路径长度;在没有任何更好的信息的情况下,我们都假设每一跳的长度为 1。
            • 我的基础是节点对之间的平均最短距离。这就是我发现的所有来源似乎都同意的定义。
            • 哦-维基百科说:“顶点 v 的偏心率 ε 是 v 与任何其他顶点之间的最大距离。图的直径是图中任何顶点的最大偏心率。即,它是任意两个顶点之间的最大距离。”
            猜你喜欢
            • 2022-01-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多