遺傳演算法模擬解決TSP問題

2021-08-02 23:02:42 字數 4067 閱讀 8429

#include 

#include

#include

#include

#include

#define cities 10  //城市的個數  

#define maxx 100//迭代次數  

#define pc 0.8 //交配概率  

#define pm 0.05 //變異概率

#define num 10//種群的大小  

int bestsolution;//最優染色體

int distance[cities][cities];//城市之間的距離

struct

group

//染色體的結構

group[num],grouptemp[num];  

//隨機產生cities個城市之間的相互距離  

void init()  

}  //列印距離矩陣  

printf("城市的距離矩陣如下\n");  

for(i=0;ifor(j=0;j"%4d",distance[i][j]);  

printf("\n");  

}  }  //隨機產生初試群  

void groupproduce()  

}  if(flag)  

}  }  

//列印種群基因  

printf("初始的種群\n");  

for(i=0;ifor(j=0;j"%4d",group[i].city[j]);  

printf("\n");  

}  }  //評價函式,找出最優染色體  

void pingjia()  

group[i].adapt=sumdistance; //每條染色體的路徑總和  

biggestsum+=sumdistance; //種群的總路徑  

}  //計算染色體的倖存能力,路勁越短生存概率越大  

for(i=0;igroup[i].p=1-(double)group[i].adapt/(double)biggestsum;   

biggestp+=group[i].p;  

}  for(i=0;igroup[i].p=group[i].p/biggestp;  //在種群中的倖存概率,總和為1  

//求最佳路勁  

bestsolution=0;  

for(i=0;iif(group[i].p>group[bestsolution].p)  

bestsolution=i;  

//列印適應度  

for(i=0;i"染色體%d的路徑之和與生存概率分別為%4d  %.4f\n",i,group[i].adapt,group[i].p);  

printf("當前種群的最優染色體是%d號染色體\n",bestsolution);  

}  //選擇  

void xuanze()  

gradient[0]=group[0].p;  

for(i=1;i1]+group[i].p;  

srand((unsigned)time(null));  

//隨機產生染色體的存活概率  

for(i=0;i100);  

xuanze[i]/=100;  

}  //選擇能生存的染色體  

for(i=0;ifor(j=0;jif(xuanze[i]//第i個位置存放第j個染色體  

break;  

}  }  

}  //拷貝種群  

for(i=0;igroup[i].adapt;  

grouptemp[i].p=group[i].p;  

for(j=0;jgroup[i].city[j];  

}  //資料更新  

for(i=0;igroup[i].adapt=grouptemp[temp].adapt;  

group[i].p=grouptemp[temp].p;  

for(j=0;jgroup[i].city[j]=grouptemp[temp].city[j];  

}  //用於測試  

/*     printf("<------------------------------->\n"); 

for(i=0;i}  

//交配,對每個染色體產生交配概率,滿足交配率的染色體進行交配  

void  jiaopei()  

//確定可以交配的染色體  

t=0;  

for(i=0;iif(jiaopeip[i]1;  

t++;  

}  }  

t=t/2*2;//t必須為偶數  

//產生t/2個0-9交配斷點  

srand((unsigned)time(null));  

temp1=0;  

//temp1號染色體和temp2染色體交配  

for(i=0;i2;i++)  

for(j=temp1+1;jif(jiaopeiflag[j]==1)  

//進行基因交配  

if(point1>point2) //保證point1<=point2  

memset(map1,-1,sizeof(map1));  

memset(map2,-1,sizeof(map2));  

//斷點之間的基因產生對映  

for(k=point1;k<=point2;k++)  

//斷點兩邊的基因互換  

for(k=0;kgroup[temp1].city[k];  

group[temp1].city[k]=group[temp2].city[k];  

group[temp2].city[k]=temp;  

}  for(k=point2+1;kgroup[temp1].city[k];  

group[temp1].city[k]=group[temp2].city[k];  

group[temp2].city[k]=temp;  

}  //處理產生的衝突基因  

for(k=0;kfor(kk=point1;kk<=point2;kk++)  

if(group[temp1].city[k]==group[temp1].city[kk])  

}  for(k=point2+1;kfor(kk=point1;kk<=point2;kk++)  

if(group[temp1].city[k]==group[temp1].city[kk])  

}  for(k=0;kfor(kk=point1;kk<=point2;kk++)  

if(group[temp2].city[k]==group[temp2].city[kk])  

}  for(k=point2+1;kfor(kk=point1;kk<=point2;kk++)  

if(group[temp2].city[k]==group[temp2].city[kk])  

}  temp1=temp2+1;  

}  }  //變異  

void bianyi()  

//確定可以變異的染色體  

t=0;  

for(i=0;iif(bianyip[i]1;  

t++;  

}  }  

//變異操作,即交換染色體的兩個節點  

srand((unsigned)time(null));  

for(i=0;iif(bianyiflag[i]==1)  

}  }  int main()  

//最終種群的評價  

printf("\n輸出最終的種群評價\n");  

for(i=0;ifor(j=0;j"%4d",group[i].city[j]);  

}  printf("  adapt:%4d, p:%.4f\n",group[i].adapt,group[i].p);  

}  printf("最優解為%d號染色體\n",bestsolution);  

return

0;  

}

tsp問題 遺傳演算法解決

tsp問題最簡單的求解方法是列舉法。它的解是多維的 多區域性極值的 趨於無窮大的複雜解的空間,搜尋空間是n個點的所有排列的集合,大小為 n 1 可以形象地把解空間看成是乙個無窮大的丘陵地帶,各山峰或山谷的高度即是問題的極值。求解tsp,則是在此不能窮盡的丘陵地帶中攀登以達到山頂或谷底的過程。這一篇將...

遺傳演算法解決TSP問題

基本原理在 中有注釋 1 include2 include 3 include 4 include5 include 6 using std string 7 8struct position9 1617 double tsp int n,struct position position,int t...

使用遺傳演算法解決TSP問題

遺傳演算法顧名思義就是模擬生物界的自然選擇原理,比如對於tsp問題,遺傳演算法大體上是可以先隨機生成一組大量的解空間,作為乙個初始的種群,然後按照一定的策略讓種群自由交叉 也就是傳說中的交配 變異。按照一定的策略淘汰種群中不符合預期目的的個體。目前大多數遺傳演算法使用的是根據隨機生成的概率與給定的交...