Readventurer

重新出发去冒险, 在郎飞结与地壳的起伏山峰

飞翔的鸟插图。

画一幅图的动力学之二


昨天文章写得不好,写完有童鞋感觉像毛线一样,一乱麻。

自己看了也有这种感觉,其实并不复杂的东西被自己混乱的逻辑讲得特别神奇,很多时候,神奇这种词语只是垃圾这个词的礼貌用法。

这世界只应该有一种分类法,我懂得的,和我不明白的。

 
 

首先定义一点:此处所说的图是计算机算法中所指的由结点(node)和边(edge)所组成的图(graph),非普通日常用语。

 
 

作图算法其本意就是用来作图,那么首先应该区分好看的图和不好看的图,程序员思维比较简单,认识比较粗暴,所以有定义一:

  • 好看的图:好看的图中的边的长度应该大致相等,而且边应该尽量少地交叉。

一个示例如下:


在使用spring embedding之前的图,和之后的图.

原图网址http://www.leda-tutorial.org/en/unofficial/ch05s03s08.html

 
 

如前所示,我们的想法是:

  1. 对于每个结点,计算与其他结点的距离,并将这个距离与弹簧的理想距离加权比较,从而得到这个结点的能量值
  2. 对整个图中的所有结点求值。
  3. 将所有结点的值求和。
  4. 对这个和进行优化,逐步通过改变边的长度来最小化能量函数。

 
 


可以参照这四步来理解这个公式,将这个公式用程序的方式写出来,大体应该是这个样子

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

 
 

KijLij是有关系的,如前所述Kij=R/(Lij*Lij),所以在整个式子中,关键的两个参数是RLij的选取。

Lij是弹簧的理想状态,可以由图论来计算得出,其大致思路就是将一个区域按照面积平列划分为N个结点,然后把每个结点放在一个区域的中心,那么相邻两个结点的长度就是Lij。(这个听起来很像是拓扑学的东东。。。)

 
 

这个想法背后的意思其实是一自组织的观念,当面对一个复杂问题时,如果无法下手,仍然像之前谈神经网络的文章一样,从最简单的单元开始,定义好单元的行为,然后从简单到复杂地进行模拟。

 
 

如果把这里的每个结点都看做一个人,那么


完整地演示,参见http://iv.slis.indiana.edu/sw/spring.html#Description

此网址需要安装java.

 
 

 
 

每条边就可以是人与人之间的相互关系,人在不同社会网络中的相互拉扯,从而定位到最好的位置,也正像这种做图算法对一个结点从混乱到稳定态的模拟。

 
 

明天对这个前述的公式进行些简单的扮演,看看能否推出胡克定律的形式。