我的图表包含两种类型的节点:公司和人员。
公司节点有一个代表股东的边缘列表。股东拥有一定比例的股份,是公司或个人。 Person节点始终是叶子。
以下是一个例子:
CompanyA has 50% of CompanyB's shares
UserA has 50% of CompanyA's shares
UserB has 50% of CompanyB's shares
CompanyB has 50% of CompanyA's shares
箭头可以反转,具体取决于它们是代表股票还是所有者
实际上谁拥有CompanyA以及百分比。在这个例子中,我们应该得到UserA拥有CompanyA的66.66%而UserB拥有CompanyB的33.33%。
这可以使用转换矩阵计算,并将其自身乘以多次like this。
可悲的是,这是一个估计,需要相当多的迭代来获得非常精确的迭代。我怀疑有办法得到一个确切的答案。我看过特征值,但我认为我的数学失败了。就矩阵而言,我认为我正在寻找转移矩阵(或马尔可夫链)的稳定分布。
也许我过于复杂了?我觉得应该有一种方法来获得这个结果而不用解析矩阵和递归算法。特别是考虑到图表包含大量的叶子,我只对单个公司的股东感兴趣(图表的“根”)。
我将用Java实现最终解决方案。可以使用第三方库。
谢谢!
答案 0 :(得分:1)
我认为矩阵的标签或多或少是这样的
cA cB uA uB
cA 0 0.5 0.5 0
cB 0.5 0 0 0.5
uA 0 0 1 0
uB 0 0 0 1
其中cA / B表示公司A / B,而uA / B表示用户A / B.
我们将此矩阵表示为A
。然后表达式(1, 0, 0, 0).A
为我们提供了即时的资源分配"在"投资" 1"单位"在这种情况下,结果确实是(0, 0.5, 0.5, 0)
,即公司B得到50%而用户A得到50%。然而,归属于公司B"的资源传播"进一步,所以为了找到平衡"分配,我们需要计算
(1, 0, 0, 0).A^n
在n
无限的范围内。就左特征向量而言,原始矩阵A
可以被重写(假设它是可对角化的)为A=Inverse[P].w.P
,其中w
是包含特征值的对角矩阵。那个人有
A^n = (Inverse[P].w.P)^n = Inverse[P].w^n.P
在这种特殊情况下,特征值为1, 1, 0.5, -0.5
,因此当n
变为无穷大时,只有特征值1
存活(s)。因此w^n
的限制为DiagonalMatrix[{1,1,0,0}]
。因此,最终结果可以写成
Inverse[P].DiagonalMatrix[{1,1,0,0}].P
产生
0. 0. 0.666667 0.333333
0. 0. 0.333333 0.666667
0. 0. 1. 0.
0. 0. 0. 1.
最后,对应于特征值1的特征向量是(0, 0, 1, 0)
和(0, 0, 0, 1)
。这意味着如果一个人投资" 1个单位的资源进入用户A / B,相应的用户"保留所有内容"并且没有任何进一步传播,即已经达到平衡。然后特征值是双重退化,因为有两个用户(叶子)。