[401] | 1 | //size versus energy
|
---|
| 2 | //real proportions
|
---|
| 3 |
|
---|
| 4 | // -------------------------------- step begin --------------------------------
|
---|
| 5 |
|
---|
| 6 | function reproduce_haploid(repro_list, number)
|
---|
| 7 | {
|
---|
| 8 | var len = repro_list.size;
|
---|
| 9 | if (len % 2 != 0) len = repro_list.size - 1;
|
---|
| 10 |
|
---|
| 11 | for (var i = 0; i < len - 2 ; i = i + 2)
|
---|
| 12 | {
|
---|
| 13 | var parent = Populations[0].get(repro_list[i]);
|
---|
| 14 | var parent2 = Populations[0].get(repro_list[i + 1]);
|
---|
| 15 |
|
---|
| 16 | number = parent.user2["Va"] / ExpParams.ofnumd + parent2.user2["Va"] / ExpParams.ofnumd;
|
---|
| 17 | for (var j = 0; j < number; j++)
|
---|
| 18 | {
|
---|
| 19 | //size
|
---|
| 20 | var rsize = (parent.user1["delta_d"] + ExpParams.diplo_rad);
|
---|
| 21 | if (Math.rnd01 < 0.5)
|
---|
| 22 | {
|
---|
| 23 | rsize = parent2.user1["delta_d"] + ExpParams.diplo_rad;
|
---|
| 24 | }
|
---|
| 25 |
|
---|
| 26 | var deltas = parent.user1["delta_d"];
|
---|
| 27 | //mutation
|
---|
| 28 | if (Math.rnd01 < ExpParams.mutationprob)
|
---|
| 29 | {
|
---|
| 30 | var diff = delta_change * deltas;
|
---|
| 31 | if (Math.rnd01 < 0.5)
|
---|
| 32 | {
|
---|
| 33 | deltas -= diff;
|
---|
| 34 | }
|
---|
| 35 | else
|
---|
| 36 | {
|
---|
| 37 | deltas += diff;
|
---|
| 38 | }
|
---|
| 39 | rsize = ExpParams.diplo_rad + deltas;
|
---|
| 40 | }
|
---|
| 41 |
|
---|
| 42 | var cr = Populations[0].add("//0\np:sh=1,sx=" + rsize + ",sy=" + rsize + ",sz=" + rsize + ", rz=3.14159265358979");
|
---|
| 43 | cr.energ0 = ExpParams.ofnumd;
|
---|
| 44 | cr.energy = cr.energ0;
|
---|
| 45 | var dsize = ExpParams.diplo_rad * ExpParams.delta_rate + ExpParams.diplo_rad;
|
---|
| 46 | cr.user1 = [ {"vamin" : (rsize / dsize) * ExpParams.v_min_d, "amin": parent.user1["amin"], "delta_h" : parent.user1["delta_h"], "delta_d" : deltas }, {"vamin" : (rsize / dsize) * ExpParams.v_min_d, "amin": parent2.user1["amin"], "delta_h" : parent2.user1["delta_h"], "delta_d" : deltas }];
|
---|
| 47 | cr.user2 = { "Va" : cr.energ0, "gen" : 1 , "growth_step" : ExpParams.growth_step, "rsize": rsize, "vinit": cr.energ0};
|
---|
| 48 | placeRandomlyNotColliding(cr);
|
---|
| 49 | }
|
---|
| 50 | }
|
---|
| 51 |
|
---|
| 52 | for (var j = 0; j < repro_list.size; j++)
|
---|
| 53 | {
|
---|
| 54 | Populations[0].kill(repro_list[j]);
|
---|
| 55 | }
|
---|
| 56 | }
|
---|
| 57 |
|
---|
| 58 | function reproduce_diploid(repro_list, number)
|
---|
| 59 | {
|
---|
| 60 | for (var i = 0; i < repro_list.size; i++)
|
---|
| 61 | {
|
---|
| 62 | var parent = Populations[0].get(repro_list[i]);
|
---|
| 63 |
|
---|
| 64 | if (parent.user2["gen"] == 1)
|
---|
| 65 | {
|
---|
| 66 |
|
---|
| 67 | var number = parent.user2["Va"] / ExpParams.ofnumh;
|
---|
| 68 |
|
---|
| 69 |
|
---|
| 70 | for (var j = 0; j < number / 2; j++)
|
---|
| 71 | {
|
---|
| 72 | var crossed = 0;
|
---|
| 73 | //crossover
|
---|
| 74 | if (Math.rnd01 < ExpParams.crossprob)
|
---|
| 75 | {
|
---|
| 76 | var tmp = parent.user1[0]["vamin"];
|
---|
| 77 | parent.user1[0]["vamin"] = parent.user1[1]["vamin"];
|
---|
| 78 | parent.user1[1]["vamin"] = tmp;
|
---|
| 79 | crossed = 1;
|
---|
| 80 | }
|
---|
| 81 |
|
---|
| 82 | for (var k = 0; k < 2; k++)
|
---|
| 83 | {
|
---|
| 84 | var rsize = parent.user1[k]["delta_h"] + ExpParams.haplo_rad;
|
---|
| 85 | var vamin = parent.user1[k]["vamin"];
|
---|
| 86 | var deltas = parent.user1[k]["delta_h"];
|
---|
| 87 |
|
---|
| 88 |
|
---|
| 89 | if (Math.rnd01 < ExpParams.mutationprob)
|
---|
| 90 | {
|
---|
| 91 | var diff = delta_change * deltas;
|
---|
| 92 | if (Math.rnd01 < 0.5)
|
---|
| 93 | {
|
---|
| 94 | deltas -= diff;
|
---|
| 95 | }
|
---|
| 96 | else
|
---|
| 97 | {
|
---|
| 98 | deltas += diff;
|
---|
| 99 | }
|
---|
| 100 | rsize = ExpParams.diplo_rad + deltas;
|
---|
| 101 | }
|
---|
| 102 |
|
---|
| 103 | var geno = "//0\np:sh=1,sx=" + rsize + ",sy=" + rsize + ",sz=" + rsize + ", rz=3.14159265358979";
|
---|
| 104 | geno += "\nn:p=0,d=\"S\""; //TODO is this the only difference with haploid code? TODO why initial genotypes are not used as defined in ExpParams?
|
---|
| 105 | var cr = Populations[0].add(geno);
|
---|
| 106 | cr.energ0 = ExpParams.ofnumh;
|
---|
| 107 | cr.energy = cr.energ0;
|
---|
| 108 | //vamin depends on rsize
|
---|
| 109 | var hsize = ExpParams.haplo_rad * ExpParams.delta_rate + ExpParams.haplo_rad;
|
---|
| 110 | cr.user1 = {"vamin" : (rsize / hsize) * ExpParams.v_min_h, "amin": ExpParams.age_min_d, "delta_h" : deltas, "delta_d" : parent.user1[0]["delta_d"]};
|
---|
| 111 | cr.user2 = { "Va" : cr.energ0, "gen" : 0 , "growth_step" : ExpParams.growth_step, "rsize" : rsize, "vinit": cr.energ0};
|
---|
| 112 | placeRandomlyNotColliding(cr);
|
---|
| 113 | }
|
---|
| 114 |
|
---|
| 115 | //reverse of crossover for fossilization
|
---|
| 116 | if (crossed == 1)
|
---|
| 117 | {
|
---|
| 118 | var tmp = parent.user1[0]["vamin"];
|
---|
| 119 | parent.user1[0]["vamin"] = parent.user1[1]["vamin"];
|
---|
| 120 | parent.user1[1]["vamin"] = tmp;
|
---|
| 121 | crossed = 0;
|
---|
| 122 | }
|
---|
| 123 |
|
---|
| 124 | }
|
---|
| 125 | }
|
---|
| 126 | }
|
---|
| 127 | for (var j = 0; j < repro_list.size; j++)
|
---|
| 128 | {
|
---|
| 129 | Populations[0].kill(repro_list[j]);
|
---|
| 130 | }
|
---|
| 131 | }
|
---|
| 132 |
|
---|
| 133 |
|
---|
| 134 | function onStep()
|
---|
| 135 | {
|
---|
| 136 | var haploids = 0;
|
---|
| 137 | var diploids = 0;
|
---|
| 138 | var e_inc_h = 0.0;
|
---|
| 139 | var e_inc_d = 0.0;
|
---|
| 140 | var e_nut = 0.0;
|
---|
| 141 | var size_h = 0.0;
|
---|
| 142 | var size_d = 0.0;
|
---|
| 143 | var vmin_h = 0.0;
|
---|
| 144 | var vmin_d = 0.0;
|
---|
| 145 |
|
---|
| 146 | for (var i = 0; i < Populations[0].size; i++)
|
---|
| 147 | {
|
---|
| 148 | var cr = Populations[0].get(i);
|
---|
| 149 | if (cr.user2["gen"] == 0)
|
---|
| 150 | {
|
---|
| 151 | haploids += 1;
|
---|
| 152 | e_inc_h += cr.energy;
|
---|
| 153 | size_h += cr.user1["delta_h"] + ExpParams.haplo_rad;
|
---|
| 154 | vmin_h += cr.user1["vamin"];
|
---|
| 155 | }
|
---|
| 156 | else if (cr.user2["gen"] == 1)
|
---|
| 157 | {
|
---|
| 158 | diploids += 1;
|
---|
| 159 | e_inc_d += cr.energy;
|
---|
| 160 | size_d += cr.user1[0]["delta_d"] + ExpParams.diplo_rad;
|
---|
| 161 | vmin_d += cr.user1[0]["vamin"];
|
---|
| 162 | }
|
---|
| 163 | }
|
---|
| 164 |
|
---|
| 165 | for (var i = 0; i < Populations[1].size; i++)
|
---|
| 166 | {
|
---|
| 167 | var cr = Populations[1].get(i);
|
---|
| 168 | e_nut += cr.energy;
|
---|
| 169 | }
|
---|
| 170 |
|
---|
| 171 | if (haploids < 2 && diploids == 0)
|
---|
| 172 | {
|
---|
| 173 | Simulator.print("no more creatures, stopped.");
|
---|
| 174 | Simulator.stop();
|
---|
| 175 | }
|
---|
| 176 |
|
---|
| 177 | var l1 = [haploids, diploids, Populations[1].size];
|
---|
| 178 | var l2 = [e_inc_h, e_inc_d, e_nut];
|
---|
| 179 | var dp = diploids;
|
---|
| 180 | var hp = haploids;
|
---|
| 181 | if (dp == 0) dp = 0.000001;
|
---|
| 182 | if (hp == 0) hp = 0.000001;
|
---|
| 183 | var l3 = [size_h / hp, vmin_h / hp, size_d / dp, vmin_d / dp];
|
---|
| 184 |
|
---|
| 185 | if (ExpParams.logging == 1)
|
---|
| 186 | {
|
---|
| 187 | log(l1, "log.txt");
|
---|
| 188 | log(l2, "log2.txt");
|
---|
| 189 | log(l3, "log3.txt");
|
---|
| 190 | }
|
---|
| 191 | //food growth ---------------------------------------------
|
---|
| 192 | foodenergywaiting = foodenergywaiting + ExpParams.feedrate;
|
---|
| 193 | if (foodenergywaiting > ExpParams.feede0)
|
---|
| 194 | {
|
---|
| 195 | for (var i = 0; i < ExpParams.foodPop; i++)
|
---|
| 196 | {
|
---|
| 197 | addfood();
|
---|
| 198 | }
|
---|
| 199 |
|
---|
| 200 | foodenergywaiting = 0.0;
|
---|
| 201 | Simulator.checkpoint();
|
---|
| 202 | }
|
---|
| 203 |
|
---|
| 204 | //reproduction --------------------------------------------
|
---|
| 205 | reprocounter += 1;
|
---|
| 206 | if (reprocounter > ExpParams.repro_time)
|
---|
| 207 | {
|
---|
| 208 | reprocounter = 0;
|
---|
| 209 | var to_repro_h = [];
|
---|
| 210 | var to_repro_d = [];
|
---|
| 211 | for (var i = 0; i < Populations[0].size; i++)
|
---|
| 212 | {
|
---|
| 213 | var cr = Populations[0].get(i);
|
---|
| 214 | if (cr.signals.size > 0)
|
---|
| 215 | {
|
---|
| 216 | if (cr.user2["gen"] == 0)
|
---|
| 217 | {
|
---|
| 218 | to_repro_h.add(i);
|
---|
| 219 | }
|
---|
| 220 | else if (cr.user2["gen"] == 1)
|
---|
| 221 | {
|
---|
| 222 | to_repro_d.add(i);
|
---|
| 223 | }
|
---|
| 224 | }
|
---|
| 225 | }
|
---|
| 226 | if (to_repro_h.size > 1)
|
---|
| 227 | {
|
---|
| 228 | reproduce_haploid(to_repro_h, ExpParams.ofnumh);
|
---|
| 229 | }
|
---|
| 230 | if (to_repro_d.size > 0)
|
---|
| 231 | {
|
---|
| 232 | reproduce_diploid(to_repro_d, ExpParams.ofnumd);
|
---|
| 233 | }
|
---|
| 234 | }
|
---|
| 235 |
|
---|
| 236 | //check for death -----------------------------------------------
|
---|
| 237 | if (Populations[0].size == 0)
|
---|
| 238 | {
|
---|
| 239 | if (ExpParams.autorestart)
|
---|
| 240 | {
|
---|
| 241 | Simulator.print("no more creatures, restarting...");
|
---|
| 242 | onExpInit();
|
---|
| 243 | }
|
---|
| 244 | else
|
---|
| 245 | {
|
---|
| 246 | Simulator.print("no more creatures, stopped.");
|
---|
| 247 | Simulator.stop();
|
---|
| 248 | }
|
---|
| 249 | }
|
---|
| 250 | }
|
---|
| 251 |
|
---|
| 252 | // -------------------------------- step end --------------------------------
|
---|