- Timestamp:
- 09/08/15 01:03:24 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
experiments/frams/foraminifera/data/scripts/foraminifera.expdef
r429 r430 13 13 max_energy_level - maximum energy level reached so far 14 14 gen - generation: 0 haploid, 1 diploid 15 species - species: 0 not hibernating 1hibernating15 species - species: 0 hibernating 1 not hibernating 16 16 hibernated - 0/1 foram isn't/is hibernated 17 17 reproduce - 0/1 foram isn't/is ready for reproduction … … 35 35 global o; 36 36 global max_chamber_energ; 37 37 global dir_change; 38 38 39 39 @include "foraminifera.inc" … … 69 69 //pop.othermask = 0x10002; 70 70 71 //ExpParams.showRet = 1; //uncomment to show reticulopodia 72 73 pop = Populations.addGroup("Reticulopodia"); 74 pop.nnsim = 0; 75 pop.enableperf = 0; 76 pop.death = 0; 77 pop.energy = 0; 78 pop.selfmask = 0x20002; 79 pop.othermask = 0x10000; 80 71 81 //world 72 82 SignalView.mode = 1; 73 ExpParams.world_size = 100;74 World.wrldwat = ExpParams.world_size;83 ExpParams.world_size = scale(40000); 84 World.wrldwat = 200; 75 85 World.wrldsiz = ExpParams.world_size; 76 86 World.wrldbnd = 1; … … 82 92 83 93 //reproduction 84 ExpParams.foramPop = 3;94 ExpParams.foramPop = 10; 85 95 ExpParams.crossprob = 0.4; 86 96 ExpParams.mutationprob = 0.2; … … 89 99 90 100 //morphology 101 dir_change = 500; 102 ExpParams.zone1_range = scale(5000); 103 ExpParams.zone2_range = scale(8000); 91 104 init_chambers(); 92 ExpParams.chamber_proculus_haplo = scale( 60);105 ExpParams.chamber_proculus_haplo = scale(50); 93 106 ExpParams.chamber_difference_haplo = 0.0; 94 107 ExpParams.chamber_proculus_diplo = scale(20); … … 100 113 { 101 114 max_chamber_energ[j].add(((Math.pow(getProperty(j, "chamber_proculus"),3) + Math.pow(getProperty(j, "chamber_proculus") + (i) * getProperty(j, "chamber_difference"),3))*(i+1))/2); 102 103 115 } 104 116 } 105 ExpParams.zone1_range = scale(250);106 ExpParams.zone2_range = scale(5000);107 117 108 118 //energetics 109 ExpParams.min_repro_energ_haplo = max_chamber_energ[0][2]; 110 ExpParams.min_repro_energ_diplo = max_chamber_energ[1][8]; 111 ExpParams.e_meta = 0.00003 * max_chamber_energ[0][0]; 112 ExpParams.energy_hib = 0.00003 * max_chamber_energ[0][0]; 113 ExpParams.energy_move = 0.0003 * max_chamber_energ[0][0]; 114 ExpParams.energies0_haplo = max_chamber_energ[0][0] - 0.1*max_chamber_energ[0][0]; 115 ExpParams.energies0_diplo = max_chamber_energ[1][0] - 0.1*max_chamber_energ[1][0]; 116 ExpParams.feedtrans = 0.05; 117 ExpParams.e_repro_cost_haplo = 0.5; 119 ExpParams.min_repro_energ_haplo = 4; 120 ExpParams.min_repro_energ_diplo = 6; 121 122 ExpParams.e_meta = 0.0002; 123 ExpParams.energy_hib = 0.0001; 124 ExpParams.energy_move = 0.00025; 125 126 ExpParams.energies0_haplo = max_chamber_energ[0][0] - 0.001*max_chamber_energ[0][0]; 127 ExpParams.energies0_diplo = max_chamber_energ[1][0] - 0.001*max_chamber_energ[1][0]; 128 ExpParams.feedtrans = 0.5; 129 ExpParams.e_repro_cost_haplo = 0.7; 118 130 ExpParams.e_repro_cost_diplo = 0.3; 119 131 … … 121 133 ExpParams.nutrientsize = scale(10); 122 134 ExpParams.energy_nut = 100 * Math.pow(ExpParams.nutrientsize, 3); 123 ExpParams.nutrientPop = 1 0;124 ExpParams.feedrate = 0. 0025;135 ExpParams.nutrientPop = 1; 136 ExpParams.feedrate = 0.1; 125 137 nutrientenergywaiting = ExpParams.energy_nut; 126 138 ExpState.totaltestedcr = 0; … … 157 169 Populations[0].clear(); 158 170 Populations[1].clear(); 171 Populations[2].clear(); 159 172 160 173 for (var i = 0; i < ExpParams.foramPop; i++) … … 223 236 ExpState.nutrient = tmpvec; 224 237 File.writeObject(sim_params.*); 225 ExpState.nutrient = null; //vectors are only created for saving and then discarded 238 ExpState.nutrient = null; //vectors are only created for saving and then discardedsetForam 226 239 227 240 for (var cr in Populations[0]) … … 233 246 // -------------------------------- foram begin ----------------------------------- 234 247 248 function setForamMeta(cr, gen) 249 { 250 cr.idleen = ExpParams.e_meta * max_chamber_energ[gen][Math.min(lastChamberNum(cr), max_chamber_energ[gen].size-1)]; 251 } 252 253 function lastChamberNum(cr) 254 { 255 return cr.numparts-1; 256 } 257 235 258 function onForamsBorn(cr) 236 259 { 237 cr.idleen = ExpParams.e_meta; 260 setForamMeta(cr, 1); 261 if (ExpParams.showRet == 1) 262 { 263 var ret = Populations[2].add("//0\np:sh=3,sx=0.01,sy="+ExpParams.zone1_range+",sz="+ExpParams.zone1_range+",ry=1.57"); 264 cr.user3 = ret; 265 } 238 266 } 239 267 … … 253 281 function foramGrow(cr, chamber_num) 254 282 { 255 var geno = createForamGenotype(cr.user2["gen"], cr.user2["species"], chamber_num );283 var geno = createForamGenotype(cr.user2["gen"], cr.user2["species"], chamber_num+1); 256 284 var cr2 = Populations[0].add(geno); 257 285 … … 261 289 setGenotype({"cr" : cr2, "parent_user1" : cr.user1, "parent_user2" : cr.user2, "opt" : 2}); 262 290 cr2.moveAbs(cr.center_x - cr2.size_x / 2, cr.center_y - cr2.size_y / 2, cr.pos_z); 263 291 setForamMeta(cr2, cr2.user2["gen"]); 292 293 if (ExpParams.showRet == 1) 294 { 295 Populations[2].delete(cr.user3); 296 } 264 297 Populations[0].delete(cr); 265 298 } … … 279 312 var mindist = 100000000000; 280 313 var mindistvec = null; 314 var eating = 0; 281 315 282 316 for (i = 0; i < n.size; i++) 283 317 { 284 mp = n[i].value ;318 mp = n[i].value.getMechPart(0); 285 319 distvec.set(mp.pos); 286 320 distvec.sub(p.pos); 287 321 dist = distvec.length; 288 if (dist < mindist) 322 if (dist < ExpParams.zone1_range) 323 { 324 if (n[i].value != null) 325 { 326 energyTransfer(cr, n[i].value); 327 eating = 1; 328 } 329 } 330 else if (eating == 0 && cr.user2["hibernated"] == 0 && dist < mindist) 289 331 { 290 332 mindist = dist; … … 293 335 } 294 336 295 mindistvec.normalize(); 296 mindistvec.scale(-0.08); 297 cr.localDrive = mindistvec; 337 if (!eating && cr.user2["hibernated"] == 0) 338 { 339 mindistvec.normalize(); 340 mindistvec.scale(-0.08); 341 cr.localDrive = mindistvec; 342 moveEnergyDec(cr); 343 } 344 298 345 return 1; 299 346 } … … 305 352 function moveEnergyDec(cr) 306 353 { 307 if (cr.user2["hibernated"] == 1) 308 { 309 cr.energy_m += ExpParams.energy_hib; 310 } 311 else 312 { 313 cr.energy_m += ExpParams.energy_move; 354 if (cr.user2["hibernated"] == 0) 355 { 356 cr.energy_m += ExpParams.energy_move * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)]; 314 357 } 315 358 } … … 320 363 321 364 //adjustment in z axis 322 cr.moveAbs(cr.pos_x, cr.pos_y, 0.5); 323 324 //are there any nutrients in zone 1? 325 if (cr.boundingBoxCollisions() == 2) 326 { 327 if (cr.user2["hibernated"] == 1) 328 cr.user2["hibernated"] = 0; 329 return; 330 } 331 332 else if (cr.user2["hibernated"] == 1) 333 { 334 moveEnergyDec(cr); 335 return; 336 } 337 338 //are there any nutrients in zone 2? 339 else 365 cr.moveAbs(cr.pos_x, cr.pos_y, 0); 366 367 //are there any nutrients in zone 1 or 2? 340 368 { 341 369 var moved = stepToNearest(ExpParams.zone2_range); //TODO weighted sum of distance and energy 342 370 if (moved==1) 343 { 344 moveEnergyDec(cr); 371 { 345 372 return; 346 373 } … … 348 375 349 376 //no nutrients in zone 2 350 351 377 var hibernation = 0; 352 378 if (cr.user2["gen"] == 0) hibernation = cr.user1["hibernation"]; … … 355 381 if (hibernation == 1) 356 382 { 383 reverseHib(cr); 384 cr.localDrive = XYZ.new(0,0,0); 385 } 386 //random move 387 else if (cr.lifespan%dir_change == 0) 388 { 389 var dir = (Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), 0);//(0.1 * Math.rnd01, 0.1 * Math.rnd01, 0); 390 dir.normalize(); 391 dir.scale(-0.08); 392 cr.localDrive = dir; 357 393 moveEnergyDec(cr); 358 cr.user2["hibernated"] = 1; 359 cr.localDrive = XYZ.new(0,0,0); 360 } 361 //random move 394 } 395 } 396 397 function energyTransfer(cr1, cr2) 398 { 399 cr1.localDrive = XYZ.new(0,0,0); 400 var e = cr2.getPart(0).ing * ExpParams.feedtrans; //TODO efficiency dependent on age 401 e = Math.min(cr2.energy, e) + 0.0000001; 402 //Simulator.print("transferring "+e+" to "+cr1.name+" from "+cr2.name+" ("+cr2.energy+")"); 403 cr2.energy_m = cr2.energy_m + e; 404 cr1.energy_p = cr1.energy_p + e; 405 if (cr1.user2["hibernated"] == 1) 406 { 407 reverseHib(cr1); 408 } 409 } 410 411 function reverseHib(cr) 412 { 413 if (cr.user2["hibernated"] == 1) 414 { 415 setForamMeta(cr, cr.user2["gen"]); //unhibernate 416 } 362 417 else 363 418 { 364 cr.localDrive = (0.1 * Math.rnd01, 0.1 * Math.rnd01, 0); 365 moveEnergyDec(cr); 366 } 367 } 368 369 function onForamsCollision() 370 { 371 if (Collision.Creature1.user2 != null) 372 { 373 Collision.Creature1.localDrive = XYZ.new(0,0,0); 374 var e = Collision.Part2.ing * ExpParams.feedtrans; //TODO efficiency dependent on age 375 //Simulator.print("transferring "+e+" to "+Collision.Creature1.name+" from "+Collision.Creature2.name+" ("+Collision.Creature2.energy+")"); 376 Collision.Creature2.energy_m = Collision.Creature2.energy_m + e; 377 Collision.Creature1.energy_p = Collision.Creature1.energy_p + e; 378 Collision.Creature1.user2["hibernated"] = 0; 379 } 419 cr.idleen = ExpParams.energy_hib * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)]; //hibernate 420 } 421 cr.user2["hibernated"] = 1 - cr.user2["hibernated"]; 380 422 } 381 423 … … 383 425 { 384 426 cr.getMechPart(0).orient.set(o); 427 if (ExpParams.showRet == 1) 428 cr.user3.moveAbs(cr.center_x-ExpParams.zone1_range, cr.center_y-ExpParams.zone1_range, cr.center_z-ExpParams.zone1_range-getProperty(cr.user2["gen"], "chamber_proculus")); 385 429 386 430 if (deathConditions(cr) == 1) … … 392 436 foramMove(cr); 393 437 438 var repro = foramReproduce(cr); 439 if (repro == 1) 440 { 441 return; 442 } 443 394 444 cr.user2["max_energy_level"] = Math.max(cr.energy, cr.user2["max_energy_level"]); 395 if ( cr.numparts <= chambers[0].size)396 { 397 if ((cr.user2["max_energy_level"] >= max_chamber_energ[cr.user2["gen"]][ cr.numparts-1]))445 if (lastChamberNum(cr) <= chambers[0].size-1) 446 { 447 if ((cr.user2["max_energy_level"] >= max_chamber_energ[cr.user2["gen"]][lastChamberNum(cr)])) 398 448 { 399 foramGrow(cr, cr.numparts); 400 return; 449 foramGrow(cr, lastChamberNum(cr)); 401 450 } 402 } 403 404 foramReproduce(cr); 451 } 405 452 } 406 453 … … 415 462 function onForamsDied(cr) 416 463 { 464 if (ExpParams.showRet == 1) 465 { 466 Populations[2].delete(cr.user3); 467 } 417 468 //fossilization 418 469 var geno = GenePools[0].add(cr.genotype); … … 429 480 function createNutrientGenotype(nutrientsize, zone1_range) 430 481 { 431 return "//0\np:sh=3,sx="+ nutrientsize+",sy="+(zone1_range + nutrientsize)+",sz="+(zone1_range+nutrientsize)+",ry=1.5,vr=0.0,1.0,0.0";482 return "//0\np:sh=3,sx="+(nutrientsize+25)+",sy="+nutrientsize+",sz="+nutrientsize+",ry=1.5,vr=0.0,1.0,0.0"; 432 483 } 433 484 … … 447 498 cr.signals.add("nutrient"); 448 499 449 cr.signals[0].value = cr .getMechPart(0);500 cr.signals[0].value = cr; 450 501 451 502 placeCreatureRandomly(cr, 0, 0); … … 503 554 } 504 555 } 556 if (Simulator.stepNumber == 150000) 557 Simulator.stop(); 505 558 } 506 559 507 560 function createStatistics() 508 561 { 509 var number_ploidy = [0, 0]; 510 var number_species = [0, 0]; 511 var e_inc = [0.0, 0.0]; 562 var number = [[0, 0],[0,0]]; // [species][gen] 563 var e_inc = [[0, 0],[0,0]]; 512 564 var e_nut = 0.0; 513 565 … … 516 568 var cr = Populations[0].get(i); 517 569 var gen = cr.user2["gen"]; 518 number_ploidy[gen] = number_ploidy[gen] + 1;519 570 var species = cr.user2["species"]; 520 number_species[species] = number_species[species] + 1; 521 e_inc[gen] = e_inc[gen] + cr.energy; 571 572 number[species][gen] = number[species][gen] + 1; 573 e_inc[species][gen] = e_inc[species][gen] + cr.energy; 522 574 } 523 575 … … 528 580 } 529 581 530 var log_numbers = [number_ploidy[0], number_ploidy[1], Populations[1].size]; 531 var log_species = [number_species[0], number_species[1]]; 532 var log_energy = [e_inc[0], e_inc[1], e_nut]; 533 534 log(log_numbers, "log_sizes.txt"); 535 log(log_species, "log_species.txt"); 536 log(log_energy, "log_energy.txt"); 582 var log_numbers = [number[0][0], number[0][1], number[1][0], number[1][1], Populations[1].size]; 583 var log_energies = [e_inc[0][0], e_inc[0][1], e_inc[1][0], e_inc[1][1], e_nut]; 584 585 log(log_numbers, "forams_log.txt"); 586 log(log_energies, "energies_log.txt"); 537 587 } 538 588 539 589 function log(tolog, fname) 540 590 { 541 var f = File.appendDirect(fname, "forams data"); 591 var f = File.appendDirect(fname, "forams data"); 542 592 f.writeString("" + Simulator.stepNumber); 543 593 for (var i = 0; i < tolog.size; i++) … … 554 604 555 605 ~ 606 607 prop: 608 id:showRet 609 name:Show reticulopodia 610 type:d 0 1 0 611 group:Foraminifera 556 612 557 613 prop: … … 734 790 id:world_size 735 791 name:World size 736 type:d 10 1000 20792 type:d 10 10000 20 737 793 group:World 738 794
Note: See TracChangeset
for help on using the changeset viewer.