我有一个无线网状网络节点系统,每个节点都能够报告自己与邻居的“距离”,以(简化的)信号强度为单位测量。由于无线电干扰,节点在地理上位于三维空间中,但节点之间的距离不必符合三角函数(三角函数?)的一致性。即给定节点A、B和C,A和B之间的距离可能是10,A和C之间也是10,但B和C之间是100。
我想要做的是通过节点的连接性来可视化逻辑网络布局,即在可视化中包括节点之间的逻辑距离。
到目前为止,我的研究表明多维缩放(MDS)正是为这种情况设计的。鉴于我的数据可以直接表示为2d距离矩阵,它甚至是更通用的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算法的属性的更多信息?
- 有一种算法可以推导出网络中每个节点的完整位置,而无需传递每个节点的初始位置吗?
- 有没有可靠的方法来估计每个点的位置,以便算法可以正确地缩放它们之间的距离?我没有每个节点的地理位置,这就是这个练习的全部意义。
- 有没有算法可以使网络派生出的“角度”在运行之间保持恒定?
显然,我更喜欢稳定的算法解决方案 - 增加迭代次数以平滑随机性不是非常可靠。
谢谢。
编辑:我被引荐到cs.stackexchange.com,那里进行了一些评论。有关算法建议,请参见https://cs.stackexchange.com/questions/18439/stable-multi-dimensional-scaling-algorithm。
图1-使用随机初始化矩阵:
图2-在使用相同输入数据后运行后,与1相比旋转:
图3-与前两者相同,但节点1-3朝另一个方向:
图4-将节点的初始布局放在一条线上,它们在y轴上的位置没有改变: