【问题标题】:Cellular Automaton not working元胞自动机不工作
【发布时间】:2015-03-11 13:42:09
【问题描述】:

我正在尝试基于this 创建一个元胞自动机。我设法以一种仅遵循规则 90 的简单方式做到了这一点,但是当我将其更改为接受任何规则时,我做错了。

结果应该是这样的。 http://natureofcode.com/book/imgs/chapter07/ch07_12.png

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *myFile = fopen ( "input.txt" , "r" );
    int i, j, cell, iterations=100, current[80], previous[80], ruleCase, rule=90;
    for(i=0;i<80;i++){
        fscanf(myFile, "%1d", &previous[i]);
        if(previous[i]==0)printf("%c",176);
        else printf("%c",178);
    }
    for(i=0;i<=iterations;i++){
        for(cell=0;cell<80;cell++)
        {
            if((cell>0) && (cell<79))
            {
                ruleCase=1*previous[cell-1]+2*previous[cell]+3*previous[cell+1];
            }
            else if(cell==0)
            {
                ruleCase=1*previous[79]+2*previous[cell]+3*previous[cell+1];
            }
            else if(cell==79)
            {
                ruleCase=1*previous[cell-1]+2*previous[cell]+3*previous[0];
            }
            if(rule & (128 >> ruleCase))
            {
                current[cell]=1;
                printf("%c",178);
            }
            else
            {
                current[cell]=0;
                printf("%c",176);
            }
        }
        for(j=0;j<80;j++){
            previous[j]=current[j];
        }
    }
    return 0;
}

使用以下 input.txt 00000000000000000000000000000000000000100000000000000000000000000000000000000000

谢谢!

【问题讨论】:

  • 拼写说明:“自动机”这个词是复数形式。单数是“自动机”(已更正)。

标签: c cellular-automata


【解决方案1】:

您似乎错误地计算了ruleCase。例如,在一般情况下,您会这样做...

ruleCase=1*previous[cell-1]+2*previous[cell]+3*previous[cell+1]

... 但您正试图将单元格值解释为 binary 数字。因此,系数应该是 2 的幂:

ruleCase=1*previous[cell-1]+2*previous[cell]+4*previous[cell+1]

对于特殊情况也是如此。

【讨论】:

    【解决方案2】:

    问题出在这一行:

    ruleCase=1*previous[cell-1]+2*previous[cell]+3*previous[cell+1];
    

    当我将3 更改为4 时,程序会生成谢尔宾斯基三角形。

    ruleCase=1*previous[cell-1]+2*previous[cell]+4*previous[cell+1];
    

    还有另外两条类似的线。

    【讨论】:

    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多