昨天文章写得不好,写完有童鞋感觉像毛线一样,一乱麻。
自己看了也有这种感觉,其实并不复杂的东西被自己混乱的逻辑讲得特别神奇,很多时候,神奇这种词语只是垃圾这个词的礼貌用法。
这世界只应该有一种分类法,我懂得的,和我不明白的。
首先定义一点:此处所说的图是计算机算法中所指的由结点(node)和边(edge)所组成的图(graph),非普通日常用语。
作图算法其本意就是用来作图,那么首先应该区分好看的图和不好看的图,程序员思维比较简单,认识比较粗暴,所以有定义一:
- 好看的图:好看的图中的边的长度应该大致相等,而且边应该尽量少地交叉。
一个示例如下:
在使用spring embedding之前的图,和之后的图.
原图网址http://www.leda-tutorial.org/en/unofficial/ch05s03s08.html
如前所示,我们的想法是:
- 对于每个结点,计算与其他结点的距离,并将这个距离与弹簧的理想距离加权比较,从而得到这个结点的能量值
- 对整个图中的所有结点求值。
- 将所有结点的值求和。
- 对这个和进行优化,逐步通过改变边的长度来最小化能量函数。
可以参照这四步来理解这个公式,将这个公式用程序的方式写出来,大体应该是这个样子
Energy=0
For i in range(1, len(v)-1):
For j in range(i+1, len(v)):
Dis=ExculidentDist(X[i]-X[j])**2
CompDis=(Dis-L[i][j])**2
Energy+=K[i][j]*CompDis
而Kij与Lij是有关系的,如前所述Kij=R/(Lij*Lij),所以在整个式子中,关键的两个参数是R与Lij的选取。
Lij是弹簧的理想状态,可以由图论来计算得出,其大致思路就是将一个区域按照面积平列划分为N个结点,然后把每个结点放在一个区域的中心,那么相邻两个结点的长度就是Lij。(这个听起来很像是拓扑学的东东。。。)
这个想法背后的意思其实是一自组织的观念,当面对一个复杂问题时,如果无法下手,仍然像之前谈神经网络的文章一样,从最简单的单元开始,定义好单元的行为,然后从简单到复杂地进行模拟。
如果把这里的每个结点都看做一个人,那么
完整地演示,参见http://iv.slis.indiana.edu/sw/spring.html#Description
此网址需要安装java.
每条边就可以是人与人之间的相互关系,人在不同社会网络中的相互拉扯,从而定位到最好的位置,也正像这种做图算法对一个结点从混乱到稳定态的模拟。
明天对这个前述的公式进行些简单的扮演,看看能否推出胡克定律的形式。