📄 group.cpp
字号:
#include "Group.h"
namespace evo
{
Group::Group(void):member(),generation(0)
{
VectorInt vi;
for(int i=0;i<CITY_COUNT;i++)
vi.push_back(i);
Individual indi(vi);
for(int i=0;i<memberCount;i++)
{
indi=indi.variate();
member.push_back(indi);
}
sort(member.begin(),member.end());
}
Group::Group(int i,VectorIDV newmember):member(newmember),generation(i)
{
}
Group::~Group(void)
{
member.~vector();
}
Group& Group::evolute()
{
VectorIDV membernew;
for(int i=0;i<memberCount*crossRate;)//产生数据,杂交
{
int rand1=Individual::ranRange(0,CITY_COUNT-1);
int rand2;
do
{
rand2=Individual::ranRange(0,CITY_COUNT-1);
}while(rand2==rand1);
Individual& p1ref=member.at(rand1);
Individual& p2ref=member.at(rand2);
Individual& indinew=p1ref.cross(p2ref);//内存浪费,?
if(!find(member,indinew))
{
membernew.push_back(indinew);
i++;
}
}
for(int i=0;i<memberCount*variateRate;i++)//产生数据,变异
{
int rand=Individual::ranRange(0,CITY_COUNT-1);
Individual &pref=member.at(rand);
Individual &indinew=pref.variate();//内存浪费,?
membernew.push_back(indinew);
}
idviter oldbegin=member.begin();
idviter oldend=member.end();
membernew.insert(membernew.end(),oldbegin,oldend);//将原来的个体与新个体合并并且排序
sort(membernew.begin(),membernew.end());
/*cout<<endl<<"all data of generation"<<generation+1<<endl;
for(int i=0;i<membernew.size();i++)
membernew.at(i).printIndividual(cout);
cout<<endl;*/
membernew.erase(membernew.begin()+memberCount,membernew.end());
Group *pGroup=new Group(generation+1,membernew);
//cout<<"member calvalue"<<(*member.begin()).calValue()<<"group calvalue"<<calValue()<<endl;
//cout<<"membernew calvalue"<<(*membernew.begin()).calValue()<<"pGroup calvalue"<<pGroup->calValue()<<endl;
return *pGroup;
}
void Group::printGroup(ostream& cout)
{
cout<<"第 "<<generation<<"代种群:"<<endl;
int size=member.size();
for(int i=0;i<size;i++)
{
Individual& ref=member.at(i);
ref.printIndividual(cout);
}
cout<<endl;
}
void Group::printGroup(ofstream& cout)
{
cout<<"第 "<<generation<<"代种群:"<<endl;
int size=member.size();
for(int i=0;i<size;i++)
{
Individual& ref=member.at(i);
ref.printIndividual(cout);
}
cout<<endl;
}
void Group::printBestIndi(ostream& cout)
{
cout<<"第"<<generation<<"代的最佳个体:"<<endl;
Individual& ref=member.at(0);
ref.printIndividual(cout);
cout<<endl;
}
void Group::printBestIndi(ofstream& cout)
{
cout<<"第"<<generation<<"代的最佳个体:"<<endl;
Individual& ref=member.at(0);
ref.printIndividual(cout);
cout<<endl;
}
int Group::calValue()
{
idviter mbegin=member.begin();
return (*mbegin).calValue();
}
bool Group::operator==(Group &other)
{
return calValue()==other.calValue();
}
int const Group::memberCount=10;
float const Group::crossRate=0.8;
float const Group::variateRate=0.4;
bool find(const evo::VectorIDV &vectoridv,const evo::Individual& indi)
{
int size=vectoridv.size();
for(int i=0;i<size;i++)
{
Individual elem=vectoridv.at(i);
if(elem==indi)
return true;
}
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -