TSP问题 [遗传算法 智能优化算法]
写了半天,效率还是有点低的,以后有空再优化下:
//用次序表示法来表示个体编码 #include<iostream> #include<fstream> #include<stdlib.h> #include<time.h> using namespace std; struct individual{ int DNA[25]; int p; //1-p为可以进行杂交的概率 }; int n; //城市的数量 int dist[25][25]; //城市之间的距离 individual group[11]; //总群,保持总群数量在10以内 individual nextGroup[11]; //总群备份 int size; //总群大小 int varyP=8; //变异概率(总概率为10) int season; #define MAX 9999 void show(int season) { //打印总群 cout<<"time"<<season<<":"<<endl; for(int i=1;i<=size;i++) { for(int j=1;j<=n;j++) { cout<<group[i].DNA[j]<<" "; } cout<<MAX-group[i].p<<endl; } cout<<endl; } //获取相关数据 void getInfo() { ifstream input("input.txt"); input>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { input>>dist[i][j]; } } } //产生初始总群 void original() { //用次序表示法来表示个体编码 srand(unsigned(time(0))); for(int i=1;i<=size;i++) { group[i].DNA[1]=1; for(int j=2;j<=n;j++) { group[i].DNA[j]=rand()%(n-j+1)+1; //根据定义,编码的第i位为1~n-j+1的数 } } } //计算个体的适应度 int adaption(individual individual) { //城市集合的顺序排列 int *t=new int[n]; for(int i=1;i<=n;i++) { t[i]=i; } //根据个体的编码计算巡游城市的顺序 int *order=new int[n]; for(int i=1;i<=n;i++) { //得到下一个要巡游的城市 order[i]=t[individual.DNA[i]]; //在t中将该城市删除 for(int j=individual.DNA[i]+1;j<=n;j++) { t[j-1]=t[j]; } } //根据巡游的顺序计算所需要的代价 int cost=0; //代价总数 cost+=dist[1][order[1]]; for(int i=1;i<n;i++) { cost+=dist[order[i]][order[i+1]]; } cost+=dist[order[n]][1]; return MAX-cost; } //杂交 void hybrid(int individual1,int individual2) { //随机选择基因交换位置 srand(unsigned(time(0))); int p=rand()%n+1;//只能在长度范围内进行交换 int t; for(int i=p;i<=n;i++) { t=group[individual1].DNA[i]; group[individual1].DNA[i]=group[individual2].DNA[i]; group[individual2].DNA[i]=t; } } //变异 void vary(int individual) { //随机选择一个基因变异位置 srand(unsigned(time(0))); int p=rand()%(n-1)+2;//只能在长度范围内变异 group[individual].DNA[p]=rand()%(n-p+1)+1; } //选择接下来进行杂交的个体 void choose() { int total=0; //代价总和 for(int i=1;i<=n;i++) { total+=group[i].p; } //根据概率选择n个个体 srand(unsigned(time(0))); for(int i=1;i<=n;i++) { for(int j=1,p=0,pointer=rand()%total+1;j<=n;j++) { p+=group[j].p; if(p>=pointer) { nextGroup[i]=group[j]; break; } } } //将下一代总群作为当前总群 for(int i=1;i<=n;i++) { group[i]=nextGroup[i]; } } //美丽的大自然 void nature() { srand(unsigned(time(0))); //输入种群大小 cout<<"please input the size of the group:"; cin>>size; //输入将进行的杂次数 cout<<"input the time:"; cin>>season; //获取大自然的信息 getInfo(); //初始化第一代 original(); for(int i=1;i<=season;i++) {//在时间限内发生的事 show(i); for(int j=1;j<size;j++) { //第 j 个个体和第 j+1 个个体进行杂交 hybrid(j,j+1); //有一定的几率个体会发生变异 int p=rand()%10+1; if(p>=varyP) vary(j); //计算个体被选中的概率 group[j].p=adaption(group[j]); //选择优良的个体 choose(); } } show(season); } void main() { nature(); system("pause"); }

浙公网安备 33010602011771号