📄 ga2darraygenome.c
字号:
// $Header: /usr/people/mbwall/src/galib/ga/RCS/GA2DArrayGenome.C,v 1.6 1999/03/30 02:40:00 mbwall Exp $
/* ----------------------------------------------------------------------------
array2.C
mbwall 25feb95
Copyright (c) 1995 Massachusetts Institute of Technology
all rights reserved
DESCRIPTION:
Source file for the 2D array genome.
---------------------------------------------------------------------------- */
#ifndef _ga_array2_C_
#define _ga_array2_C_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ga/garandom.h>
#include <ga/GA2DArrayGenome.h>
#include <ga/GAMask.h>
/* ----------------------------------------------------------------------------
2DArrayGenome
---------------------------------------------------------------------------- */
template <class T> const char *
GA2DArrayGenome<T>::className() const {return "GA2DArrayGenome";}
template <class T> int
GA2DArrayGenome<T>::classID() const {return GAID::ArrayGenome2D;}
template <class T>
GA2DArrayGenome<T>::
GA2DArrayGenome(unsigned int width, unsigned int height,
GAGenome::Evaluator f,
void * u) :
GAArray<T>(width*height),
GAGenome(DEFAULT_2DARRAY_INITIALIZER,
DEFAULT_2DARRAY_MUTATOR,
DEFAULT_2DARRAY_COMPARATOR)
{
evaluator(f);
userData(u);
crossover(DEFAULT_2DARRAY_CROSSOVER);
nx=minX=maxX=width; ny=minY=maxY=height;
}
template <class T>
GA2DArrayGenome<T>::
GA2DArrayGenome(const GA2DArrayGenome<T> & orig) : GAArray<T>(orig.sz){
GA2DArrayGenome<T>::copy(orig);
}
template <class T>
GA2DArrayGenome<T>::~GA2DArrayGenome() { }
template <class T> void
GA2DArrayGenome<T>::copy(const GAGenome & orig){
if(&orig == this) return;
const GA2DArrayGenome<T>* c = DYN_CAST(const GA2DArrayGenome<T>*, &orig);
if(c) {
GAGenome::copy(*c);
GAArray<T>::copy(*c);
nx = c->nx; ny = c->ny;
minX = c->minX; minY = c->minY;
maxX = c->maxX; maxY = c->maxY;
}
}
template <class T> GAGenome *
GA2DArrayGenome<T>::clone(GAGenome::CloneMethod flag) const {
GA2DArrayGenome<T> *cpy = new GA2DArrayGenome<T>(nx,ny);
if(flag == CONTENTS){
cpy->copy(*this);
}
else{
cpy->GAGenome::copy(*this);
cpy->minX = minX; cpy->minY = minY;
cpy->maxX = maxX; cpy->maxY = maxY;
}
return cpy;
}
template <class T> int
GA2DArrayGenome<T>::resize(int w, int h){
if(w == STA_CAST(int,nx) && h == STA_CAST(int,ny)) return sz;
if(w == GAGenome::ANY_SIZE)
w = GARandomInt(minX, maxX);
else if(w < 0)
w = nx; // do nothing
else if(minX == maxX)
minX=maxX = w;
else{
if(w < STA_CAST(int,minX)) w=minX;
if(w > STA_CAST(int,maxX)) w=maxX;
}
if(h == GAGenome::ANY_SIZE)
h = GARandomInt(minY, maxY);
else if(h < 0)
h = ny; // do nothing
else if(minY == maxY)
minY=maxY = h;
else{
if(h < STA_CAST(int,minY)) h=minY;
if(h > STA_CAST(int,maxY)) h=maxY;
}
if(w < STA_CAST(int,nx)){
int y=GAMin(STA_CAST(int,ny),h);
for(int j=0; j<y; j++)
move(j*w,j*nx,w);
}
GAArray<T>::size(w*h);
if(w > STA_CAST(int,nx)){ // adjust the existing chunks of bits
int y=GAMin(STA_CAST(int,ny),h);
for(int j=y-1; j>=0; j--)
GAArray<T>::move(j*w,j*nx,nx);
}
nx = w; ny = h;
_evaluated = gaFalse;
return sz;
}
#ifndef NO_STREAMS
template <class T> int
GA2DArrayGenome<T>::read(istream &) {
GAErr(GA_LOC, className(), "read", gaErrOpUndef);
return 1;
}
template <class T> int
GA2DArrayGenome<T>::write(ostream & os) const
{
for(unsigned int j=0; j<ny; j++){
for(unsigned int i=0; i<nx; i++){
os << gene(i,j) << " ";
}
os << "\n";
}
return 0;
}
#endif
template <class T> int
GA2DArrayGenome<T>::resizeBehaviour(GAGenome::Dimension which) const {
int val = 0;
if(which == WIDTH) {
if(maxX == minX) val = FIXED_SIZE;
else val = maxX;
}
else if(which == HEIGHT) {
if(maxY == minY) val = FIXED_SIZE;
else val = maxY;
}
return val;
}
template <class T> int
GA2DArrayGenome<T>::
resizeBehaviour(GAGenome::Dimension which,
unsigned int lower, unsigned int upper)
{
if(upper < lower){
GAErr(GA_LOC, className(), "resizeBehaviour", gaErrBadResizeBehaviour);
return resizeBehaviour(which);
}
switch(which){
case WIDTH:
minX = lower; maxX = upper;
if(nx > upper) GA2DArrayGenome<T>::resize(upper,ny);
if(nx < lower) GA2DArrayGenome<T>::resize(lower,ny);
break;
case HEIGHT:
minY = lower; maxY = upper;
if(ny > upper) GA2DArrayGenome<T>::resize(nx,upper);
if(ny < lower) GA2DArrayGenome<T>::resize(nx,lower);
break;
default:
break;
}
return resizeBehaviour(which);
}
template <class T> void
GA2DArrayGenome<T>::copy(const GA2DArrayGenome<T> & orig,
unsigned int r, unsigned int s,
unsigned int x, unsigned int y,
unsigned int w, unsigned int h)
{
if(w == 0 || x >= orig.nx || r >= nx ||
h == 0 || y >= orig.ny || s >= ny) return;
if(x + w > orig.nx) w = orig.nx - x;
if(y + h > orig.ny) h = orig.ny - y;
if(r + w > nx) w = nx - r;
if(s + h > ny) h = ny - s;
for(unsigned int j=0; j<h; j++)
GAArray<T>::copy(orig, (s+j)*nx+r, (y+j)*orig.nx+x, w);
_evaluated = gaFalse;
}
template <class T> int
GA2DArrayGenome<T>::equal(const GAGenome & c) const
{
if(this == &c) return 1;
GA2DArrayGenome<T> & b = (GA2DArrayGenome<T> &)c;
if(nx != b.nx || ny != b.ny) return 0;
int val=0;
for(unsigned int j=0; j<ny && val==0; j++)
val = GAArray<T>::equal(b,j*nx,j*nx,nx) ? 0 : 1;
return(val ? 0 : 1);
}
/* ----------------------------------------------------------------------------
2DArrayAlleleGenome
---------------------------------------------------------------------------- */
template <class T> const char *
GA2DArrayAlleleGenome<T>::className() const {return "GA2DArrayAlleleGenome";}
template <class T> int
GA2DArrayAlleleGenome<T>::classID() const {return GAID::ArrayAlleleGenome2D;}
template <class T>
GA2DArrayAlleleGenome<T>::
GA2DArrayAlleleGenome(unsigned int width, unsigned int height,
const GAAlleleSet<T> & s,
GAGenome::Evaluator f, void * u) :
GA2DArrayGenome<T>(width,height,f,u){
naset = 1;
aset = new GAAlleleSet<T>[1];
aset[0] = s;
initializer(DEFAULT_2DARRAY_ALLELE_INITIALIZER);
mutator(DEFAULT_2DARRAY_ALLELE_MUTATOR);
comparator(DEFAULT_2DARRAY_ALLELE_COMPARATOR);
crossover(DEFAULT_2DARRAY_ALLELE_CROSSOVER);
}
template <class T>
GA2DArrayAlleleGenome<T>::
GA2DArrayAlleleGenome(unsigned int width, unsigned int height,
const GAAlleleSetArray<T> & sa,
GAGenome::Evaluator f, void * u) :
GA2DArrayGenome<T>(width,height, f, u) {
naset = sa.size();
aset = new GAAlleleSet<T>[naset];
for(int i=0; i<naset; i++)
aset[i] = sa.set(i);
initializer(DEFAULT_2DARRAY_ALLELE_INITIALIZER);
mutator(DEFAULT_2DARRAY_ALLELE_MUTATOR);
comparator(DEFAULT_2DARRAY_ALLELE_COMPARATOR);
crossover(DEFAULT_2DARRAY_ALLELE_CROSSOVER);
}
template <class T>
GA2DArrayAlleleGenome<T>::
GA2DArrayAlleleGenome(const GA2DArrayAlleleGenome<T> & orig) :
GA2DArrayGenome<T>(orig.nx, orig.ny) {
naset = 0;
aset = (GAAlleleSet<T>*)0;
GA2DArrayAlleleGenome<T>::copy(orig);
}
template <class T>
GA2DArrayAlleleGenome<T>::~GA2DArrayAlleleGenome(){
delete [] aset;
}
template <class T> GAGenome *
GA2DArrayAlleleGenome<T>::clone(GAGenome::CloneMethod) const {
return new GA2DArrayAlleleGenome<T>(*this);
}
template <class T> void
GA2DArrayAlleleGenome<T>::copy(const GAGenome& orig){
if(&orig == this) return;
const GA2DArrayAlleleGenome<T>* c =
DYN_CAST(const GA2DArrayAlleleGenome<T>*, &orig);
if(c) {
GA2DArrayGenome<T>::copy(*c);
if(naset != c->naset){
delete [] aset;
naset = c->naset;
aset = new GAAlleleSet<T>[c->naset];
}
for(int i=0; i<naset; i++)
aset[i].link(c->aset[i]);
}
}
template <class T> int
GA2DArrayAlleleGenome<T>::resize(int x, int y){
unsigned int oldx = nx;
unsigned int oldy = ny;
GA2DArrayGenome<T>::resize(x,y);
if(nx > oldx){ // adjust the existing chunks of bits
int y=GAMin(oldy,ny);
for(int j=y-1; j>=0; j--){
for(unsigned int i=oldx; i<nx; i++)
a[j*nx+i] = aset[(j*nx+i) % naset].allele();
}
}
if(ny > oldy){ // change in height is always new bits
for(unsigned int i=nx*oldy; i<nx*ny; i++)
a[i] = aset[i % naset].allele();
}
return sz;
}
#ifndef NO_STREAMS
template <class T> int
GA2DArrayAlleleGenome<T>::read(istream& is){
return GA2DArrayGenome<T>::read(is);
}
template <class T> int
GA2DArrayAlleleGenome<T>::write(ostream& os) const {
return GA2DArrayGenome<T>::write(os);
}
#endif
template <class T> int
GA2DArrayAlleleGenome<T>::equal(const GAGenome & c) const {
return GA2DArrayGenome<T>::equal(c);
}
/* ----------------------------------------------------------------------------
Operator definitions
---------------------------------------------------------------------------- */
// this does not handle genomes with multiple allele sets!
template <class ARRAY_TYPE> void
GA2DArrayAlleleGenome<ARRAY_TYPE>::UniformInitializer(GAGenome & c)
{
GA2DArrayAlleleGenome<ARRAY_TYPE> &child=
DYN_CAST(GA2DArrayAlleleGenome<ARRAY_TYPE> &, c);
child.resize(GAGenome::ANY_SIZE,GAGenome::ANY_SIZE);
for(int i=child.width()-1; i>=0; i--)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -