TSP问题求解实验报告Word下载.doc
《TSP问题求解实验报告Word下载.doc》由会员分享,可在线阅读,更多相关《TSP问题求解实验报告Word下载.doc(13页珍藏版)》请在冰豆网上搜索。
Ф——选择算子,SGA使用比例算子;
Г——交叉算子,SGA使用单点交叉算子;
Ψ——变异算子,SGA使用基本位变异算子;
Т——算法终止条件,一般终止进化代数为100—500;
问题的表示
对于一个实际的待优化问题,首先需要将其表示为适合于遗传算法操作的形式。
用遗传算法解决TSP,一个旅程很自然的表示为n个城市的排列,但基于二进制编码的交叉和变异操作不能适用。
路径表示是表示旅程对应的基因编码的最自然,最简单的表示方法。
它在编码,解码,存储过程中相对容易理解和实现。
例如:
旅程(5-1-7-8-9-4-6-2-3)可以直接表示为(517894623)
(三)实验内容
N>
=8。
随即生成N个城市间的连接矩阵。
指定起始城市。
给出每一代的最优路线和总路线长度。
以代数T作为结束条件,T>
=50。
(四)实验代码
#include"
stdafx.h"
#include<
stdio.h>
string.h>
stdlib.h>
math.h>
time.h>
#definecities10//城市的个数
#defineMAXX100//迭代次数
#definepc0.8//交配概率
#definepm0.05//变异概率
#definenum10//种群的大小
intbestsolution;
//最优染色体
intdistance[cities][cities];
//城市之间的距离
structgroup//染色体的结构
{
intcity[cities];
//城市的顺序
intadapt;
//适应度
doublep;
//在种群中的幸存概率
}group[num],grouptemp[num];
//随机产生cities个城市之间的相互距离
voidinit()
inti,j;
memset(distance,0,sizeof(distance));
srand((unsigned)time(NULL));
for(i=0;
i<
cities;
i++)
{
for(j=i+1;
j<
j++)
{
distance[i][j]=rand()%100;
distance[j][i]=distance[i][j];
}
}
//打印距离矩阵
printf("
城市的距离矩阵如下\n"
);
for(j=0;
printf("
%4d"
distance[i][j]);
printf("
\n"
}
//随机产生初试群
voidgroupproduce()
inti,j,t,k,flag;
num;
i++)//初始化
for(j=0;
group[i].city[j]=-1;
//产生10个不相同的数字
)
t=rand()%cities;
flag=1;
for(k=0;
k<
j;
k++)
{
if(group[i].city[k]==t)
{
flag=0;
break;
}
}
if(flag)
group[i].city[j]=t;
j++;
//打印种群基因
初始的种群\n"
group[i].city[j]);
//评价函数,找出最优染色体
voidpingjia()
intn1,n2;
intsumdistance,biggestsum=0;
doublebiggestp=0;
sumdistance=0;
for(j=1;
n1=group[i].city[j-1];
n2=group[i].city[j];
sumdistance+=distance[n1][n2];
group[i].adapt=sumdistance;
//每条染色体的路径总和
biggestsum+=sumdistance;
//种群的总路径
//计算染色体的幸存能力,路劲越短生存概率越大
group[i].p=1-(double)group[i].adapt/(double)biggestsum;
biggestp+=group[i].p;
group[i].p=group[i].p/biggestp;
//在种群中的幸存概率,总和为1
//求最佳路劲
bestsolution=0;
if(group[i].p>
group[bestsolution].p)
bestsolution=i;
//打印适应度
染色体%d的路径之和与生存概率分别为%4d%.4f\n"
i,group[i].adapt,group[i].p);
当前种群的最优染色体是%d号染色体\n"
bestsolution);
//选择
voidxuanze()
inti,j,temp;
doublegradient[num];
//梯度概率
doublexuanze[num];
//选择染色体的随机概率
intxuan[num];
//选择了的染色体
//初始化梯度概率
gradient[i]=0.0;
xuanze[i]=0.0;
gradient[0]=group[0].p;
for(i=1;
gradient[i]=gradient[i-1]+group[i].p;
//随机产生染色体的存活概率
xuanze[i]=(rand()%100);
xuanze[i]/=100;
//选择能生存的染色体
if(xuanze[i]<
gradient[j])
xuan[i]=j;
//第i个位置存放第j个染色体
break;
//拷贝种群
grouptemp[i].adapt=group[i].adapt;
grouptemp[i].p=group[i].p;
grouptemp[i].city[j]=group[i].city[j];
//数据更新
temp=xuan[i];
group[i].adapt=grouptemp[temp].adapt;
group[i].p=grouptemp[temp].p;
group[i].city[j]=grouptemp[temp].city[j];
//用于测试
<
------------------------------->
for(i=0;
i<
i++)
for(j=0;
j<
j++)
group[i].city[j]);
i,group[i].adapt,group[i].p);
//交配,对每个染色体产生交配概率,满足交配率的染色体进行交配
voidjiaopei()
inti,j,k,kk;
intt;
//参与交配的染色体的个数
intpoint1,point2,temp;
//交配断点
intpointnum;
inttemp1,temp2;
intmap1[cities],map2[cities];
doublejiaopeip[num];
//染色体的交配概率
intjiaopeiflag[num];
//染色体的可交配情况
i++)//初始化
jiaopeiflag[i]=0;
//随机产生交配概率
srand((unsigned)time(