#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問題,遺傳演算法大體上是可以先隨機生成一組大量的解空間,作為乙個初始的種群,然後按照一定的策略讓種群自由交叉 也就是傳說中的交配 變異。按照一定的策略淘汰種群中不符合預期目的的個體。目前大多數遺傳演算法使用的是根據隨機生成的概率與給定的交...