//-------------------------------------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TGAIndividual Àà // = Version : ver2.0 // = Author : wlw // = CreateDate : 2002-09-09 // = Description: TGAIndividual ¶¨Òå // = Maintainers: // //-------------------------------------------------------------------------------------------------------+ #include "StdAfx.h" #include "TGAIndividual.h" #include "TGAPopulation.h" TGAIndividual::TGAIndividual() { } TGAIndividual::~TGAIndividual() { } TGAIndividual* TGAIndividual::New() const { return NULL; } void TGAIndividual::Init() { } TGAIndividual* TGAIndividual::Mutation() const { return NULL; } bool TGAIndividual::operator < (const TGAIndividual& rival) const { return false; } bool TGAIndividual::operator > (const TGAIndividual& rival) const { return false; } long TGAIndividual::Multiply(const TGAIndividual&mat,TGAPopulation* pRes)const { ASSERT(pRes != NULL); if(mat.GetLength()>GetLength()) { return mat.Multiply(*this,pRes); } TGAIndividual *pNew1 = New(),*pNew2 = New(); pNew1->SetLength(GetLength(),false); pNew2->SetLength(GetLength(),false); long first = rand() % mat.GetLength(); long last = (first + mat.GetLength() / 2 - 1) % mat.GetLength(); long i; if(last >= first) { for(i = 0; i < first; i++) { (*pNew1)[i] = GetAt(i)->Clone(); (*pNew2)[i] = mat.GetAt(i)->Clone(); } for(;i <= last; i++) { (*pNew1)[i] = mat.GetAt(i)->Clone(); (*pNew2)[i] = GetAt(i)->Clone(); } for(;i < mat.GetLength(); i++) { (*pNew1)[i] = GetAt(i)->Clone(); (*pNew2)[i] = mat.GetAt(i)->Clone(); } } else { for(i = 0; i <= last; i++) { (*pNew1)[i] = mat.GetAt(i)->Clone(); (*pNew2)[i] = GetAt(i)->Clone(); } for(; i < first; i++) { (*pNew1)[i] = GetAt(i)->Clone(); (*pNew2)[i] = mat.GetAt(i)->Clone(); } for(; i < mat.GetLength(); i++) { (*pNew1)[i] = mat.GetAt(i)->Clone(); (*pNew2)[i] = GetAt(i)->Clone(); } } for(; i < GetLength(); i++) { (*pNew1)[i] = GetAt(i)->Clone(); (*pNew2)[i] = GetAt(i)->Clone(); } pNew1->Init(); pNew2->Init(); pRes->Append(pNew1); pRes->Append(pNew2); return 2; }