遗传算法解决TSP问题(C )
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int* b1 = new int[num]; int* b2 = new int[num]; for (int i = 0; i<num; i++) {
a1[i] = city[a][i]; a2[i] = city[b][i]; b1[i] = a2[i]; b2[i] = a1[i]; }
if (p<pc)//满足交叉条件
//开始交叉
convert(p1, p2, a1, b1); convert(p1, p2, a2, b2); for (int i = 0; i<num; i++) {
city[k][i] = b1[i]; city[k + 1][i] = b2[i]; } } else { for (int i = 0; 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; }
int getdis() {
//compute(); int result = dis[0]; int index = 0;
for (int i = 1; i<population; i++) {
if (result > dis[i]) {
result = dis[i]; index = i; } } return result; }
int len = p2 - p1 + 1; int* temp = new int[len]; for (int i = p1; i <= p2; i++) {
temp[i - p1] = src[i]; } int j = (p2 + 1) % num; for (int i = 1; i <= num; i++) {
遗传算法解决TSP问题(C++版) 遗传算法流程:
交叉,编译,计算适应度,保存最优个体。
其中交叉过程是选择最优的两个染色体进行交叉操作,本文采用的
是轮盘赌算法。 #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
{
//选择交叉的两点,并保证p1<p2
int p1 = -1; int p2 = -1; while (p1 == p2) {
p1 = rand() % num; p2 = rand() % num; if (p1>p2) {
swap(p1, p2); } } //cout << "choose pos " << p1 << " " << p2 << endl;
b = city[i][j]; dis[i] += path[a][b]; a = b; } dis[i] += path[b][city[i][0]]; fitness[i] = 1.0 / dis[i];//以距离的倒数作为适应度函数值 total += fitness[i]; } }
//选择适应度高的物种,采用轮盘赌算法 int select() {
#define population 200//种群数量 #define pc 0.9//交叉的概率 #define pm 0.1//变异的概率 #define count 200//迭代的次数 #define num 10//城市的数量
int** city;//存放每个个体的访问顺序 int path[10][10] = {
//最优保存算法 bool isExist(int value, int* array, int len) {
for (int i = 0; i<len; i++) {
if (value == array[i]) return true;
} return false; }
void convert(int p1, int p2, int* src, int* dst) {
result = dis[i]; index = i; } } return index; }
int getMaxDis() {
int result = dis[0]; int index = 0; for (int i = 1; i<population; i++) {
if (result < dis[i]) {
city[k][i] = a1[i]; city[k + 1][i] = a2[i]; } } delete[]a1; delete[]a2; delete[]b1; delete[]b2; } }
//变异,采用对换操作进行变异 void morphis() {
//cout << "do morphis now. " << endl; for (int i = 0; i<population; i++) {
double total = 0; for (int i = 0; i<population; i++) {
total += fitness[i]; } double size = rand() / (double)RAND_MAX * total;//保证不产生 0 //cout << "size " << size << endl; double sum = 0; int i = 0; while (sum <= size&&i<population) {
//交叉,采用次序交叉算法
void cross() {
//cout << "do cross now. " << endl; for (int k = 0; k<population; k += 2) {
int a = select(); int b = select(); while (a == b) {
{ 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;
result = dis[i]; index = i; } } return index; }
void save() {
int current_min_index = getMinDis(); int current_max_index = getMaxDis(); if (dis[current_min_index] < min_dis)
} else {
for (int i = 0; i<num; i++) {
city[current_max_index][i] = min_path[i]; } dis[current_max_index] = min_dis; fitness[current_max_index] = 1.0 / min_dis; } }
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<num; i++) {
b = select();//保证被选中的个体不是一样的 //cout << "same " << b << endl; } //cout << "choose popuilation " << a << " " << b << endl; double p = rand() / double(RAND_MAX); //cout << "cross rate is " << p << endl; int* a1 = new int[num]; int* a2 = new int[num];
a[i] = i; } city = new int*[population]; for (int i = 0; i<population; i++) {
city[i] = new int[num]; } for (int i = 0; i<population; i++) {
for (int j = num - 1; j >= 0; j--) {
//释放申请的数组的空间 void dispose() {
for (int i = 0; i<population; i++) {
delete[]city[i]; } delete[]city; delete[]dis; delete[]fitness; }
int main() {
init();//初始化种群 int i = 0; srand(time(0)); compute(); while (i<count) {
//计算适应度 void compute() {
//cout << "do compute now. " << endl;
double total = 0; for (int i = 0; i<population; i++) {
//计算每种情况下,路径的长度 dis[i] = 0; int a = city[i][0], b; for (int j = 1; j<num; j++) {
sum += fitness[++i]; } return --i;//返回被选中的个体
}
int getMinDis() {
int result = dis[0]; int index = 0; for (int i = 1; i<population; i++) {
if (result > dis[i]) {
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]; }
//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 };
double p = rand() / double(RAND_MAX); //cout << "morphis rate is " << p << endl; if (p<pm)//执行变异 {
int a = -1, b = -1; while (a == b) {
a = rand() % num; b = rand() % num; } swap(city[i][a], city[i][b]); } } }