细胞自动机和简单扩散玩法常让一整排格子在同一拍更新。如果从左到右边读边改,后面的格子可能读到前面已经更新的新值,导致规则偷偷变成依赖扫描方向的另一套规则。
下面使用一组独立练习数据,说明输入、规则、处理顺序和输出之间的关系。建议先遮住结果自己推演,再逐步对照;如果出现差异,应先定位第一处不同,并检查边界条件,不要只把最后的答案改成一样。
规则和数据
本例只有一排零一格,下一拍某格为一,当且仅当它左右两个邻居中恰好一个为一。自身旧值不参与,地图外永久为零。所有格子都读取同一张旧快照,然后一起替换,规则是本例的明确约定。
格数14,索引从0开始 初态00101101000110
逐步推演
第1拍从旧快照00101101000110计算,整排结果01001100101111;亮格位置[1, 4, 5, 8, 10, 11, 12, 13],亮格数8,完成后才替换旧快照。
第2拍从旧快照01001100101111计算,整排结果10111111001001;亮格位置[0, 2, 3, 4, 5, 6, 7, 10, 13],亮格数9,完成后才替换旧快照。
第3拍从旧快照10111111001001计算,整排结果00100001110110;亮格位置[2, 7, 8, 9, 11, 12],亮格数6,完成后才替换旧快照。
第4拍从旧快照00100001110110计算,整排结果01010011010111;亮格位置[1, 3, 6, 7, 9, 11, 12, 13],亮格数8,完成后才替换旧快照。
第5拍从旧快照01010011010111计算,整排结果10001111000101;亮格位置[0, 4, 5, 6, 7, 11, 13],亮格数7,完成后才替换旧快照。
第6拍从旧快照10001111000101计算,整排结果01011001101000;亮格位置[1, 3, 4, 7, 8, 10],亮格数6,完成后才替换旧快照。
第7拍从旧快照01011001101000计算,整排结果10011111100100;亮格位置[0, 3, 4, 5, 6, 7, 8, 11],亮格数8,完成后才替换旧快照。
第8拍从旧快照10011111100100计算,整排结果01110000111010;亮格位置[1, 2, 3, 8, 9, 10, 12],亮格数7,完成后才替换旧快照。
最后图案01110000111010,亮格数7。
如何复核与应用
可以让每个亮格向左右各投一票,得到奇数票的有效格成为下一拍亮格。也可以把初始图案左右翻转后再推演,结果应始终与原推演的左右翻转一致,这能发现顺序更新造成的偏差。
这里每格只依赖左右邻居,并非在模拟所有真实的扩散过程。边界外固定为零也和首尾相接不同;把最后一格当作第一格左邻居会产生另一套结果,应先检查边界约定再怀疑计算错误。
这是一套明确限定的教学模型,实际作品可能采用其他约定。记录实验时,保留原始输入、每步状态以及规则版本;调整一个条件后重新演算,并检查起点、终点、重复输入和刚好位于边界的情况,才能知道差异来自设计还是计算。
