【发布时间】:2013-11-28 10:40:53
【问题描述】:
我有一个节点的无线网状网络,每个节点都能够报告其与其邻居的“距离”,以(简化的)信号强度来衡量。节点在地理上位于 3d 空间中,但由于无线电干扰,节点之间的距离不需要三角(三角?)一致。即,给定节点 A、B 和 C,A 和 B 之间的距离可能是 10,A 和 C 之间的距离也可能是 10,而 B 和 C 之间的距离可能是 100。
我想做的是根据节点的连接性来可视化逻辑网络布局,即在视觉中包含节点之间的逻辑距离。
到目前为止,我的研究表明,多维缩放 (MDS) 正是为这类事情而设计的。鉴于我的数据可以直接表示为二维距离矩阵,它甚至是更一般的 MDS 的更简单形式。
现在,似乎有很多 MDS 算法,参见例如http://homepage.tudelft.nl/19j49/Matlab_Toolbox_for_Dimensionality_Reduction.html 和 http://tapkee.lisitsyn.me/ 。我需要在 C++ 中执行此操作,我希望我可以使用现成的组件,即不必从论文中重新实现算法。所以,我认为:https://sites.google.com/site/simpmatrix/ 将是门票。它有效,但是:
布局不稳定,即每次重新运行算法时,节点的位置都会发生变化(见下图 1 和 2 之间的差异 - 这是因为已经运行了两次,没有任何进一步的变化)。这是由于传递给该算法的初始化矩阵(其中包含每个节点的初始位置,然后算法会迭代校正) - 我传递一个空的,然后实现派生一个随机的。一般来说,布局确实接近我对给定输入数据所期望的布局。此外,在不同的运行之间,节点的方向(顺时针或逆时针)可以改变。见下图 3。
我认为很明显的“解决方案”是传递一个稳定的默认初始化矩阵。但是当我最初将所有节点放在同一个地方时,它们根本没有移动;当我将它们放在一个轴上时(节点 0 位于 0,0 ;节点 1 位于 1,0 ;节点 2 位于 2,0 等),它们仅沿该轴移动。 (见下图 4)。不过它们之间的相对距离还可以。
所以看起来这个算法只改变节点之间的距离,但不改变它们的位置。
感谢您阅读本文 - 我的问题是(我很乐意回答其中的一个或几个问题,因为每个问题都可能让我知道继续前进的方向):
- 我在哪里可以找到有关众多 MDS 算法的属性的更多信息?
- 是否有一种算法可以导出网络中每个节点的完整位置,而无需传递每个节点的初始位置?
- 是否有可靠的方法来估计每个点的位置,以便算法可以正确缩放它们之间的距离?我没有这些节点的地理位置,这是本练习的重点。
- 是否有任何算法可以在两次运行之间保持网络派生的“角度”不变?
如果一切都失败了,我的下一个选择是使用我上面提到的算法,增加迭代次数以将运行之间的可变性保持在几个像素左右(我必须试验多少次迭代这将采取),然后围绕节点 0“旋转”每个节点,例如,将节点 0 和 1 在水平线上从左到右对齐;这样,在 MDS 算法确定点的相对距离后,我会“纠正”点的位置。我还必须纠正每个节点周围连接节点的顺序(顺时针或逆时针)。这可能很快就会变得多毛。
显然我更喜欢稳定的算法解决方案 - 增加迭代以消除随机性并不是很可靠。
谢谢。
编辑:我被推荐到 cs.stackexchange.com 并在那里制作了一些 cmets;有关算法建议,请参阅https://cs.stackexchange.com/questions/18439/stable-multi-dimensional-scaling-algorithm。
图 1 - 带有随机初始化矩阵:
图像 2 - 使用相同的输入数据运行后,与 1 相比旋转:
图 3 - 与前 2 相同,但节点 1-3 在另一个方向:
图 4 - 节点的初始布局在一条线上,它们在 y 轴上的位置没有改变:
【问题讨论】:
-
在进一步开发我的测试数据集之后,我发现我还有一个需求。我没有所有节点之间的距离 - 网络一侧的节点可能与另一侧的节点遥不可及。我需要一种能够指定这一点的方法,而不必指定彼此无法到达的那些之间的较大距离,因为这样它们之间的距离在结果图中将是相同的。最好是我希望无法触及的节点彼此远离,但如果我不绘制它们之间的连接,视觉效果可能也会很清晰。
-
您可以添加一个假距离来分隔未连接的组(您可能知道这一点,但您想要的是图中的“简单连接的组件”),但不幸的是每个组都可以单独反映和旋转.我删除了我的答案,因为它只是重复了您已有的想法。
-
谢谢,我不知道这个词,我会朝那个方向调查。回复:另一个答案,好清楚 - 我只是在检查我是否遗漏了一个细节。我能找到的关于这个主题的信息比我的大部分正常工作要密集得多,我需要经常检查两次和三次 :) 再次感谢您参与这个小众问题 - 我什至找不到任何标签它真的属于。
-
没问题。这类问题最有趣,只是越来越少见了……
标签: c++ algorithm graph-algorithm