TSP问题求解实验报告word文档良心出品Word下载.docx
- 文档编号:19132904
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:16
- 大小:162.19KB
TSP问题求解实验报告word文档良心出品Word下载.docx
《TSP问题求解实验报告word文档良心出品Word下载.docx》由会员分享,可在线阅读,更多相关《TSP问题求解实验报告word文档良心出品Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
例如:
旅程(5-1-7-8-9-4-6-2-3)可以直接表示为(517894623)
(三)实验内容
N>
=8。
随即生成N个城市间的连接矩阵。
指定起始城市。
给出每一代的最优路线和总路线长度。
以代数T作为结束条件,T>
=50。
(4)实验代码
#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;
//随机产生交配概率
jiaopeip[i]=(rand()%100);
jiaopeip[i]/=100;
//确定可以交配的染色体
t=0;
if(jiaopeip[i]<
pc)
jiaopeiflag[i]=1;
t++;
t=t/2*2;
//t必须为偶数
//产生t/2个0-9交配断点
temp1=0;
//temp1号染色体和temp2染色体交配
t/2;
point1=rand()%cities;
point2=rand()%cities;
for(j=temp1;
if(jiaopeiflag[j]==1)
temp1=j;
break;
for(j=temp1+1;
temp2=j;
//进行基因交配
if(point1>
point2)//保证point1<
=point2
temp=point1;
point1=point2;
point2=temp;
memset(map1,-1,sizeof(map1));
memset(map2,-1,sizeof(map2));
//断点之间的基因产生映射
for(k=point1;
k<
=point2;
map1[group[temp1].city[k]]=group[temp2].city[k];
map2[group[temp2].city[k]]=group[temp1].city[k];
//断点两边的基因互换
for(k=0;
point1;
temp=group[temp1].city[k];
group[temp1].city[k]=group[temp2].city[k];
group[temp2].city[k]=temp;
for(k=point2+1;
//处理产生的冲突基因
for(kk=point1;
kk<
kk++)
if(group[temp1].city[k]==group[temp1].city[kk])
group[temp1].city[k]=map1[group[temp1].city[k]];
if(group[temp2].city[k]==group[temp2].city[kk])
group[temp2].city[k]=map2[group[temp2].city[k]];
temp1=temp2+1;
//变异
voidbianyi()
inttemp1,temp2,point;
doublebianyip[num];
//染色体的变异概率
intbianyiflag[num];
//染色体的变异情况
bianyiflag[i]=0;
//随机产生变异概率
bianyip[i]=(rand()%100);
bianyip[i]/=100;
//确定可以变异的染色体
if(bianyip[i]<
pm)
bianyiflag[i]=1;
//变异操作,即交换染色体的两个节点
if(bianyiflag[i]==1)
temp1=rand()%10;
temp2=rand()%10;
point=group[i].city[temp1];
group[i].city[temp1]=group[i].city[temp2];
group[i].city[temp2]=point;
intmain()
inti,j,t;
init();
groupproduce();
//初始种群评价
pingjia();
while(t++<
MAXX)
xuanze();
//
jiaopei();
bianyi();
pingjia();
//最终种群的评价
\n输出最终的种群评价\n"
adapt:
%4d,p:
%.4f\n"
group[i].adapt,group[i].p);
最优解为%d号染色体\n"
system("
Pause"
(5)实验结果截图
(6)实验心得
通过本次实验,使自己对遗传算法有了更进一步的了解。
遗传算法是一种智能优化算法,它能较好地近似求解TSP问题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TSP 问题 求解 实验 报告 word 文档 良心 出品