// // Discrete Time CA using rates and parameterised time // Asynchronous, using only one array. // import java.util.*; import java.io.*; import java.awt.*; public class RallR1 extends CARS { Integer[] siteEventOrder; public RallR1(int n,int m,double tau,boolean draw){ super(n,m,tau,draw); siteEventOrder = new Integer[2*n*n]; // Integer array of site indices (as object so can use Collections.shuffle) for (int i=0;i < (siteEventOrder.length/2);i++) siteEventOrder[i] = i+1; for (int i=(siteEventOrder.length/2);i < siteEventOrder.length;i++) siteEventOrder[i] = -(siteEventOrder.length - i); } public void doGeneration(){ int species = -1; Collections.shuffle(Arrays.asList(siteEventOrder)); for (int eventindex : siteEventOrder) { int i = (Math.abs(eventindex)-1)/n; // zero-indexing correction int j = (Math.abs(eventindex)-1)%n; species = A[i][j]; if (species != empty) { if (eventindex < 0 && gen.nextDouble() <= pDeath[species]) death(species,A,i,j); if (eventindex > 0 && gen.nextDouble() <= pBirth[species]) birth(species,A,i,j); } } time = time + tau; if (draw){plot(); pause(100);} show(); } public static void main(String[] args) { int n = Integer.parseInt(args[0]); // size of grid int maxTime = Integer.parseInt(args[1]); // number of iterations double tau = Double.parseDouble(args[2]); // the click of the clock int m = (args.length/3) - 1; // n species boolean draw = args[args.length-1].equals("draw"); // do we draw? int reps = 1; if (args[args.length-1].equals("ten")) reps = 10; if (args[args.length-1].equals("hundred")) reps = 100; while (reps > 0){ RallR1 rallr1 = new RallR1(n,m,tau,draw); for (int i=1;i<=m;i++){ int species = i-1; int pop = Integer.parseInt(args[3*i]); rallr1.setBirthRate(species,Double.parseDouble(args[3*i+1])); rallr1.setDeathRate(species,Double.parseDouble(args[3*i+2])); for (int j=0;j