Load i Save populacji 

Próbowałem zrobić własny zapis i odczyt stanu eksperymentu poprzez modyfikację „standard_loadsave.inc”, aby dotyczyło to obiektów Populations, Population i Creature – a nie GenePools, GenePool i Genotype. Było mi coś takiego potrzebne, ponieważ stosowanie pul genów i Genotype (nie będących podobiektami Creature) jest nie tylko nienaturalne (w świecie rzeczywistym genotypy są częściami istot żywych, także na etapie zarodków itp.), ale też taki schemat działania świata utrudnia swobodniejsze wyobrażanie sobie i planowanie działania światów.

Obiekty Creature zapisały się jakby dobrze (ale bez niektórych pól (!)), ale potem nie wczytały się. Poniżej są te podprogramy, ale zaczynam podejrzewać, że przyczyną tej sytuacji może być nieuwzględnienie podobiektów Creature. Czy jest może gotowa jakaś 'standardowa' metoda odczytu i zapisu Creature z wszystkimi podobiektami?

//Typical load/save handling (intended for files with *.expt extension)
global expLoadPopulationCounter, expLoadCreatureCounter; //only used when reading expt files

function onExpLoad()
{
  var i;
  for (i = 0;i  0)
    Simulator.print("Experiment loaded (" + loaded + " creatures)");
}

function loadOrSkipObject()
{
  // return 1=>obj should be loaded, 0=>skip this obj, -1=>do nothing (already handled)
  switch (Loader.objectName)
  {
  case "Population":
    expLoadPopulationCounter++;
    if (expLoadPopulationCounter >= Populations.size)
    {
      Simulator.message("onExpLoad(): too many populations in input file: expected " + Populations.size, 2);
      return 0;
    }
    else
    {
      Populations.group = expLoadPopulationCounter;
      Loader.currentObject = Population.*;
      return 1;
    }
  case "Creature":
    expLoadCreatureCounter++;
    if (expLoadCreatureCounter >= Populations.size)
    {
      Simulator.message("onExpLoad(): too many populations in input file: expected " + Populations.size, 2);
      return 0;
    }
    else
    {
      Populations.group = 0;         // ma byc tylko jedna populacja
      Populations.creature = expLoadCreatureCounter;
      Loader.currentObject = Creature.*;
      return 1;
    }
  }
  return -1;
}

function onExpLoad_Unknown()
{
  switch (Loader.objectName)
  {
  case "CreaturesGroup":
    Loader.objectName = "Population";
    Simulator.message("'CreaturesGroup' found in experiment settings file, please change to 'Population'", 1);
    if (loadOrSkipObject() == 1) //for unknown the default action is to skip, so we force load when == 1
      Loader.loadObject();
    break;

  }
}

function onExpLoad_Object()
{
  if (loadOrSkipObject() == 0) //for known object the default action is to load, so we force skip when == 0
    Loader.skipObject();
}

function onExpSave()
{
  var i;
  var zapisane = 0;

  File.writeComment("Zapis populacji 0");
  File.writeObject(sim_params.*);
  File.writeObject(Populations.*);
  Populations.group = 0;
  File.writeObject(Population.*);

  for (i=0;i<Population.size;i++)
  {
    Populations.creature = i;
    File.writeObject(Creature.*);                            
  }
  Simulator.print("Eksperyment zapisany (" + Population.size + " stworzeń)");
}
Maciej Komosinski's picture

Nie ma pełnej automatycznej serializacji obiektu Creature, ale proszę zobaczyć jak jest zrobiona serializacja w reproduction.expdef w wersji 4.0rc1 i nowszych.