資源簡介
本程序是采用C++實現的遺傳算法實現TSP問題,城市數不多,但是思想很清楚,有用的就下吧。
代碼片段和文件信息
#include
#include
#include
#include
using?namespace?std;
#define?N?5????????????//群體規模N數字0~9對應A~J
#define?Pc?0.75????????//交配概率Pc
#define?Pw?0.01????????//變異概率Pw
#define MAX?200????????//沒有直接連接設為MAX,值200與計算概率有關
int?small=1000;
int?t=0;???????????????//代數
int?F(int?*a);?????????//適應函數
void?mating();?????????//交配函數
void?change();?????????//變異函數
int?sol[N];????????????//最優解
int?chrom[N];??????????//染色體
int?chromnew[N];???????//交配后獲得的新染色體
int?group[N][N+1];?????//初始群體
float?group_p[N][1];???//群體中染色體被選中概率
int?race[N][N+1];??????//種群
float?race_p[N][1];????//種群中染色體被選中概率
int?variation_count=0;???//計算變異次數
//構造城市圖0~4對應A~E
//最短路徑?0?1?3?4?2?F()=9
//?????????0?1?3?2?4,F()=10
int?array[N][N]=
{
{MAX1MAXMAXMAX}
{1MAXMAX2MAX}
{MAXMAXMAX34}
{MAX23MAX2}
{MAXMAX42MAX}
};
void?show_sol()
{
cout< }
//顯示group[N][N+1]的內容
void?show_group(int?**group)
{
int?ij;
int?y=0;
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
{
cout<<*((int*)group+6*i+j)<<“?“;?
}
cout< }
}
//顯示race[N][N+1]的內容
void?show_race(int?**race)
{
int?ij;
int?y=0;
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
{
cout<<*((int*)race+6*i+j)<<“?“;?
}
cout< }
}
//生成單個染色體函數,存于chrom[N]中
void?create_chrom()
{
srand(time(0)%rand()^rand());
for(int?i=0;i {
chrom[i]=rand()%N;?
}
while(chrom[0]==chrom[1])?chrom[1]=rand()%N;
while(chrom[0]==chrom[2]||chrom[1]==chrom[2])?chrom[2]=rand()%N;
while(chrom[0]==chrom[3]||chrom[1]==chrom[3]||chrom[2]==chrom[3])?chrom[3]=rand()%N;
while(chrom[0]==chrom[4]||chrom[1]==chrom[4]||chrom[2]==chrom[4]||chrom[3]==chrom[4])?chrom[4]=rand()%N;
}
//計算適應值函數
int?F(int?*a)
{
int?temp=0;
for(int?i=0;i {
temp=array[a[i]][a[i+1]]+temp;
}
return?temp;
}
//隨機生成N個染色體作為初始群體
//用函數F()計算每個染色體的適應值并存在group[i][5]中
void?create_group()
{?
for(int?i=0;i {
create_chrom();
group[i][5]=F(chrom);
for(int?j=0;j {
group[i][j]=chrom[j];
}
}
}
//計算概率函數
void?prob_group(int?**group)
{
int?i;
int?y=0;
int?temp=0;
float?P=0;
for(i=0;i<5;i++)
{
temp=temp+1000-*((int*)group+6*i+5);
}
cout< for(i=0;i<5;i++)
{
P=float(1000-*((int*)group+6*i+5))/temp;
group_p[i][0]=P;
}
}
//計算概率函數
void?prob_race(int?**race)
{
int?i;
int?y=0;
int?temp=0;
float?P=0;
for(i=0;i<5;i++)
{
temp=temp+1000-*((int*)race+6*i+5);
}
//cout< for(i=0;i<5;i++)
{
P=float(1000-*((int*)race+6*i+5))/temp;
race_p[i][0]=P;
}
}
//選擇函數
void?choose()
{
int?i=0
- 上一篇:GPS衛星位置的計算
- 下一篇:Effective C++簡體中文 完整書簽
評論
共有 條評論