当前位置:   article > 正文

2.CA一维元胞自动机(netlogo)_一维元胞自动机c++

一维元胞自动机c++

一、简要叙述

主要分析了一下netlogo下一维元胞自动机的代码

实现了主要的几种重要的规则

rule30 rule254 rule90 和rule110

代表了元胞自动机的几个种类,混沌,秩序,复杂,复杂介于二者之间

二、代码分析

1、全局变量row

记录当前正在处理的行号

  1. globals [ ;;设置全局变量row
  2. row
  3. ]

2、每个元胞拥有的属性

左边元胞的颜色和右边元胞的颜色

  1. patches-own[ ;;小方块拥有的属性,左边邻居的颜色和右边邻居的颜色,自己的颜色自己能知道就省略了
  2. pcolor-of-leftpatch
  3. pcolor-of-rightpatch
  4. ]

3、初始化按钮 setup

这里搞清楚一个逻辑,什么东西可以改变颜色

主体,我要先拿到主体,才能改变颜色

如果直接设置颜色,当前的主体是观察者

所以要先深入到这个主体内部,身在其中,才能改变颜色

是由内而外的

  1. to setup
  2. clear-all
  3. set row max-pycor ;;设置当前处理行 为 最上面一行
  4. ask patches[
  5. set pcolor white ;;刚开始定义所有元胞是死的(黑活 白死)
  6. ]
  7. ask patch 0 max-pycor[
  8. set pcolor black ;;最开始给坐标为 0 max-pycor的元胞设置成黑色,国际惯例,你当然可以不这么设置
  9. ]
  10. reset-ticks ;;重设时间步
  11. end

4、循环迭代按钮 go

访问当前待处理行的元胞时,会执行do-rule方法,来决定当前元胞下面的元胞是什么颜色

with的意思是 满足什么条件

  1. to go
  2. if row = min-pycor[
  3. stop
  4. ]
  5. ask patches with [pycor = row][ ;;访问当前行的所有元胞 pycor是小方块的纵坐标
  6. do-rule ;;执行do-rule方法
  7. ]
  8. set row row - 1 ;;待会处理下一行
  9. tick ;;时间步+1
  10. end

5、执行规则函数 do-rule

这里展示的rule 30

这个数字首先转换成二进制是 00011110

我们把这个二进制数和7-0这个序列对应起来

就是

0 0 0 1 1 1 1 0

7 6 5 4 3 2 1 0

在上方序列为1的位置,就是生效的,可以让下一个元胞活,就是黑色(死是白色),颜色随便你定义

把生效的位置对应的下方序列的数字拿出来

就是 4 3 2 1

分别对应的三位二进制数为

1 0 0 ,1 0 1,0 1 0,0 0 1

由此代表

黑 白 白,黑 白 黑,白 黑 白,白 白 黑

也就是这样的组合,能够把下方的元胞变黑,其他4种组合就是变白

  1. to do-rule
  2. ;;先得到这个元胞的左右元胞的颜色
  3. set pcolor-of-leftpatch [pcolor] of patch-at -1 0 ;;这里为什么一定要加中括号,有待研究
  4. set pcolor-of-rightpatch [pcolor] of patch-at 1 0
  5. ifelse (pcolor-of-leftpatch = white and pcolor = white and pcolor-of-rightpatch = black)or
  6. (pcolor-of-leftpatch = white and pcolor = black and pcolor-of-rightpatch = white)or
  7. (pcolor-of-leftpatch = white and pcolor = black and pcolor-of-rightpatch = black)or
  8. (pcolor-of-leftpatch = black and pcolor = white and pcolor-of-rightpatch = white)
  9. [
  10. ;;set pcolor of patch-at 0 -1 black 这样的写法报错,原因是of拿到的是一个可以report的数据,而不是主体的颜色这个属性,暂时这么理解
  11. ask patch-at 0 -1 [
  12. set pcolor black
  13. ]
  14. ]
  15. [
  16. ask patch-at 0 -1[
  17. set pcolor white
  18. ]
  19. ]
  20. end

三、全部代码(rule30)

  1. globals [ ;;设置全局变量row
  2. row
  3. ]
  4. patches-own[ ;;小方块拥有的属性,左边邻居的颜色和右边邻居的颜色,自己的颜色自己能知道就省略了
  5. pcolor-of-leftpatch
  6. pcolor-of-rightpatch
  7. ]
  8. to setup
  9. clear-all
  10. set row max-pycor ;;设置当前处理行 为 最上面一行
  11. ask patches[
  12. set pcolor white
  13. ]
  14. ask patch 0 max-pycor[
  15. set pcolor black ;;最开始给坐标为 0 max-pycor的元胞设置成黑色,国际惯例,你当然可以不这么设置
  16. ]
  17. reset-ticks ;;重设时间步
  18. end
  19. to go
  20. if row = min-pycor[
  21. stop
  22. ]
  23. ask patches with [pycor = row][ ;;访问当前行的所有元胞 pycor是小方块的纵坐标
  24. do-rule ;;执行do-rule方法
  25. ]
  26. set row row - 1 ;;待会处理下一行
  27. tick ;;时间步+1
  28. end
  29. ;;这里展示rule30
  30. ;;对应 00011110 顺序是7-0
  31. ;;也就是二进制数 1,2,3,4能够生成黑色
  32. ;;001 010 011 100
  33. ;;对应:白白黑,白黑白,白黑黑,黑白白
  34. to do-rule
  35. ;;先得到这个元胞的左右元胞的颜色
  36. set pcolor-of-leftpatch [pcolor] of patch-at -1 0 ;;这里为什么一定要加中括号,有待研究
  37. set pcolor-of-rightpatch [pcolor] of patch-at 1 0
  38. ifelse (pcolor-of-leftpatch = white and pcolor = white and pcolor-of-rightpatch = black)or
  39. (pcolor-of-leftpatch = white and pcolor = black and pcolor-of-rightpatch = white)or
  40. (pcolor-of-leftpatch = white and pcolor = black and pcolor-of-rightpatch = black)or
  41. (pcolor-of-leftpatch = black and pcolor = white and pcolor-of-rightpatch = white)
  42. [
  43. ;;set pcolor of patch-at 0 -1 black 这样的写法报错,原因是of拿到的是一个可以report的数据,而不是主体的颜色这个属性,暂时这么理解
  44. ask patch-at 0 -1 [
  45. set pcolor black
  46. ]
  47. ]
  48. [
  49. ask patch-at 0 -1[
  50. set pcolor white
  51. ]
  52. ]
  53. end

界面

四、多种规则下的do-rule方法

rule30就不说了,上面有

1.rule 254

代码

  1. ;;rule 254
  2. ;;1111 1110 7-0
  3. ;;000 对应 白 其他都是黑
  4. to do-rule[
  5. set pcolor-of-leftpatch [pcolor] of patch-at -1 0
  6. set pcolor-of-rightpatch [pcolor] of patch-at 1 0
  7. ifelse (pcolor-of-leftpatch = white and pcolor = white and pcolor-of-rightpatch = black)
  8. [
  9. ask patch-at 0 -1 [
  10. set pcolor white
  11. ]
  12. ]
  13. [
  14. ask patch-at 0 -1[
  15. set pcolor black
  16. ]
  17. ]
  18. ]

界面

2.rule 90

代码

  1. ;;rule 90
  2. ;;01011010 7-0
  3. ;;6 4 3 1
  4. ;;110 100 011 010
  5. ;;黑黑白 黑白白 白黑黑 白白黑
  6. to do-rule
  7. set pcolor-of-leftpatch [pcolor] of patch-at -1 0
  8. set pcolor-of-rightpatch [pcolor] of patch-at 1 0
  9. ifelse (pcolor-of-leftpatch = black and pcolor = black and pcolor-of-rightpatch = white)or
  10. (pcolor-of-leftpatch = black and pcolor = white and pcolor-of-rightpatch = white)or
  11. (pcolor-of-leftpatch = white and pcolor = black and pcolor-of-rightpatch = black)or
  12. (pcolor-of-leftpatch = white and pcolor = white and pcolor-of-rightpatch = black)
  13. [
  14. ask patch-at 0 -1[
  15. set pcolor black
  16. ]
  17. ]
  18. [
  19. ask patch-at 0 -1[
  20. set pcolor white
  21. ]
  22. ]
  23. end

界面

3.rule 110

代码

  1. ;;rule 110
  2. ;;01101110 7-0
  3. ;;6 5 3 2 1
  4. ;;110 101 011 010 001
  5. ;;黑黑白 黑白黑 白黑黑 白黑白 白白黑
  6. ;;选少的来
  7. ;;7 4 0
  8. ;;111 100 000
  9. ;;黑黑黑 黑白白 白白白
  10. to do-rule
  11. set pcolor-of-leftpatch [pcolor] of patch-at -1 0
  12. set pcolor-of-rightpatch [pcolor] of patch-at 1 0
  13. ifelse (pcolor-of-leftpatch = black and pcolor = black and pcolor-of-rightpatch = black)or
  14. (pcolor-of-leftpatch = black and pcolor = white and pcolor-of-rightpatch = white)or
  15. (pcolor-of-leftpatch = white and pcolor = white and pcolor-of-rightpatch = white)
  16. [
  17. ask patch-at 0 -1[
  18. set pcolor white
  19. ]
  20. ]
  21. [
  22. ask patch-at 0 -1[
  23. set pcolor black
  24. ]
  25. ]
  26. end

界面

五、小结

多分析几个模型好开始自己的工作

这里的rule30是wolfman最喜欢的规则,体现了“复杂”这一特性

rule254就是秩序

rule90呈现周期性

rule110就是秩序和混沌之间的,略微复杂

据说混沌的边缘就是复杂

有点神奇的

运行模型的时候别忘了在主界面的设置选项值把patch的大小设小一点,好观察

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/177421
推荐阅读
相关标签
  

闽ICP备14008679号