www.pudn.com > onedimca.rar > TotalisticCA.java, change:2004-02-05,size:2308b


package ca;
// Simple Java class for visualization of cellular automata.
// Juha Haataja, CSC, Finland.
// E-mail: Juha.Haataja@csc.fi.

import java.util.Random;

// Java class for implementing 1D cellular automata
public class TotalisticCA {

  private int state_nr = 2;
  private int radius = 1;
  private long rule_nr = 18;
  private int rule_type=0;
  private int[] ruletable = ca_rule(state_nr, radius, rule_nr,rule_type);

  // Initialization
  public TotalisticCA(int k, int r, long nr,int type) {
    if (state_nr != k || radius != r || rule_nr != nr||type!=rule_type) {
      if (k > 1) state_nr = k;
      if (r >= 0) radius = r;
      if (nr >= 0) rule_nr = nr;
      if(type>=0)rule_type=type;
      ruletable = ca_rule(state_nr, radius, rule_nr,rule_type);
    }
  }

  // Construction of the rule table
  private int[] ca_rule(int k, int r, long nr,int type) {
    int n;
    if(type==0){
      n = (int)(Math.pow(k,2*r+1));
    }else{
      n=(k-1)*(2*r+1)+1;
    }
    int[] table = new int[n];
    for (int i = 1; i <= n; i++)
      table[i-1] = rule_value(i, nr, k);
    return table;
  }

  // Help routine for making rule tables
  private int rule_value(int b, long n, int k) {
    if (b == 1)
      return (int)(n % k);
    else
      return rule_value(b-1, n/k, k);
  }

  // Generation of an initial configuration
  public int[] config_init(int n) {
    Random random_number = new Random();
    int[] array = new int[n];
    for (int i = 0; i < n; i++) {
      array[i] = (int)(state_nr*random_number.nextDouble());
      if (array[i] > state_nr-1)
	array[i] = state_nr-1;
    }
    return array;
  }

  // Computing the next configuration
  public int[] ca_next(int[] config,int type) {
    int len = config.length;
    int[] res = new int[len];
    for (int i = 0; i < len; i++) {
      res[i] = 0;
      for (int j = -radius; j <= radius; j++) {
	if (i+j >= 0 && i+j < len){
	  if(type==0)res[i] =res[i]*state_nr + config[i+j];
          else res[i] +=config[i+j];
        }else if (i+j < 0){
	  if(type==0)res[i] =res[i]*state_nr + config[len-i+j];
          else res[i] += config[len-i+j];
	}else{
	  if(type==0)res[i] =res[i]*state_nr + config[i+j-len];
          else res[i] += config[i+j-len];
        }
      }
      res[i] = ruletable[res[i]];
    }
    return res;
  }

}