c++代码实现遗传算法遍历无向图求经过所有节点求最短路径
时间: 2023-08-12 08:16:36 浏览: 107
基于遗传算法的最短路径的程序的开发(C++)
5星 · 资源好评率100%
好的,我来给您提供一份参考代码,实现遗传算法遍历无向图求经过所有节点求最短路径。
```cpp
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5;//最大点数
double dis[maxn][maxn];//距离矩阵
int n,m;//n表示总点数,m表示种群大小
int chrom[maxn];//染色体
double sum,maxf,minf,avef;//种群适应度
double p[maxn];//个体适应度
double r[maxn];//选择概率
int ans[maxn];//最优个体
int cnt;//当前遗传代数
//初始化种群
void init()
{
for(int i=1;i<=m;++i)
{
for(int j=1;j<=n;++j)
chrom[j]=j;
random_shuffle(chrom+1,chrom+n+1);
double len=0;
for(int j=1;j<n;++j)
len+=dis[chrom[j]][chrom[j+1]];
len+=dis[chrom[n]][chrom[1]];
p[i]=1.0/len;
}
}
//计算适应度
void calc()
{
sum=maxf=0;
minf=1e9;
for(int i=1;i<=m;++i)
{
double len=0;
for(int j=1;j<n;++j)
len+=dis[chrom[j]][chrom[j+1]];
len+=dis[chrom[n]][chrom[1]];
p[i]=1.0/len;
sum+=p[i];
maxf=max(maxf,p[i]);
minf=min(minf,p[i]);
if(p[i]>p[ans[1]])
ans[1]=i;
}
sort(p+1,p+m+1);
avef=sum/m;
}
//选择操作
void selection()
{
for(int i=1;i<=m;++i)
r[i]=p[i]/sum;
for(int i=2;i<=m;++i)
r[i]+=r[i-1];
double* pos=lower_bound(r+1,r+m+1,(double)rand()/RAND_MAX);
int x=pos-r;
memcpy(chrom+1,chrom+x,sizeof(int)*n);
}
//交叉操作
void crossover()
{
int a=rand()%n+1,b=rand()%n+1;
if(a>b)
swap(a,b);
static int tmp[maxn];
memset(tmp,0,sizeof(tmp));
for(int i=a;i<=b;++i)
tmp[chrom[i]]=1;
int pos=1;
for(int i=1;i<=n;++i)
if(!tmp[chrom[i]])
chrom[pos++]=chrom[i];
memcpy(chrom+a,tmp+1,sizeof(int)*n);
}
//变异操作
void mutation()
{
int a=rand()%n+1,b=rand()%n+1;
if(a>b)
swap(a,b);
reverse(chrom+a,chrom+b+1);
}
//遗传算法主体
void solve()
{
for(cnt=1;cnt<=10000;++cnt)
{
selection();
double rate=rand()/(double)RAND_MAX;
if(rate<0.8)
crossover();
rate=rand()/(double)RAND_MAX;
if(rate<0.1)
mutation();
calc();
if(cnt-ans[2]>=1000)
break;
}
printf("最短路径长度为%.2lf,路径为:\n",1.0/p[ans[1]]);
for(int i=1;i<=n;++i)
printf("%d ",chrom[i]);
printf("\n");
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%lf",&dis[i][j]);
m=100;
init();
calc();
ans[1]=1;
ans[2]=0;
solve();
return 0;
}
```
在这份代码中,我们采用了遗传算法来寻找经过所有节点的最短路径。其中,我们使用了一个距离矩阵存储无向图中各个节点之间的距离,然后随机生成初始种群,通过计算每个个体的适应度,选择、交叉、变异操作来不断优化种群,最终得到最短路径。
需要注意的是,这份代码中的交叉、变异操作仅为示例,具体的交叉、变异方式可以根据实际情况进行调整。此外,我们也可以通过更改参数来调整算法的性能,比如增大种群规模、增加遗传代数等等。
阅读全文