之所以一直这么喜欢mathematica,实在是与其强大的功能,迅速的可视化效果相关,有时做一件事情,面对的只是一次任务,并不需要将其流程化自动化,快速地实现是最重要的。
接着上次谈mathematica中的关于几种图形的画法。最近读集异璧,一直希望将其中的一些内容使用mathematica实现出来,比如第五章递归过程中关于费波那契数列的扩展。最近希望使用mathematica将之实现并能够推导出来。当然现在能力还力有不逮。
所谓力有不逮,就是别人告诉我一件事情,我有能力去跟着他做,但是自己有一个想法,还完全不能一丝不差地将之实现。
今天尝试想将费波那契堆画出来,最后画出这么样的效果
图1
这是使用LayeredGraphPlot的画法,而如果使用GraphPlot,则出显示出这样的结果:
图2
想到当年参加集智俱乐部的活动时,俱乐部的袁行远童鞋,曾经演示过一个网页,即是一个混沌系统各个结点在张力的作用下,怎么达到平衡。
当时的代码演示网址
http://www.demogng.de/
选择the-self-orgnizing map观看演示。
等到翻看mathemtica的帮助文档的时候,才真正被震到了。
怎么样的一张图人看起来地和漂亮,很显然,像图二,当在一片区域有许多结点时,结点分布的均匀的话,整张图看起来会更漂亮,但如何让一张图中的各个结点均匀地分布。
这就关系到所谓的作图算法(graph drawing algorithms),这样的算法就可以用来解决这样的问题。
我粗略想来,做图算法,解决的是在某块区域中,结点的均匀分布问题,而结点的均匀分布,在任何空间相关的领域都可以有一用之地,假设现在五月花号刚刚到了美洲,这些农民开始在美洲占地盘,那于对他们最有利的方式,就是满足最大的个人空间利用率的方式,每个人距离其他人的距离适中,不离某方过近从而产生争执,这就是graph drawing algorithms所需要解决的问题。
mathematica的帮助文档中提到了四种模型,分别是spring embeding 和spring-electrical embedding,这两种模型的原理都是最小化一个图的能量函数。还有一种思路是先在高维空间中对结点进行均匀化,然后再重新映射回二维或三维图形。
这几个模型都是针对无向图的画法的,即图中的连接不区分起始点和结束点。相反,区分起始和结束的,就是所谓的有向图。
上图图1和图2都是有向图。
今天先来看第一个模型spring embeding
spring是弹簧的意思,这个模型就有点像将不同的结点看做不同的小球,然后小球之间通过弹簧连接,当距离过远时,就取吸引力,而过近时则取排斥力。
其具体的计算形式如上所示,
其中|V|为整个图中的结点的数目,括号中为欧几里德距离,Lij则是弹簧的自然长度,i和j指示图中第i个和第j个结点,最后一个参数Kij=R/(Lij*Lij),是弹簧的强度。
明天我们来继续看这个模型。