【问题标题】:graph algorithm for (economic) share graph(经济)份额图的图算法
【发布时间】:2016-01-21 02:27:13
【问题描述】:

向所有图论专家致敬 :)

我目前面临一个我自己无法解决的算法问题。

我必须在已经包含直接股份的有向图中找到每家公司彼此之间的所有间接股份(参见图片中的一个非常简单的示例)。

我必须从一个有向图开始,其中节点是公司,边是这些公司之间的直接股份。该算法现在必须将所有节点之间的间接份额附加到边上(这包括在算法期间向图中添加新边)。

间接份额定义为所有中间直接份额的乘积。如果图中只有节点 A、B 和 C,则只有一个间接份额,即从 A 到 C 的份额。

间接(A,C)= 100% * 80% = 1 * 0.8 = 0.8 = 80%

现在我需要一个算法来计算整个图表的这些份额。图中没有特定的起点,它可能包含各种大小的圆(在示例中,C 和 D 之间只有一个“直接”圆)和一对节点之间的多条路径(如路径从 C 到 E)。

如果有人可以帮助我提供一些伪代码或可能算法的描述,那将非常有帮助。我已经在图论书籍和互联网上搜索过算法,但我能找到的都是用于查找最短路径、所有路径或访问图的所有节点的标准算法。但是我找不到一种机制来计算这种图边权重的数学组合。

example share graph

【问题讨论】:

  • 我的理解是C直接拥有E的50%,通过D拥有E的25%,合计75%。
  • "算法现在必须将所有节点之间的间接份额附加到边上" 如果将间接份额添加到代表直接份额的边上,您将遇到问题。
  • 我不明白当有一个周期时会发生什么——两家公司怎么可能各自拥有另一家公司?
  • @j_random_hacker 这也是我想到的另一个问题。一种可能性是继续遍历循环。然后,您可以继续添加最终会收敛到某个数字的间接份额。示例:C 直接拥有 D 的 50%。但由于间接地,C 也有 50% * 20% * 50% 的 D,即 5%。我们可以不断重复相同的过程并添加 0.5%、0.05% 等等。为了避免无限循环,我们可以在数字不再重要时停止。
  • 我认为现在要做的事情已经很清楚了,并且是一种递归算法来生成每个公司和另一个公司之间的所有可能路径,将沿边的份额相乘并将每个不同路径的结果相加.为了提高效率,可以记住部分结果。

标签: java algorithm graph-theory economics


【解决方案1】:

让我们通过查看如果给定公司收到 1 美元会发生什么来实现所有权,并且所有收到的钱都根据股东的所有权转移给股东。然后,我们将把所有权的比例计算为当所有流通的资金都消失时收到的最终资金比例。

首先计算每家公司收到的总金额是最简单的方法,这将给我们一组线性方程,其解将告诉我们当每家公司在发送 1 美元时收到的总金额A公司一审。

假设 A 和 B 拥有彼此的 1/2。那么 a = 1 + b/2 和 b = a/2,其中 a 是 A 收到的总金额,b 是 B 收到的总金额 - 因为 A 将得到 1 美元和 1/2 B 看到了,B 将得到 A 看到的 1/2。这求解为 a = 1 + a/4 或 a = 4/3 和 b = 2/3。如果我们遵循分配的每一步,那么 A 收到 1 并将 1/2 发送给 B,B 将 1/4 发送给 A,B 将 1/8 发送给 B,B 将 1/16 发送给 A……所以 A 得到 1 + 1/4 + 1/16 + ... = 4/3。

所以 A 看到总共 4/3,B 看到总共 2/3 - 但是 A 和 B 必须传递他们收到的全部 1/2,所以 A 最终得到 2/3,B 最终得到有 1/3,这是有道理的 - 传入的 1 美元是准确计算的。

如果我们将金钱的分配作为所有权的象征,那么 A 拥有自己的 2/3,而 B 拥有另外 1/3。

【讨论】:

  • 第二种方法可以通过记忆来提高效率。您是否检查过第一种方法如何处理循环?
  • @Tarik - 感谢您的评论。我重写了我的答案,仍然使用线性方程,以澄清我所解释的内容,并包括一个非常简单的循环示例。
【解决方案2】:

找到一种算法来计算从当前节点到所有其他节点的最短路径的长度。对每个节点进行迭代。存储结果并使用它们来避免对同一路径重复相同的计算。

将上一段中的“计算路径”替换为“计算间接份额”,您就有了一个算法。

【讨论】:

  • 我认为我们不应该使用最短路径。请参阅我上面的评论。
  • 这只有在图中没有圆圈的情况下才有效
  • 我同意它不应该。我的意思是说,图论教科书中处理寻找最短路径的算法部分应该被这个问题特有的另一种启发式方法所取代。我试图悄悄地建议 OP 继续研究典型的图形问题和解决方案,并尝试将它们应用于他自己的问题。
猜你喜欢
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多