遗传算法求解TSP问题.docx
《遗传算法求解TSP问题.docx》由会员分享,可在线阅读,更多相关《遗传算法求解TSP问题.docx(21页珍藏版)》请在冰豆网上搜索。
遗传算法求解TSP问题
智能优化算法第二次作业
一分析
遗传算法(GeneticAlgorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法
遗传算法的基本运算过程如下:
a)初始化:
设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。
b)个体评价:
计算群体P(t)中各个个体的适应度。
c)选择运算:
将选择算子作用于群体。
选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。
选择操作是建立在群体中个体的适应度评估基础上的。
d)交叉运算:
将交叉算子作用于群体。
所谓交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。
遗传算法中起核心作用的就是交叉算子。
e)变异运算:
将变异算子作用于群体。
即是对群体中的个体串的某些基因座上的基因值作变动。
群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t1)。
f)终止条件判断:
若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。
下面用C语言模拟遗传算法模拟TSP问题
TSP问题及旅行商问题,假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。
路径的选择目标是要求得的路径路程为所有路径之中的最小值
1)生成初始种群:
2)适应度计算
3)交叉
4)变异
5)选最优
6)迭代
二、结果:
源码:
/*问题:
用遗传算法求解TSP问题:
为保证有解用完全图做样例*/
/*洪文杰2016-3-16.智能优化算法第二次作业*/
#include
#include
#include
usingnamespacestd;
//--------------------------------宏定义----------------------------------//
#defineNUMBER50//种群规模
#defineGENE_NUMBER10//迭代次数
#defineG20//图的顶点个数
#defineCROSS0.85//交叉概率
#defineABERRANCE0.15//变异概率
//-------------------------------全局变量定义-----------------------------//
intFigure[G][G];//保存图信息
intUnit[NUMBER][G];//保存初始种群
intChoose_Unit[NUMBER][G];//保存更新的种群
intChoose_Number[NUMBER];//被选择的个体编号
intCross[NUMBER];//要交叉的个体一览
floatselect_probability[NUMBER];//选择概率
floataccumula_probability[NUMBER];//积累概率
inthwj[G];//grefenstette编码的个体、也保存最短路径
intFigure_best=100000;//最短路径长度
//--------------------------------函数声明--------------------------------//
voidhwj_figure();//生成完全图
voidhwj_initial_population();//生成初始种群
voidhwj_swap(int*a,int*b);//交换两个数的值
voidhwj_fitness();//计算适应度、选择概率、积累概率
voidhwj_choose();//轮盘赌选择法找到被选择的个体
inthwj_bisearch(floattemp);//顺序查找
voidhwj_cross();//进行交叉
voidhwj_cross2(inta,intb,intkey);//利用grefenstette编码交叉
voidhwj_aberrance();//进行变异
voidhwj_aberrance2(inta,intkey);//利用grefenstette编码变异
voidhwj_best();//找到最短路径
//--------------------------------主函数----------------------------------//
intmain(){
intkey=0;
cout<<"thisisthefigure:
"<hwj_figure();
//cout<<"--------------------------1生成完全图-------------------"<hwj_initial_population();
//cout<<"--------------------------2初始种群---------------------"<while(key!
=GENE_NUMBER){
hwj_fitness();
//cout<<"--------------------------3适应度-----------------------"<hwj_choose();
//cout<<"--------------------------4被选择的个体-----------------"<hwj_cross();
//cout<<"--------------------------5交叉后的种群-----------------"<hwj_aberrance();
//cout<<"--------------------------6变异后的种群-----------------"<hwj_best();
//cout<<"--------------------------7找到最短路径-----------------"<key++;
}
cout<<"Theshortestpathlengthis:
"<cout<<"Shortestpathis:
"<for(inti=0;icout<}
cout<return0;
}
//--------------------------------生成完全图----------------------------------//
voidhwj_figure(){
srand(time(NULL));
inti,j;
for(i=0;ifor(j=i+1;jFigure[i][j]=rand()%100+1;//只需要上三角信息
cout<