logo资料库

遗传算法解决TSP问题(C++版).docx

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
遗传算法解决TSP问题(C++版) 遗传算法流程: 交叉,编译,计算适应度,保存最优个体。 其中交叉过程是选择最优的两个染色体进行交叉操作,本文采用的 是轮盘赌算法。 #include #include #include using namespace std; #define population 200//种群数量 #define pc 0.9//交叉的概率 #define pm 0.1//变异的概率 #define count 200//迭代的次数 #define num 10//城市的数量 int** city;//存放每个个体的访问顺序 int path[10][10] = { //0, 1, 2, 3, 4, 5, 6, 7, 8, 9 { 0, 23, 93, 18, 40, 34, 13, 75, 50, 35 },//0 { 23, 0, 75, 4, 72, 74, 36, 57, 36, 22 },//1 { 93, 75, 0, 64, 21, 73, 51, 25, 74, 89 },//2 { 18, 4, 64, 0, 55, 52, 8, 10, 67, 1 }, //3 { 40, 72, 21, 55, 0, 43, 64, 6, 99, 74 }, //4 { 34, 74, 73, 52, 43, 0, 43, 66, 52, 39 },//5 { 13, 36, 51, 8, 64, 43, 0, 16, 57, 94 },//6 { 75, 57, 25, 10, 6, 66, 16, 0, 23, 11 }, //7 { 50, 36, 74, 67, 99, 52, 57, 23, 0, 42 },//8 { 35, 22, 89, 1, 74, 39, 94, 11, 42, 0 }//9 }; int* dis;//存放每个个体的访问顺序下的路径长度 double* fitness;//存放灭个个体的适应度 int min_dis = 1000000; int min_index = -1;
int* min_path; //初始化种群 void init() { int *a = new int[num]; for (int i = 0; i= 0; j--) { int n = rand() % (j + 1);//产出的数是0-j,保证交换的后面 的数不会再被交换 swap(a[j], a[n]);//保证a里面全是0-(num-1)的数,无重复 的数,只是顺序颠倒 city[i][j] = a[j]; } } delete[]a; dis = new int[population]; fitness = new double[population]; min_path = new int[num]; } //计算适应度 void compute() { //cout << "do compute now. " << endl;
double total = 0; for (int i = 0; i
} } } } } int getMinDis() { int result = dis[0]; int index = 0; for (int i = 1; i dis[i]) { result = dis[i]; index = i; } return index; int getMaxDis() { int result = dis[0]; int index = 0; for (int i = 1; i
min_dis = dis[current_min_index]; for (int i = 0; i < num; i++) { min_path[i] = city[current_min_index][i]; } //cout << "current min dis is: " << min_dis << endl; for (int i = 0; i
temp[i - p1] = src[i]; } int j = (p2 + 1) % num; for (int i = 1; i <= num; i++) { int index = (i + p2) % num; if (!isExist(dst[index], temp, len)) { dst[j] = dst[index]; j = (j + 1) % num; } } for (int i = p1; i <= p2; i++) { dst[i] = src[i]; } delete[]temp; } //交叉,采用次序交叉算法 void cross() { //cout << "do cross now. " << endl; for (int k = 0; k
int* b1 = new int[num]; int* b2 = new int[num]; for (int i = 0; ip2) { swap(p1, p2); } } //cout << "choose pos " << p1 << " " << p2 << endl; //开始交叉 convert(p1, p2, a1, b1); convert(p1, p2, a2, b2); for (int i = 0; i
city[k][i] = a1[i]; city[k + 1][i] = a2[i]; } } delete[]a1; delete[]a2; delete[]b1; delete[]b2; } } //变异,采用对换操作进行变异 void morphis() { } } } int getdis() { //compute(); int result = dis[0]; int index = 0; //cout << "do morphis now. " << endl; for (int i = 0; i
分享到:
收藏