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

📄 group.cpp

📁 TSP问题(Travelling Salesman Problem)是数学领域中著名问题之一,旅行商的VC算法实现
💻 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 + -