⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 group.cpp

📁 遗传算法实现旅行商问题:经典遗传算法解决旅行商问题
💻 CPP
字号:
// Group.cpp: implementation of the Group class.
//
//////////////////////////////////////////////////////////////////////

#include "Group.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Group::Group():member(),gene(0) //memberCount=10  //用const int memberCount的话需在列表中初始化**,memberCount=10
{
	VectorInt vi;
	int i=0;
	for(i=0;i<CITYCOUNT;i++)
	{
		vi.push_back(i);
	}
	Individual indiv(vi);
	for (i=0;i<memberCount;i++)
	{
		indiv=indiv.variate();
		member.push_back(indiv);
	}
	sort(member.begin(),member.end());
}

Group::Group(int ge, VectorIdv vi):member(vi),gene(ge)
{
	
}

Group::~Group()
{
	member.~vector();
}
//ofstream test1("test1.txt");
Group& Group::evolute()
{
	VectorIdv mem;
	int rand1;
	int rand2;
	for (int i=0;i<memberCount*crossRate;)
	{
		rand1=Individual::ranRange(0,CITYCOUNT-1);
		do
		{
			rand2=Individual::ranRange(0,CITYCOUNT-1);
		}while(rand1==rand2);
		Individual& mem1=member.at(rand1);
		Individual& mem2=member.at(rand2);
		Individual& newMem=mem1.cross(mem2);
		

//		test1<<rand1<<"------"<<rand2<<endl;
//		mem1.printIndividual(test1);
//		mem2.printIndividual(test1);
//		newMem.printIndividual(test1);

		if (!find(member,newMem))
		{
			mem.push_back(newMem);
			i++;
		}
	}
	for (i=0;i<memberCount*variateRate;i++)
	{
		rand1=Individual::ranRange(0,CITYCOUNT-1);
		Individual& pref=member.at(rand1);
		Individual& indinew=pref.variate();
		mem.push_back(indinew);
	}
	mem.insert(mem.end(),member.begin(),member.end());
	sort(mem.begin(),mem.end());

	mem.erase(mem.begin()+memberCount,mem.end());
	Group *pGroup=new Group(gene+1,mem);
	return *pGroup;

}


Group::printGroup(ostream& cout)
{
	cout<<"第"<<gene<<"代种群:"<<endl;
	int size=member.size();
	for(int i=0;i<size;i++)
	{
		Individual& indi=member.at(i);
		indi.printIndividual(cout);
	}
	cout<<endl;
}

Group::printGroup(ofstream& cout)
{
	cout<<"第"<<gene<<"代种群:"<<endl;
	int size=member.size();
	for(int i=0;i<size;i++)
	{
		Individual& indi=member.at(i);
		indi.printIndividual(cout);
	}
	cout<<endl;
}

Group::printBestIndividual(ostream& cout)
{
	cout<<"第"<<gene<<"代最佳个体:"<<endl;
	Individual& indi=member.at(0);
	indi.printIndividual(cout);
	cout<<endl;
}

Group::printBestIndividual(ofstream& cout)
{
	cout<<"第"<<gene<<"代最佳个体:"<<endl;
	Individual& indi=member.at(0);
	indi.printIndividual(cout);
	cout<<endl;

}
bool Group::operator ==(Group& other)
{
	return calValue()==other.calValue();
}
int Group::calValue()
{
	vindviter iter=member.begin();
	return (*iter).CalValue();
}

const double Group::variateRate=0.4;
const double Group::crossRate=0.8;
const int Group::memberCount=10;

bool Group::find(const VectorIdv& vectoridv,const Individual& individ)
{
	int size=vectoridv.size();
	for (int i=0;i<size;i++)
	{
		Individual elem=vectoridv.at(i);
		if (elem==individ)
		{
			return true;
		}
	}
	return false;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -