Actual Changes


We changed:
genome.crossover(GA2DArrayGenome::OnePointCrossover);
to:
genome.crossover(CrossoverHotSpots);
in main() so that the GA will call our Crossover function, which is below.


We grabbed the following code from the system library and changed it so that it will only crossover on the y-axis. In YELLOW.

// This crossover does clipping (no padding) for resizables.  Notice that this
// means that any resizable children of two parents will have identical 
// dimensions no matter what.
int CrossoverHotSpots(const GAGenome& p1, const GAGenome& p2,
                  GAGenome* c1, GAGenome* c2){
  GA2DArrayGenome<int> &mom=(GA2DArrayGenome<int> &)p1;
  GA2DArrayGenome<int> &dad=(GA2DArrayGenome<int> &)p2;
  
  int nc=0;
  unsigned int momsitex, momlenx, momsitey, momleny;
  unsigned int dadsitex, dadlenx, dadsitey, dadleny;
  unsigned int sitex, lenx, sitey, leny;

  if(c1 && c2){
    GA2DArrayGenome<int> &sis=(GA2DArrayGenome<int> &)*c1;
    GA2DArrayGenome<int> &bro=(GA2DArrayGenome<int> &)*c2;

    if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE &&
       bro.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){
      if(mom.width() != dad.width() || 
         sis.width() != bro.width() || 
         sis.width() != mom.width()){
        GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd);
        return nc;
      }
      sitex = momsitex = dadsitex = GARandomInt(0, mom.width());
      lenx = momlenx = dadlenx = mom.width() - momsitex;
    }
    else if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE ||
            bro.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){
      GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd);
      return nc;
    }
    else{
      momsitex = GARandomInt(0, mom.width());
      dadsitex = GARandomInt(0, dad.width());
      momlenx = mom.width() - momsitex;
      dadlenx = dad.width() - dadsitex;
      sitex = GAMin(momsitex, dadsitex);
      lenx = GAMin(momlenx, dadlenx);
    }

    if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE &&
       bro.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){
      if(mom.height() != dad.height() || 
         sis.height() != bro.height() || 
         sis.height() != mom.height()){
        GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd);
        return nc;
      }
      /*      sitey = momsitey = dadsitey = GARandomInt(0, mom.height());*/
      sitey = momsitey = dadsitey = 0;
      //cout << "crossing at" << sitex << "," << sitey << "\n";
      leny = momleny = dadleny = mom.height() - momsitey;
    }
    else if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE ||
            bro.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){
      GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd);
      return nc;
    }
    else{
      momsitey = GARandomInt(0, mom.height());
      dadsitey = GARandomInt(0, dad.height());
      momleny = mom.height() - momsitey;
      dadleny = dad.height() - dadsitey;
      sitey = GAMin(momsitey, dadsitey);
      leny = GAMin(momleny, dadleny);
    }

    sis.resize(sitex+lenx, sitey+leny);
    bro.resize(sitex+lenx, sitey+leny);
    
    sis.copy(mom, 0, 0, momsitex-sitex, momsitey-sitey, sitex, sitey);
    sis.copy(dad, sitex, 0, dadsitex, dadsitey-sitey, lenx, sitey);
    sis.copy(dad, 0, sitey, dadsitex-sitex, dadsitey, sitex, leny);
    sis.copy(mom, sitex, sitey, momsitex, momsitey, lenx, leny);
    
    bro.copy(dad, 0, 0, dadsitex-sitex, dadsitey-sitey, sitex, sitey);
    bro.copy(mom, sitex, 0, momsitex, momsitey-sitey, lenx, sitey);
    bro.copy(mom, 0, sitey, momsitex-sitex, momsitey, sitex, leny);
    bro.copy(dad, sitex, sitey, dadsitex, dadsitey, lenx, leny);

    nc = 2;
    //cout << "crossover pt. (" << sitex << "," <<sitey <<")\n";
    //cout << "MOM\n" << mom ;
    //cout << "\n\nDAD\n"<<  dad ;
    //cout << "\n\nSIS\n" << sis;
    //cout << "\n\nBRO\n" << bro  <<"\n--------------------\n\n";
  }
  else if(c1){
    GA2DArrayGenome<int> &sis=(GA2DArrayGenome<int> &)*c1;
    
    if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){
      if(mom.width() != dad.width() || sis.width() != mom.width()){
        GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd);
        return nc;
      }
      sitex = momsitex = dadsitex = GARandomInt(0, mom.width());
      lenx = momlenx = dadlenx = mom.width() - momsitex;
    }
    else{
      momsitex = GARandomInt(0, mom.width());
      dadsitex = GARandomInt(0, dad.width());
      momlenx = mom.width() - momsitex;
      dadlenx = dad.width() - dadsitex;
      sitex = GAMin(momsitex, dadsitex);
      lenx = GAMin(momlenx, dadlenx);
    }
    
    if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){
      if(mom.height() != dad.height() || sis.height() != mom.height()){
        GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd);
        return nc;
      }
      sitey = momsitey = dadsitey = GARandomInt(0, mom.height());
      leny = momleny = dadleny = mom.height() - momsitey;
    }
    else{
      momsitey = GARandomInt(0, mom.height());
      dadsitey = GARandomInt(0, dad.height());
      momleny = mom.height() - momsitey;
      dadleny = dad.height() - dadsitey;
      sitey = GAMin(momsitey, dadsitey);
      leny = GAMin(momleny, dadleny);
    }
    
    sis.resize(sitex+lenx, sitey+leny);
    
    if(GARandomBit()){
      sis.copy(mom, 0, 0, momsitex-sitex, momsitey-sitey, sitex, sitey);
      sis.copy(dad, sitex, 0, dadsitex, dadsitey-sitey, lenx, sitey);
      sis.copy(dad, 0, sitey, dadsitex-sitex, dadsitey, sitex, leny);
      sis.copy(mom, sitex, sitey, momsitex, momsitey, lenx, leny);
    }
    else{
      sis.copy(dad, 0, 0, dadsitex-sitex, dadsitey-sitey, sitex, sitey);
      sis.copy(mom, sitex, 0, momsitex, momsitey-sitey, lenx, sitey);
      sis.copy(mom, 0, sitey, momsitex-sitex, momsitey, sitex, leny);
      sis.copy(dad, sitex, sitey, dadsitex, dadsitey, lenx, leny);
    }

    nc = 1;
  }
  
  return nc;
}