TSP问题的遗传算法实验报告

  • 格式:docx
  • 大小:51.54 KB
  • 文档页数:5

下载文档原格式

  / 14
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TSP问题的遗传算法实验报告

一实验题目

TSP问题的遗传算法实现

二实验目的

1熟悉和掌握遗传算法的基本概念和基本思想;

2加深对遗传算法的理解,理解和掌握遗传算法的各个操作算子;

3理解和掌握利用遗传算法进行问题求解的基本技能。

三实验要求

1 以10/30个结点的TSP问题为例,用遗传算法加以求解;

2 掌握遗传算法的基本原理、各个遗传操作和算法步骤;

3 能求出问题最优解,若得不出最优解,请分析原因;

4 要求界面显示每次迭代求出的局部最优解和最终求出的全局最优解。

四数据结构

请说明染色体个体和群体的定义方法。

typedef struct{

int colony[POPSIZE][CITY_NUM+1];//城市种群,默认出发城市编号为0,则城市编号的最后一个城市还应该为0 每CITY_NUM个城市的排列组合为一个染色体double fitness[POPSIZE];// 路径适应值

double Distance[POPSIZE];//路径实际长度

int BestRooting[CITY_NUM+1];//最优城市路径序列

double BestFitness;//最优路径适应值

double BestValue;//最优路径长度

}TSP,*PTSP;

五实验算法

1 说明算法中对染色体的编码方法,适应度函数定义方法;

染色体的编码方法:0~9一个排列组合为一条染色体。

适应度函数的定义方法:取路径长度的倒数。

void CalFitness(PTSP city,int m)

{

int i,j,t=0;

int start,end;

for(i=0;i

{//求适应值

city->Distance[i]=0;

for(j=1;j<=CITY_NUM;j++)

{

start=city->colony[i][j-1];end=city->colony[i][j];

city->Distance[i]=city->Distance[i]+CityDistance[start][end];

}

city->fitness[i]=N/(city->Distance[i]);

}

2 采用的选择、交叉、变异操作算子的具体操作;

void Select(PTSP city)

{//选择算子

int i,j;

double sum=0,r,t;

double p[POPSIZE],q[POPSIZE+1];

int copey[POPSIZE][CITY_NUM+1];

q[0] = 0;

for (i=0;i

sum+=city->fitness[i];

for (i=0;i

{

p[i] = city->fitness[i]/sum;

q[i+1] = q[i]+p[i];

}

for (i=0;i

{

t = rand()%(10000);

r = t/10000;

for (j=0;j

if (r<=q[j+1])

{

*copey[i] = *city->colony[j];

break;

}

}

for (i=0;i

*city->colony[i] = *copey[i];

}

void AOX(PTSP city,int n,int m)//改进启发式算法

{

int A[CITY_NUM-1],B[CITY_NUM-1];

int i,j;

int k=1+CROSS_NUM,t=1+CROSS_NUM;

for (i=0;i

{

A[i] = city->colony[n][i+1];

B[i] = city->colony[m][i+1];

}

for (i=3;i

{

city->colony[n][i-2] = B[i];

city->colony[m][i-2] = A[i];

}

for (i=0;i

{

for (j=0;j

if (A[i] == B[j+3])

break;

if (j == CROSS_NUM)

city->colony[n][k++] = A[i];

for (j=0;j

if (B[i] == A[j+3])

break;

if (j == CROSS_NUM)

city->colony[m][t++] = B[i];

}

}

int check1(int r[],int n)//判重

{

int i;

for (i=0;i

if (r[i] == r[n])

{

return true;

}