C语言实现基于投票规则的细胞自动机

算法介绍

首先我们先看一下“基于投票规则的细胞自动机”的定义:

基于投票规则的细胞自动机,实际上是具有如下限定条件的一种细胞自动机:

状态:0或1;

邻居:中心的3*3邻居;

规则:计数p表示中心的3*3邻居中1的个数(包括中心本身),if P<5,中心设置为0.否则设置为1 。

混沌随机序列:

一般我们采用混合光学双稳模型迭代方程实现混沌随机序列的产生:

题目要求:

现在给定系数A为4,Xb为2.5,要求生成一个长度为16的混沌序列{xi}。并且用一下方法将该序列转换为0 1序列:xi > 2.5 则赋值为1, 否则赋值为 0 。然后把这个序列排成4 * 4的0 1矩阵,并用上述的细胞自动机对该矩阵进行两次运算,给出最终的矩阵结果。

 

算法实现代码如下:

/*****************************************
Author: Nero
Data:2013/12/22
Deifning coefficient A as 4, Xb as 2.5;
*****************************************/

#include<stdio.h>
#include<math.h>
using namespace std;
const int A = 4;
const float Xb = 2.5;

void Rules_Impl(float P[],float dMatrix[4][4]);

void Cellular_Automata(float dInit)
{
    printf("dInit=%g\n\n",dInit);
    int i ,j;                                                             //variables for counting 
    float dMatrix[4][4];
    float P[4];
    float *X = new float[16];
    X[0] = dInit;                                                  //Initializing X[0]
    int count = 0;                                               //temp variable for counting index
    for (i = 0; i < 15; i++)
    {
        X[i+1] = 4 * pow(sin(X[i]- Xb),2);                  //Sequence with a length of 16;
    }
    //Print sequence 
    for (i = 0; i < 16; i++)
    {
        printf("%f\t",X[i]);
    }
    printf("\n\n");

    for (i = 0; i < 16; i++)
    {
        X[i] = X[i]>2.5?1:0;
    }
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j< 4; j++)
        {
            dMatrix[i][j] = X[count];
            ++count;
        }
    }
    //Print Matrix
    printf("The original matrix is \n");
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            printf("%g\t",dMatrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    //calculate the centers, Twice
    for (i = 0; i < 2; i++)
    {
        Rules_Impl(P,dMatrix);
    }
    printf("The final matrix is \n");
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            printf("%g\t",dMatrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void Inter()
{
    float Init;
    printf("Input the init Num\n");
    scanf_s("%g",&Init);
    Cellular_Automata(Init);                     
}

void Rules_Impl(float P[],float dMatrix[4][4])
{
    //Four calculations for the center of the 3*3 neighbors
    //Choose Matrix[1][1], Matrix[2][1], Matrix[1][2], Matrix[2][2] as centers
    int  i =0,  j = 0;

    //Matrix[1][1]
    for (i = 0 ; i <3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            P[0] += dMatrix[i][j];
        }
    }
    //Matrix[2][1]
    for (i = 1; i<4;i++)
    {
        for (j=0;j <3;j++)
        {
            P[1]+=dMatrix[i][j];
        }
    }
    //Matrix[1][2]
    for (i = 0; i<3;i++)
    {
        for (j=1;j <4;j++)
        {
            P[2]+=dMatrix[i][j];
        }
    }
    //Matrix[2][2]
    for (i = 1; i<4;i++)
    {
        for (j=1;j <4;j++)
        {
            P[3]+=dMatrix[i][j];
        }
    }
    dMatrix[1][1] = P[0]<5?0:1;
    dMatrix[2][1] = P[1]<5?0:1;
    dMatrix[1][2] = P[2]<5?0:1;
    dMatrix[2][2] = P[3]<5?0:1;
}

其中Rules_Impl()函数的作用是进行细胞自动机运算。

Cellular_Automata()函数为主要功能实现函数,包括随机序列的产生,矩阵的产生以及对Rules_Impl()函数的调用。

 

 

posted @ 2013-12-22 19:15  NeroHwang  阅读(1033)  评论(4编辑  收藏  举报