遗传算法解决10城市TSP问题程序源代码

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

#include "stdio.h"

#include "stdlib.h"

#include "conio.h"

#include "math.h"

#include "time.h"

#define num_C 10 //城市个数

#define N 100 //群体规模为100

#define pc 0.9 //交叉概率为0.9

#define pm 0.1 //变异概率为10%

#define ps 0.6 //进行选择时保留的比例

#define genmax 200 //最大代数200

int RandomInteger(int low,int high);

void Initial_gen(struct unit group[N]);

void Sort(struct unit group[N]);

void Copy_unit(struct unit *p1,struct unit *p2);

int search_son(int son[num_C],int k);

void Cross(struct unit *p1,struct unit *p2);

void Varation(struct unit group[N],int i);

void Evolution(struct unit group[N]);

void Calculate_cost(struct unit *p);

void Print_optimum(struct unit group[N]);

/* 定义个体信息*/

typedef struct unit

{

int path[num_C]; //个体的路径信息

int cost; //个体代价值

};

struct unit group[N]; //种群变量group

int num_gen=0; //记录当前达到第几代

/***************************************************************************/ /* 城市间的距离信息:*/ /* 北京天津武汉深圳长沙成都杭州西安拉萨南昌*/ /* (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) */

/* 北京(0) 0 118 1272 2567 1653 2097 1425 1177 3947 1574 */ /* 天津(1) 118 0 1253 2511 1633 2077 1369 1157 3961 1518 */ /* 武汉(2) 1272 1253 0 1462 380 1490 821 856 3660 385 */ /* 深圳(3) 2567 2511 1462 0 922 2335 1562 2165 3995 933 */ /* 长沙(4) 1653 1633 380 922 0 1700 1041 1135 3870 456 */ /* 成都(5) 2097 2077 1490 2335 1700 0 2311 920 2170 1920 */ /* 杭州(6) 1425 1369 821 1562 1041 2311 0 1420 4290 626 */ /* 西安(7) 1177 1157 856 2165 1135 920 1420 0 2870 1290 */ /* 拉萨(8) 3947 3961 3660 3995 3870 2170 4290 2870 0 4090 */ /* 南昌(9) 1574 1518 385 993 456 1920 626 1290 4090 0 */ /***************************************************************************/

int Cost_table[10][10]={{0,118,1272,2567,1653,2097,1425,1177,3947,1574},

{118,0,1253,2511,1633,2077,1369,1157,3961,1518},

{1272,1253,0,1462,380,1490,821,856,3660,385},

{2567,2511,1462,0,922,2335,1562,2165,3995,933},

{1653,1633,380,922,0,1700,1041,1135,3870,456},

{2097,2077,1490,2335,1700,0,2311,920,2170,1920},

{1425,1369,821,1562,1041,2311,0,1420,4290,626},

{1177,1157,856,2165,1135,920,1420,0,2870,1290},

{3947,3961,3660,3995,3870,2170,4290,2870,0,4090},

{1574,1518,385,993,456,1920,626,1290,4090,0}};

int main()

{

srand((int)time(NULL)); //初始化随机数发生器

Initial_gen(group); //初始化种群

Evolution(group); //进化:选择、交叉、变异

getch();

return 0;

}

/* 初始化种群*/

void Initial_gen(struct unit group[N])

{

int i,j,k;

struct unit *p;

for(i=0;i<=N-1;i++) //初始化种群里的100个个体

{

p=&group[i]; //p指向种群的第i个个体

for(j=0;j<=num_C-1;j++) //生成10个城市间的一个随机路径

{

k=0;

if(j==0) p->path[j]=RandomInteger(0,num_C-1);

else

{

p->path[j]=RandomInteger(0,num_C-1);

while(k

{

//与之前城市重复,重新生成一个城市

if(p->path[j]==p->path[k]){p->path[j]=RandomInteger(0,num_C-1); k=0; }

else k++;

}//end while

}

}//end 生成路径

Calculate_cost(p); //计算该路径的代价值

}//end 初始化种群

相关文档
最新文档