//probability table int[][] silvertown_grid = new int[grid_width][grid_height]; int[][] silvertown_next_state = new int[grid_width][grid_height]; // Species: int LOLIUM = 0; int AGROSTIS = 1; int HOLCUS = 2; int POA = 3; int CYNOSURUS = 4; // [invader][native] float[][] p_invasion_table = {{.00, .02, .06, .05, .03}, {.23, .00, .09, .32, .37}, {.06, .08, .00, .16, .09}, {.44, .06, .06, .00, .11}, {.03, .02, .03, .05, .00}}; color[] silvertown_colors = {color(200, 0, 0), color(200, 200, 0), color(0, 200, 0), color(100, 100, 255), color(0, 0, 150)}; int getSilvertonSpeciesAt(int i, int j){ int ii = i; if(i < 0) ii = 0; if(i >= grid_width) ii = grid_width - 1; int jj = j; if(j < 0) jj = 0; if(j >= grid_height) jj = grid_height - 1; return silvertown_grid[ii][jj]; } float[] pInvasions(int i, int j){ int s = silvertown_grid[i][j]; float[] p_invasions = new float[p_invasion_table.length]; int s1 = getSilvertonSpeciesAt(i, j-1); p_invasions[s1] += p_invasion_table[s1][s] * .25; int s2 = getSilvertonSpeciesAt(i-1, j); p_invasions[s2] += p_invasion_table[s2][s] * .25; int s3 = getSilvertonSpeciesAt(i+1, j); p_invasions[s3] += p_invasion_table[s3][s] * .25; int s4 = getSilvertonSpeciesAt(i, j+1); p_invasions[s4] += p_invasion_table[s4][s] * .25; return p_invasions; } int compete(int current_species, float[] p_invasion){ float r = random(1.0); float p_sum = 0; int winner = current_species; int contender = 0; while(r > p_sum && contender < p_invasion.length){ p_sum += p_invasion[contender]; if( r > p_sum) { contender++; } else { winner = contender; } } return winner; } void initSilvertownBands(int s0, int s1, int s2, int s3, int s4){ int band_width = grid_height / 5; int[] ss = {s0, s1, s2, s3, s4}; for (int n = 0; n < ss.length; n++){ for(int j = n*band_width; j < (n+1)*band_width; j++){ for(int i = 0; i < grid_width; i++){ silvertown_grid[i][j] = ss[n]; } } } }