search();
}
return0;
}
遗传算法的代码如下:
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
//ifstreamfin("in.txt");
//ofstreamfout("out.txt");
//#definecinfin
//#definecoutfout
//变异概率
#defineMUTATION_RATE0.2
//杂交概率
#defineCROSSOVER_RATE0.75
//基因组数目
#definePOP_SIZE40
//为2的倍数
#defineNUM_BEST_TO_ADD2
//产生随机数
inlineintRandInt(intx,inty)
{
returnrand()%(y-x+1)+x;
}
inlinedoubleRandFloat()
{
return(rand())/(RAND_MAX+1.0);
}
//计算机坐标结构
structCoOrd
{
floatx,y;
CoOrd(){};
CoOrd(floata,floatb):
x(a),y(b){};
};
//基因组结构
structSGenome
{
//连接计算机间的路径(基因组)
vectorvecPC;
//适应分数
doubledFitness;
//构造函数
SGenome():
dFitness(0){}
SGenome(intnc):
dFitness(0)
{
vecPC=GrabPermutation(nc);
}
//创建计算机间随机的一条路径
vectorGrabPermutation(int&limit);
//在GrabPermutation函数中使用
boolTestNumber(constvector&vec,constint&number);
};
//遗传算法类
classCgaTSP
{
private:
//计算机坐标向量
vectorm_vecPCCoOrds;
vectorm_vecPopulation;
vectorm_savevecPC;
doublem_dMutationRate;
doublem_dCrossoverRate;
//整个种子群体的总适应性分
doublem_dTotalFitness;
//在此之前找到的最短路径
doublem_dShortestRoute;
//把所有代中的最短路径保存起来
doublem_saveShortestRoute;
//最长路径
doublem_dLongestRoute;
//种子群中的基因组数目
intm_iPopSize;
//染色体数目
intm_iChromoLength;
//新一代中适应分最高的成员
intm_iFittestGenome;
//表明已经到了那一代
intm_iGeneration;
//交换变异
voidMutateEM(vector&chromo);
//部分匹配杂交
voidCrossoverPMX(constvector&mum,constvector&dad,
vector&baby1,vector&baby2);
SGenome&RouletteWheelSelection();
//计算计算机之间连接路径的长度
doubleGetTourLength(constvector&route);
voidCalculatePopulationsFitness();
voidCalculateBestWorstAvTot();
voidReset();
voidCreateStartingPopulation();
//计算两个计算之间的长度
doubleCalculateA_to_B(constCoOrd&PC1,constCoOrd&PC2);
//建立坐标
voidCreateCoOrd();
public:
//构造函数
CgaTSP(doublemut_rat,
doublecross_rat,
intpop_size,
intNumPC
):
m_dMutationRate(mut_rat),
m_dCrossoverRate(cross_rat),
m_iPopSize(pop_size),
m_iFittestGenome(0),
m_iGeneration(0),
m_dShortestRoute(999999999),
m_saveShortestRoute(999999999),
m_dLongestRoute(0),
m_iChromoLength(NumPC)
{
//建立坐标
CreateCoOrd();
//清除基因组生成新的基因组
CreateStartingPopulation();
}
~CgaTSP()
{
}
//把所有的遗传算法的步骤进行合并到一个函数
voidEpoch();
voidShow();
};
/***********************************************************************************************/
//随机生成一个基因并返回
vectorSGenome:
:
GrabPermutation(int&limit)
{
vectorvecPerm;
for(inti=0;i{
//0到limint-1为计算机的序号
intNextPossibleNumber=RandInt(0,limit-1);
//向量中存在随见生成的序号就在生成一次
while(TestNumber(vecPerm,NextPossibleNumber))
{
NextPossibleNumber=RandInt(0,limit-1);
}
//把新生成的序号放进向量
vecPerm.push_back(NextPossibleNumber);
}
//返回基因
returnvecPerm;
}
//测试number是否已经存在向量中
boolSGenome:
:
TestNumber(constvector&vec,constint&number)
{
for(inti=0;i{
if(vec[i]==number)
{
returntrue;
}
}returnfalse;
}
//计算路径长度和适应性分
voidCgaTSP:
:
CalculatePopulationsFitness()
{
//对于每组基因计算路径长度
for(inti=0;i{
//计算计算机间路径的总长度
doubleTourLength=GetTourLength(m_vecPopulation[i].vecPC);
m_vecPopulation[i].dFitness=TourLength;
if(TourLength{
m_dShortestRoute=TourLength;
//代表适应性分最高的成员
m_iFittestGenom