人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx
- 文档编号:21766999
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:20.97KB
人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx
《人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx》由会员分享,可在线阅读,更多相关《人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
vector<
int>
//定义个体基因容器类型
#define_CONTAINER_Pstd:
//定义适应度容器类型
#define_P(a,x,y)*(a+(x)+(y)*_CITY_AMOUNT)
#define_P_GENE_ABERRANCE10//变异概率1%
#define_P_GENE_MIX(_GENERATION_AMOUNT-1)/2//杂交次数
#define_INFINITE100000
typedefintDISTANCE;
//距离矩阵的数据存储类型
#endif
___________________________________________________________________________
TSP.cpp
____________________________________________________________________________
#include<
iostream>
vector>
algorithm>
time.h>
stdlib.h>
#include"
def.h"
TSP.h"
voidmain()
{
conststaticDISTANCEdistance[][_CITY_AMOUNT]
={
0,1,4,6,8,1,3,7,2,9,
1,0,7,5,3,8,3,4,2,4,
4,7,0,3,8,3,7,9,1,2,
6,5,3,0,3,1,5,2,9,1,
8,3,8,3,0,2,3,1,4,6,
1,8,3,1,2,0,3,3,9,5,
3,3,7,5,3,3,0,7,5,9,
7,4,9,2,1,3,7,0,1,3,
2,2,1,9,4,9,5,1,0,1,
9,4,2,1,6,5,9,3,1,0
};
//城市间的距离矩阵
//distance[i][j]代表i城市与j城市的距离
/*
conststaticDISTANCEdistance[][_CITY_AMOUNT]
={
0,1,4,6,8,1,3,7,2,9,7,3,4,5,8,9,2,8,2,8,
1,0,7,5,3,8,3,4,2,4,4,6,2,8,2,9,4,5,2,1,
4,7,0,3,8,3,7,9,1,2,5,8,1,8,9,4,7,4,8,4,
6,5,3,0,3,1,5,2,9,1,3,5,7,3,4,7,3,4,5,2,
8,3,8,3,0,2,3,1,4,6,3,8,4,5,2,8,1,7,4,7,
1,8,3,1,2,0,3,3,9,5,4,5,2,7,3,6,2,3,7,1,
3,3,7,5,3,3,0,7,5,9,3,4,5,9,3,7,3,2,8,1,
7,4,9,2,1,3,7,0,1,3,4,5,2,7,6,3,3,8,3,5,
2,2,1,9,4,9,5,1,0,1,3,4,7,3,7,5,9,2,1,7,
9,4,2,1,6,5,9,3,1,0,3,7,3,7,4,9,3,5,2,5,
7,4,5,3,3,4,3,4,3,3,0,5,7,8,4,3,1,5,9,3,
3,6,8,5,8,5,4,5,4,7,5,0,8,3,1,5,8,5,8,3,
4,2,1,7,4,2,5,2,7,3,7,8,0,5,7,4,8,3,5,3,
5,8,8,3,5,7,9,7,3,7,8,3,5,0,8,3,1,8,4,5,
8,2,9,4,2,3,3,6,7,4,4,1,7,8,0,4,2,1,8,4,
9,9,4,7,8,6,7,3,5,9,3,5,4,3,4,0,4,1,8,4,
2,4,7,3,1,2,3,3,9,3,1,8,8,1,2,4,0,4,3,7,
8,5,4,4,7,3,2,8,2,5,5,5,3,8,1,1,4,0,2,6,
2,2,8,5,4,7,8,3,1,2,9,8,5,4,8,8,3,2,0,4,
8,1,4,2,7,1,1,5,7,5,3,3,3,5,4,4,7,6,4,0
*/
Csga<
_CONTAINER,_CONTAINER_P>
CUnit((DISTANCE*)distance);
//初始化
//开始遗传算法
if(!
CUnit.fnCreateRandomGene())//产生随机的基因
{
exit(0);
}
//循环基因编译,杂交,淘汰过程
CUnit.fnEvalAll();
for(inti=0;
i<
_TIMES;
++i)
//CUnit.fnDispProbability();
CUnit.fnGeneAberrance();
//基因变异
CUnit.fnGeneMix();
//基因杂交
//每隔_DISP_INTERVAL显示一次结果
if((i+1)%_DISP_INTERVAL==0||i==0)
cout<
<
"
第"
<
i+1<
代"
std:
endl;
CUnit.fnDispProbability();
CUnit.fnDispHistoryMin();
}
tsp.h
usingnamespacestd;
template<
typenameT,typenameP>
classCsga
public:
Csga();
Csga(DISTANCE*lpDistance);
//构造函数
~Csga();
//析构函数
boolfnCreateRandomGene();
//产生随机基因
boolfnGeneAberrance();
boolfnGeneMix();
//基因交叉产生新的个体测试并淘汰适应度低的个体
boolfnEvalAll();
//测试所有基因的适应度
intfnEvalOne(T&
Gene);
//测试某一个基因的适应度
voidfnDispProbability();
//显示每个个体的权值
voidfnDispHistoryMin();
private:
boolfnGeneAberranceOne(constint&
i,constint&
j);
//变异某个基因
Tm_GenerationGene[_GENERATION_AMOUNT];
//定义每个群体的基因
Pm_vProbability;
//定义每个群体的适应度
DISTANCE*lpCityDistance;
intHistoryMin;
THistoryMinWay;
Tm_GenerationGeneBk[_GENERATION_AMOUNT];
};
//构造函数
Csga<
T,P>
Csga()
Csga(DISTANCE*lpDistance)
lpCityDistance=lpDistance;
m_vProbability.reserve(_CITY_AMOUNT);
HistoryMin=_INFINITE;
//cout<
_P(lpCityDistance,3,2);
//调试用
//析构函数
~Csga()
//产生随机基因
boolCsga<
fnCreateRandomGene()
srand(time(0));
//初始化随机数
\t基因序列"
//生成随机基因
for(intj,temp,i=0;
_GENERATION_AMOUNT;
++i)
m_GenerationGene[i].reserve(_CITY_AMOUNT);
for(j=0;
j<
_CITY_AMOUNT;
++j)
do
temp=rand()%_CITY_AMOUNT;
}while(find(m_GenerationGene[i].begin(),m_GenerationGene[i].end(),temp)
!
=m_GenerationGene[i].end());
m_GenerationGene[i].push_back(temp);
}//endfor
/*copy(m_GenerationGene[i].begin(),m_GenerationGene[i].end(),
std:
ostream_iterator<
(cout,"
));
*///调试用
returntrue;
//基因变异
fnGeneAberrance()
inti,j;
inttemp;
srand(time(0));
//抽选一代中的某个基因进行变异
for(i=0;
temp=rand()%10000;
if(temp>
0&
&
temp<
=_P_GENE_ABERRANCE)
//随机抽选到的基因进行变异
fnGeneAberranceOne(i,j)){exit(0);
}
}//endif
}//endforj
}//endfori
//变异第i个基因的第j位染色体
fnGeneAberranceOne(constint&
j)
//基因变异结果
T:
iteratorpos;
//找到变异位与另外一位交换
pos=std:
find(m_GenerationGene[i].begin(),m_GenerationGene[i].end(),temp);
if(pos!
=m_GenerationGene[i].end())
*pos=m_GenerationGene[i][j];
m_GenerationGene[i][j]=temp;
returnfalse;
inlineintfnRndBoundary(intiBegin,intiEnd)
{
returnrand()%(iEnd-iBegin)+iBegin;
//基因交叉产生新的个体并淘汰适应度低的个体
fnGeneMix()
temp;
//选择池
PvProbabilityBk;
//临时保存适应度
vProbabilityBk=m_vProbability;
temp.reserve(((_GENERATION_AMOUNT+1)*_GENERATION_AMOUNT)/2);
P:
for(inti=_GENERATION_AMOUNT;
i>
0;
--i)
min_element(vProbabilityBk.begin(),vProbabilityBk.end());
temp.insert(temp.end(),i,(int)(pos-vProbabilityBk.begin()));
*pos=_INFINITE;
/**************************************************************************
fnDispProbability();
\ttemp\n"
copy(temp.begin(),temp.end(),std:
**************************************************************************/
#define_MIN_ELEMENTstd:
min_element(m_vProbability.begin(),m_vProbability.end())
m_GenerationGeneBk[_GENERATION_AMOUNT-1]=m_GenerationGene[_MIN_ELEMENT-m_vProbability.begin()];
intiFather;
//父亲的代号
intiMother;
//母亲的代号
TChild1,Child2;
//父亲与母亲杂交出的子女的基因
iteratortempIter;
intLowBoundary;
intHighBoundary;
//intiChild1Probability,iChild2Probability;
TfatherBk,motherBk;
iteratorV_iter;
iteratorP_iter;
intiDistance;
#ifndef_ITEMP
#define_ITEMPrand()%(((_GENERATION_AMOUNT+1)*_GENERATION_AMOUNT)/2)
_P_GENE_MIX;
++i)//杂交_P_GENE_MIX/10次
iFather=temp[_ITEMP];
iMother=temp[_ITEMP];
}while(iMother==iFather);
Child1.reserve(_CITY_AMOUNT);
//初始化子女的碱基数
Child2.reserve(_CITY_AMOUNT);
Child1.clear();
Child2.clear();
LowBoundary=fnRndBoundary(0,_CITY_AMOUNT-2);
HighBoundary=fnRndBoundary(LowBoundary+1,_CITY_AMOUNT-1);
/**********************************************************************
iMother:
"
iMother<
iFather:
iFather<
LowBoundary:
LowBoundary<
HighBoundary:
HighBoundary
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 实验 基于 TSP 遗传 算法 旅行 问题 求解