[Avida-SVN] r2878 - in branches/movement/source: actions cpu main
grabow38 at myxo.css.msu.edu
grabow38 at myxo.css.msu.edu
Fri Oct 24 10:59:38 PDT 2008
Author: grabow38
Date: 2008-10-24 13:59:37 -0400 (Fri, 24 Oct 2008)
New Revision: 2878
Modified:
branches/movement/source/actions/PopulationActions.cc
branches/movement/source/cpu/cHardwareCPU.cc
branches/movement/source/main/cPopulation.cc
branches/movement/source/main/cPopulation.h
branches/movement/source/main/cStats.cc
Log:
Adding code to compete demes based on resource consumption.
Modified: branches/movement/source/actions/PopulationActions.cc
===================================================================
--- branches/movement/source/actions/PopulationActions.cc 2008-10-24 15:51:53 UTC (rev 2877)
+++ branches/movement/source/actions/PopulationActions.cc 2008-10-24 17:59:37 UTC (rev 2878)
@@ -1692,6 +1692,35 @@
}
};
+// @ LMG
+// Compete demes based on how much resource has been consumed within the deme
+class cAbstractCompeteDemes_ConsumeCellResources : public cAbstractCompeteDemes {
+ public:
+ cAbstractCompeteDemes_ConsumeCellResources(cWorld* world, const cString& args) : cAbstractCompeteDemes(world, args) { }
+
+ static const cString GetDescription() { return "No Arguments"; }
+
+ double Fitness(const cDeme& deme) {
+
+ cResourceCount res = deme.GetDemeResourceCount();
+ double current_res;// Current total resource in deme
+ double initial_res;// Initial total resource in deme
+
+ for(int i = 0; i < res.GetSize(); i++) {
+ if( (res.GetResourcesGeometry())[i] != nGeometry::GLOBAL) {
+ cSpatialResCount sp_res = res.GetSpatialResource(i);
+ current_res += sp_res.GetAmount(i);
+ initial_res += res.GetInitialResourceValue(i);
+ }
+ }
+
+ // Fitness is square of how much resource has been consumed
+ double fitnessOfDeme = pow( (initial_res - current_res), 2.0);
+
+ return fitnessOfDeme;
+ }
+};
+
/* This Action will check if any demes have met the critera to be replicated
and do so. There are several bases this can be checked on:
@@ -2390,8 +2419,9 @@
action_lib->Register<cAbstractCompeteDemes_AttackKillAndEnergyConserve>("CompeteDemes_AttackKillAndEnergyConserve");
action_lib->Register<cAssignRandomCellData>("AssignRandomCellData");
action_lib->Register<cActionIteratedConsensus>("IteratedConsensus");
- action_lib->Register<cActionSynchronization>("Synchronization");
- action_lib->Register<cActionDesynchronization>("Desynchronization");
+ action_lib->Register<cAbstractCompeteDemes_ConsumeCellResources>("CompeteDemes_ConsumeCellResources"); // @ LMG
+ action_lib->Register<cActionSynchronization>("Synchronization");
+ action_lib->Register<cActionDesynchronization>("Desynchronization");
action_lib->Register<cActionNewTrial>("NewTrial");
action_lib->Register<cActionCompeteOrganisms>("CompeteOrganisms");
Modified: branches/movement/source/cpu/cHardwareCPU.cc
===================================================================
--- branches/movement/source/cpu/cHardwareCPU.cc 2008-10-24 15:51:53 UTC (rev 2877)
+++ branches/movement/source/cpu/cHardwareCPU.cc 2008-10-24 17:59:37 UTC (rev 2878)
@@ -778,12 +778,12 @@
// NOTE: Organism may be dead now if instruction executed killed it (such as some divides, "die", or "kazi")
-#if INSTRUCTION_COUNT
+//#if INSTRUCTION_COUNT
// Decrement if the instruction was not executed successfully.
if (exec_success == false) {
organism->GetPhenotype().DecCurInstCount(actual_inst.GetOp());
}
-#endif
+//#endif
return exec_success;
}
Modified: branches/movement/source/main/cPopulation.cc
===================================================================
--- branches/movement/source/main/cPopulation.cc 2008-10-24 15:51:53 UTC (rev 2877)
+++ branches/movement/source/main/cPopulation.cc 2008-10-24 17:59:37 UTC (rev 2878)
@@ -982,24 +982,24 @@
void cPopulation::CompeteDemes(int competition_type)
{
const int num_demes = deme_array.GetSize();
-
- double total_fitness = 0;
- tArray<double> deme_fitness(num_demes);
-
+
+ double total_fitness = 0;
+ tArray<double> deme_fitness(num_demes);
+
switch(competition_type) {
- case 0: // deme fitness = 1;
+ case 0: // deme fitness = 1;
total_fitness = (double) num_demes;
- deme_fitness.SetAll(1);
- break;
- case 1: // deme fitness = number of births
- // Determine the scale for fitness by totaling births across demes.
+ deme_fitness.SetAll(1);
+ break;
+ case 1: // deme fitness = number of births
+ // Determine the scale for fitness by totaling births across demes.
for (int deme_id = 0; deme_id < num_demes; deme_id++) {
double cur_fitness = (double) deme_array[deme_id].GetBirthCount();
deme_fitness[deme_id] = cur_fitness;
total_fitness += cur_fitness;
}
- break;
- case 2: // deme fitness = average organism fitness at the current update
+ break;
+ case 2: // deme fitness = average organism fitness at the current update
for (int deme_id = 0; deme_id < num_demes; deme_id++) {
cDoubleSum single_deme_fitness;
const cDeme & cur_deme = deme_array[deme_id];
@@ -1009,12 +1009,12 @@
cPhenotype & phenotype =
GetCell(cur_cell).GetOrganism()->GetPhenotype();
single_deme_fitness.Add(phenotype.GetFitness());
- }
+ }
deme_fitness[deme_id] = single_deme_fitness.Ave();
total_fitness += deme_fitness[deme_id];
}
- break;
- case 3: // deme fitness = average mutation rate at the current update
+ break;
+ case 3: // deme fitness = average mutation rate at the current update
for (int deme_id = 0; deme_id < num_demes; deme_id++) {
cDoubleSum single_deme_div_type;
const cDeme & cur_deme = deme_array[deme_id];
@@ -1029,10 +1029,10 @@
deme_fitness[deme_id] = single_deme_div_type.Ave();
total_fitness += deme_fitness[deme_id];
}
- break;
- case 4: // deme fitness = 2^(-deme fitness rank)
- // first find all the deme fitness values ...
- {
+ break;
+ case 4: // deme fitness = 2^(-deme fitness rank)
+ // first find all the deme fitness values ...
+ {
for (int deme_id = 0; deme_id < num_demes; deme_id++) {
cDoubleSum single_deme_fitness;
const cDeme & cur_deme = deme_array[deme_id];
@@ -1041,30 +1041,30 @@
if (cell_array[cur_cell].IsOccupied() == false) continue;
cPhenotype & phenotype = GetCell(cur_cell).GetOrganism()->GetPhenotype();
single_deme_fitness.Add(phenotype.GetFitness());
- }
+ }
deme_fitness[deme_id] = single_deme_fitness.Ave();
}
- // ... then determine the rank of each deme based on its fitness
+ // ... then determine the rank of each deme based on its fitness
tArray<double> deme_rank(num_demes);
deme_rank.SetAll(1);
for (int deme_id = 0; deme_id < num_demes; deme_id++) {
for (int test_deme = 0; test_deme < num_demes; test_deme++) {
if (deme_fitness[deme_id] < deme_fitness[test_deme]) {
deme_rank[deme_id]++;
- }
- }
- }
- // ... finally, make deme fitness 2^(-deme rank)
- deme_fitness.SetAll(1);
+ }
+ }
+ }
+ // ... finally, make deme fitness 2^(-deme rank)
+ deme_fitness.SetAll(1);
for (int deme_id = 0; deme_id < num_demes; deme_id++) {
- for (int i = 0; i < deme_rank[deme_id]; i++) {
+ for (int i = 0; i < deme_rank[deme_id]; i++) {
deme_fitness[deme_id] = deme_fitness[deme_id]/2;
- }
- total_fitness += deme_fitness[deme_id];
- }
+ }
+ total_fitness += deme_fitness[deme_id];
+ }
}
- break;
- case 5: // deme fitness = average organism life fitness at the current update
+ break;
+case 5: // deme fitness = average organism life fitness at the current update
for (int deme_id = 0; deme_id < num_demes; deme_id++) {
cDoubleSum single_deme_life_fitness;
const cDeme & cur_deme = deme_array[deme_id];
@@ -1077,9 +1077,9 @@
deme_fitness[deme_id] = single_deme_life_fitness.Ave();
total_fitness += deme_fitness[deme_id];
}
- break;
- case 6: // deme fitness = 2^(-deme life fitness rank) (same as 4, but with life fitness)
- // first find all the deme fitness values ...
+ break;
+ case 6: // deme fitness = 2^(-deme life fitness rank) (same as 4, but with life fitness)
+ // first find all the deme fitness values ...
{
for (int deme_id = 0; deme_id < num_demes; deme_id++) {
cDoubleSum single_deme_life_fitness;
@@ -1092,7 +1092,7 @@
}
deme_fitness[deme_id] = single_deme_life_fitness.Ave();
}
- // ... then determine the rank of each deme based on its fitness
+ // ... then determine the rank of each deme based on its fitness
tArray<double> deme_rank(num_demes);
deme_rank.SetAll(1);
for (int deme_id = 0; deme_id < num_demes; deme_id++) {
@@ -1102,7 +1102,7 @@
}
}
}
- // ... finally, make deme fitness 2^(-deme rank)
+ // ... finally, make deme fitness 2^(-deme rank)
deme_fitness.SetAll(1);
for (int deme_id = 0; deme_id < num_demes; deme_id++) {
for (int i = 0; i < deme_rank[deme_id]; i++) {
@@ -1111,9 +1111,10 @@
total_fitness += deme_fitness[deme_id];
}
}
- break;
- }
-
+ break;
+
+ }
+
// Pick which demes should be in the next generation.
tArray<int> new_demes(num_demes);
for (int i = 0; i < num_demes; i++) {
@@ -1166,6 +1167,7 @@
// But, use of InjectClone messes that up, breaking consistency. So the next
// time that someone comes in here looking to refactor, consider fixing this.
+
// Do the actual copy!
for (int i = 0; i < from_deme.GetSize(); i++) {
int from_cell_id = from_deme.GetCellID(i);
@@ -2914,6 +2916,7 @@
cSpatialResCount sp_res = res.GetSpatialResource(i);
int gridsize = sp_res.GetSize();
+
int xsize = m_world->GetConfig().WORLD_X.Get();
for (int j = 0; j < gridsize; j++) {
Modified: branches/movement/source/main/cPopulation.h
===================================================================
--- branches/movement/source/main/cPopulation.h 2008-10-24 15:51:53 UTC (rev 2877)
+++ branches/movement/source/main/cPopulation.h 2008-10-24 17:59:37 UTC (rev 2878)
@@ -321,6 +321,7 @@
// @WRE: Make a method to provide "tumble" capability 08-Aug-2008
void Tumble(cOrganism* organism);
+
};
Modified: branches/movement/source/main/cStats.cc
===================================================================
--- branches/movement/source/main/cStats.cc 2008-10-24 15:51:53 UTC (rev 2877)
+++ branches/movement/source/main/cStats.cc 2008-10-24 17:59:37 UTC (rev 2878)
@@ -1129,7 +1129,7 @@
}
#else // INSTRUCTION_COUNT undefined
m_world->GetDriver().RaiseException("Warning: Instruction Counts not compiled in");
-#endif // ifdef INSTRUCTION_COUNT
+ #endif // ifdef INSTRUCTION_COUNT
df.Endl();
}
More information about the Avida-cvs
mailing list