码迷,mamicode.com
首页 > 编程语言 > 详细

Python + Matplotlib 绘制 Aztec Diamond 图的随机铺砌

时间:2015-06-09 16:17:14      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:

一个 $n$ 阶的 Aztec Diamond 图,是指依次将 $2,4,\ldots,2n,2n,\ldots,4,2$ 个单位方格摞在一起得到的对称图形(于是图中一共有 $2n(n+1)$ 个单位方格)。下图是 $n=5$ 时候的例子:

技术分享

 

对一个 $n$ 阶的 Aztec Diamond 图,用 $1\times 2$ 的多米诺骨牌铺砌它,总共有 $2^{n(n+1)}$ 种不同的方法。(这里不考虑对称性,比如全部用水平的骨牌铺砌和全部用竖直的骨牌铺砌,两种方法是不同的)

一个有趣的问题是,对给定的 $n$ 阶 Aztec Diamond,怎样从它的所有 $2^{n(n+1)}$ 种铺砌中等概率地任选一种?当 $n$ 很大时,这个事情并不好做。

下面这个图显示了 $n=80$ 时 Aztec Diamond 图的一个随机铺砌,它使用的是 Propp 论文中的 Domino Shuffling 算法:

技术分享

 

你可以看到图中出现了一个近似圆形的区域,在区域的内部,骨牌的排列是变化的,而区域外部则是 "冻结" 的,这就是所谓的 "北极圈" 现象。

 

这个图是我用 Python + Matplotlib 绘制的,代码在这里下载:domino.py。你可以把程序最后的参数 80 改成其它的整数(最好不要超过 200)。Matplotlib 库绘图的效率并不高,$n$ 很大时比较吃力,用 Cairo 库效率要高很多,但是 Cairo 的代码不如 Matplotlib 简洁。

 

一点注意事项:

  • Matplotlib 的参数 ‘aspect‘ 要设置为 1,否则它输出的图形会拉伸。
  • 程序中,用一个字典的数据结构保存铺砌,键 $(j,k)$ 表示以坐标整点 $(j,k)$ 为左下角的单位正方形,其值 $‘n‘,‘s‘,‘w‘,‘e‘,‘x‘$ 表示骨牌的状态,其中 $‘x‘$ 表示 "洞"。
  • 在 create 一步中,当把 $2\times2$ 的 "窟窿" 用一对骨牌填充时,一定要注意所用骨牌的状态,它们是一对方向相反的骨牌。

 

关于这个算法的更多故事,我会在后面的文章中介绍。

 

Python + Matplotlib 绘制 Aztec Diamond 图的随机铺砌

标签:

原文地址:http://www.cnblogs.com/xida/p/4563411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!