主题:生命游戏演示程序
这就是细胞自动机(又称元胞自动机),名字虽然很深奥,但是它的行为却是非常美妙,非常可爱的。所有这些怎样实现的呢?我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有N*N个格子。而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,如果该格子生就显示兰色,死则显示白色。每一个格子旁边都有邻居格子存在,如果我们把3*3的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子。每个格子的生死遵循下面的原则:如果一个生命体的邻居中有2个或者3个格子是活的话那么它将继续存活下去,否则,如果多于这个数就会因为过分拥挤而死亡,少于这个数就会因为过分孤独而死亡。如果当前格子原先是死的状态,那么当他有3个活着的邻居时他就会获得重生。就是这样把这些若干个格子(生命体)构成了一个复杂的动态世界。运用简单的几条作用规则构成的群体会涌现出很多意想不到的复杂性为,这就是复杂性科学的研究焦点。
细胞自动机有一个通用的形式化的模型,每个格子(或细胞)的状态可以在一个有限的状态集合S中取值,格子的邻居范围是一个半径r,也就是以这个格子为中心,在距离它r远的所有格子构成了这个格子的邻居集合,还要有一套演化规则,可以看成是一个与该格子当前状态以及邻居状态相关的一个函数,可以写成f:S*S^((2r)^N-1)->S。这就是细胞自动机的一般数学模型。
最早研究细胞自动机的科学家是冯诺伊曼,后来康韦发明了上面展示的这个最有趣的细胞自动机程序:《生命游戏》,而wolfram则详尽的讨论了一维世界中的细胞自动机的所有情况,认为可以就演化规则f进行自动机的分类,而只有当f满足一定条件的时候,系统演化出来的情况才是有活力的,否则不是因为演化规则太死板而导致生命的死亡,就是因为演化规则太复杂而使得随机性无法克服,系统乱成一锅粥,没有秩序。后来人工生命之父郎顿进一步发展了元胞自动机理论。并认为具有8个有限状态集合的自动机就能够涌现出生命体的自复制功能。他根据不同系统的演化函数f,找到了一个参数lamda用以描述f的复杂性,得出了结论只有当lamda比混沌状态的lamda相差很小的时候,复杂的生命活系统才会诞生,因此,朗顿称生命诞生于“混沌的边缘”!并从此开辟了“人工生命”这一新兴的交叉学科!
如今细胞自动机已经在地理学、经济学、计算机科学等领域得到了非常广泛的应用!
DEFINT A-Z
SCREEN 13
'************************** 主程序开始 **************************
INPUT "Input 50~160:", ma
CLS
IF ma < 50 THEN ma = 50
IF ma > 160 THEN ma = 160
map = ma '世界地图范围大小
left = 12
right = 12
col = 13 '生命颜色
dicol = 1 '底色
PAINT (1, 1), dicol
DIM sm(map, map)
DIM temp(map, map)
FOR i = 1 TO 7
LINE (left - i, right - i)-STEP(map + 2 * i + 1, map + 2 * i + 1), i + 40, B
NEXT
FOR i = 1 TO map STEP 2
FOR j = 1 TO map
IF i > 10 AND i < map - 10 THEN
IF j > 10 AND j < map - 10 THEN
sm(i, j) = INT(RND + .5)
END IF
END IF
IF sm(i, j) <> 0 THEN
PSET (i + left, j + right), sm(i, j) + col
ELSE
PSET (i + left, j + right), dicol
END IF
NEXT
NEXT
SLEEP
LINE (10, 184)-STEP(310, 20), dicol, BF
'生命开始
DO
FOR i = 1 TO map
FOR j = 1 TO map
flag = 0 '定义周边邻居的数量,包括自身
FOR n = -1 TO 1
FOR m = -1 TO 1
ax = i + n: IF ax < 1 THEN ax = map ELSE IF ax > map THEN ax = 1
ay = j + m: IF ay < 1 THEN ay = map ELSE IF ay > map THEN ay = 1
IF sm(ax, ay) = 1 THEN flag = flag + 1
IF sm(i, j) = 1 THEN p = 1 ELSE p = 0
NEXT
NEXT
'生存条件,2,3个邻居不变,3个邻居重生,大于3小于2死亡
IF (p = 1 AND flag = 3) OR (p = 1 AND flag = 4) OR (p = 0 AND flag = 3) THEN
temp(i, j) = 1
END IF
IF (p = 1 AND flag < 3) OR (p = 1 AND flag > 4) THEN
temp(i, j) = 0
END IF
NEXT
NEXT
'显示世界变化
tos = 0
FOR i = 1 TO map
FOR j = 1 TO map
sm(i, j) = temp(i, j)
IF sm(i, j) = 1 THEN tos = tos + 1
IF tos > max THEN max = tos
IF tos < min THEN min = tos
IF sm(i, j) <> 0 THEN
PSET (i + left, j + right), sm(i, j) + INT(RND * 3 + 1) + 40
ELSE
PSET (i + left, j + right), dicol
END IF
NEXT
NEXT
LOOP WHILE INKEY$ <> CHR$(27)
'************************** 主程序结束 **************************
CLOSE
END
细胞自动机有一个通用的形式化的模型,每个格子(或细胞)的状态可以在一个有限的状态集合S中取值,格子的邻居范围是一个半径r,也就是以这个格子为中心,在距离它r远的所有格子构成了这个格子的邻居集合,还要有一套演化规则,可以看成是一个与该格子当前状态以及邻居状态相关的一个函数,可以写成f:S*S^((2r)^N-1)->S。这就是细胞自动机的一般数学模型。
最早研究细胞自动机的科学家是冯诺伊曼,后来康韦发明了上面展示的这个最有趣的细胞自动机程序:《生命游戏》,而wolfram则详尽的讨论了一维世界中的细胞自动机的所有情况,认为可以就演化规则f进行自动机的分类,而只有当f满足一定条件的时候,系统演化出来的情况才是有活力的,否则不是因为演化规则太死板而导致生命的死亡,就是因为演化规则太复杂而使得随机性无法克服,系统乱成一锅粥,没有秩序。后来人工生命之父郎顿进一步发展了元胞自动机理论。并认为具有8个有限状态集合的自动机就能够涌现出生命体的自复制功能。他根据不同系统的演化函数f,找到了一个参数lamda用以描述f的复杂性,得出了结论只有当lamda比混沌状态的lamda相差很小的时候,复杂的生命活系统才会诞生,因此,朗顿称生命诞生于“混沌的边缘”!并从此开辟了“人工生命”这一新兴的交叉学科!
如今细胞自动机已经在地理学、经济学、计算机科学等领域得到了非常广泛的应用!
DEFINT A-Z
SCREEN 13
'************************** 主程序开始 **************************
INPUT "Input 50~160:", ma
CLS
IF ma < 50 THEN ma = 50
IF ma > 160 THEN ma = 160
map = ma '世界地图范围大小
left = 12
right = 12
col = 13 '生命颜色
dicol = 1 '底色
PAINT (1, 1), dicol
DIM sm(map, map)
DIM temp(map, map)
FOR i = 1 TO 7
LINE (left - i, right - i)-STEP(map + 2 * i + 1, map + 2 * i + 1), i + 40, B
NEXT
FOR i = 1 TO map STEP 2
FOR j = 1 TO map
IF i > 10 AND i < map - 10 THEN
IF j > 10 AND j < map - 10 THEN
sm(i, j) = INT(RND + .5)
END IF
END IF
IF sm(i, j) <> 0 THEN
PSET (i + left, j + right), sm(i, j) + col
ELSE
PSET (i + left, j + right), dicol
END IF
NEXT
NEXT
SLEEP
LINE (10, 184)-STEP(310, 20), dicol, BF
'生命开始
DO
FOR i = 1 TO map
FOR j = 1 TO map
flag = 0 '定义周边邻居的数量,包括自身
FOR n = -1 TO 1
FOR m = -1 TO 1
ax = i + n: IF ax < 1 THEN ax = map ELSE IF ax > map THEN ax = 1
ay = j + m: IF ay < 1 THEN ay = map ELSE IF ay > map THEN ay = 1
IF sm(ax, ay) = 1 THEN flag = flag + 1
IF sm(i, j) = 1 THEN p = 1 ELSE p = 0
NEXT
NEXT
'生存条件,2,3个邻居不变,3个邻居重生,大于3小于2死亡
IF (p = 1 AND flag = 3) OR (p = 1 AND flag = 4) OR (p = 0 AND flag = 3) THEN
temp(i, j) = 1
END IF
IF (p = 1 AND flag < 3) OR (p = 1 AND flag > 4) THEN
temp(i, j) = 0
END IF
NEXT
NEXT
'显示世界变化
tos = 0
FOR i = 1 TO map
FOR j = 1 TO map
sm(i, j) = temp(i, j)
IF sm(i, j) = 1 THEN tos = tos + 1
IF tos > max THEN max = tos
IF tos < min THEN min = tos
IF sm(i, j) <> 0 THEN
PSET (i + left, j + right), sm(i, j) + INT(RND * 3 + 1) + 40
ELSE
PSET (i + left, j + right), dicol
END IF
NEXT
NEXT
LOOP WHILE INKEY$ <> CHR$(27)
'************************** 主程序结束 **************************
CLOSE
END