旅行商问题(Traveling Salesman Problem,
TSP),又译为旅行推销员问题、货担郎问题,简称为TSP问题,是最基本的路线问题。假设有n个可直达的城市,一销售商从其中的某一城市出发,不重复地走完其余n-1个城市并回到原出发点,在所有可能的路径中求出路径长度最短的一条。
30条染色体
迭代次数:10万次(大概跑一分钟吧)
交叉率:100%(这个可以自己设置,加点小代码就行了)
变异率:0.3(可自己设置)
如果想认真学习此算法,请转移到(也是我写的,非常详细有手就行):https://blog.csdn.net/gassing/article/details/110186682
#include "pch.h"
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include<string>
#include<cmath>
#include<ctime>
#include<fstream>
using namespace std;
double dis[30][31]; //城市之间的距离
int generation; //已经繁衍了多少代
int totalgeneration; //输入的种群繁衍代数
int cities[2][30]; //记录城市坐标 ,cities[][],一维中的0代表x坐标,1代表y坐标;二维代表城市
int citynum = 30; //30个城市
int groupbest[31]; //最优解染色体
double groupbestp; //最优解的占总群的概率
double groupbestfit; //最优解的适应度
int changebest; // 是否用最优解代替新种群
struct group
{
int city[31]; //一维记录城市序号,二三维记录坐标
double p; //占总群的概率
double fit; //适应度
double sum_p; //累计概率
}group[30];
void init_group();//初始种群和城市坐标,计算距离
void calculation();//用来计算种群的p、fit
void savebest();//保存最优解
void change_bestgroup();//精英保留策略,用最优解代替新种群中的最差的染色体
void select();//选择--复制
void crossover();//交叉
void mutation();//变异
int main()
{
int j, flag;
int out = 1; //为0则退出,为1则继续
double distancenum;
while (out)
{
distancenum = 0.0;
flag = 1;
init_group();
while (flag)
{
cout << "请输入种群繁衍代数(100000以内):";
cin >> totalgeneration;
if (totalgeneration <= 100000)
flag = 0;
}
while (totalgeneration--)
{
cout << totalgeneration << endl;
select(); //选择
crossover(); //交叉
mutation(); //变异
}
cout << "最优种群是:" << endl;
for (j = 0; j < citynum + 1; j++)
{
cout << groupbest[j] << " ";
if (j < citynum)
{
distancenum += dis[groupbest[j]][groupbest[j + 1]];
}
}
cout << " 路径长度是 : " << distancenum << ",适应度为 : " << groupbestfit << ",代数为 : " << generation << endl;
cout << "\n输入任意正整数继续,输入0退出:";
cin >> out;
cout << endl;
}
}
void init_group() /* 初始种群和城市坐标,计算距离*/
{
int i, j, random, flag, k;
double ss;
cities[0][0] = 87;//初始化坐标 cities[0][0]城市0的横坐标
cities[1][0] = 7; //cities[1][0]城市0的纵坐标 ,前面第一维表示横纵坐标,第二维代表城市n
cities[0][1] = 91;
cities[1][1] = 38;
cities[0][2] = 83;
cities[1][2] = 46;
cities[0][3] = 71;
cities[1][3] = 44;
cities[0][4] = 64;
cities[1][4] = 60;
cities[0][5] = 68;
cities[1][5] = 58;
cities[0][6] = 83;
cities[1][6] = 69;
cities[0][7] = 87;
cities[1][7] = 76;
cities[0][8] = 74;
cities[1][8] = 78;
cities[0][9] = 71;
cities[1][9] = 71;
cities[0][10