当前位置:编程学习 > C#/ASP.NET >>

蚁群改进算法,求教大神,急急急!

#include <iostream.h> 
#include <math.h> 
#include <time.h> 
#include <stdlib.h>
#define INF 100
#define maxsize 100//定义数组长度
#define N 30 //城市数量
#define M 30 //蚂蚁数量

typedef struct//图中弧结点定义
{ int adj;
}ArcCell;
typedef struct//图结构体定义
{ int vex[maxsize];
ArcCell edge[maxsize][maxsize];
int n,e;
}MGraph;
int loacte(MGraph g,int v)//顶点对应的数组编号
{ int i; i=v;
return i;
}
void CreateGraph(MGraph &g)//构建图
{ int i,j,k;
cout<<"用邻接矩阵表示法构造一个无向图"<<endl<<"输入顶点个数和边条数:";
cin>>g.n>>g.e;
int d[maxsize]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29};
for(i=0;i<g.n;++i)
{ g.vex[i]=d[i];
}
for(i=0;i<g.n;++i)
{ for(j=0;j<g.n;++j)
if(i==j)
g.edge[i][j].adj=0;
else
g.edge[i][j].adj=INF;
}
int a[maxsize]={0,1,2,3,4,4,5,5,6,7,8,9,10,10,11,12,13,14,14,15,15,15,16,17,18,18,19,20,21,22,23,25,27,28};
int b[maxsize]={4,5,4,6,8,10,7,10,7,14,11,14,12,15,19,19,14,16,18,16,17,21,20,19,24,25,22,23,22,27,26,26,28,29};
int c[maxsize]={76,45,14,20,18,25,10,36,25,41,32,42,26,29,23,19,35,13,12,27,27,17,10,11,20,18,6,5,13,42,11,9,12,11};
for(k=0;k<g.e;++k)
{ i=loacte(g,a[k]/*v1*/);j=loacte(g,b[k]/*v2*/);
g.edge[i][j].adj=g.edge[j][i].adj=c[k]/*w*/;
}
/* for(i=0;i<g.n;++i)//打印输出图的邻接矩阵表
{ for(j=0;j<g.n;++j)
cout<<g.edge[i][j].adj<<" ";
cout<<endl;
}*/
}

int NcMax,scope; 

int tabu[M][N],route[M][N],BestRoute[N];//决定路径和路径长度的

double distance[N][N]/*={{0,2,9,1},{2,0,1,99},{9,1,0,4},{1,99,4,0}}*/;
double solution[M];

double tao[N][N],yita[N][N],detatao[N][N];//决定选择路径概率p
double alfa=2,beta=1,rou=0.9,Q=100;//定义的变量分别为信息启发因子,期望启发式因子,全局信息素挥发参数,局部信息素挥发参数, 状态转移公式中的q0。 

double inittao=10,BestSolution=100000;

double EvalueSolution(int *a)//计算路径长度

double dist=0;
for(int i=0;i<N;i++)
{
if(a[i+1]!=-1)
dist+=distance[a[i]][a[i+1]];
}
return dist; 


void main() 
{

MGraph g;
CreateGraph(g);

int nc=0;
cout<<"---------用蚁群算法解决最短路径问题---------"<<endl;
int u,v;
cout<<"输入起始节点:"; cin>>u;
cout<<"输入终结节点:"; cin>>v;

cout<<"输入NcMax值:";
cin>>NcMax;//最大迭代次数

// cout<<"输入参数alfa,beta,rou,Q和随机数范围scope值:";
// cin>>alfa>>beta>>rou>>Q>>scope;

for(int i=0;i<N;i++) 
for(int j=0;j<N;j++)  
distance[i][j]=distance[j][i]=g.edge[j][i].adj;

    
for(i=0;i<N;i++)//启发因子计算
for(int j=0;j<N;j++) 
{  tao[i][j]=inittao; 
if(j!=i) 
yita[i][j]=1/distance[i][j]; 

for(int k=0;k<M;k++) //初始化
for(i=0;i<N;i++) 
{
route[k][i]=-1; 
tabu[k][i]=0;
}

for(k=0;k<M;k++) 
{
route[k][0]=u;//将蚂蚁都放到同一起点
tabu[k][route[k][0]]=1; 


srand(time(0));

while(nc<NcMax)//每只蚂蚁试图找出最短路径

int s=1; 
int p[M];//设置标志数组
double partsum; 
double pper; 
double drand,jrand; 
for( k=0;k<M;k++)
p[k]=0;
while(s<N)//step 

for(int k=0;k<M;k++) 

if(p[k]==0)//判断蚂蚁k是否走到终点,如走到则终止循环
{
/* while(1)
{
jrand=(rand())%999999; 
//drand=jrand/1000000; 
if((jrand/100000)!=0)
break;
}*/
jrand=rand()%999;
drand=jrand/10000;
// cout<<drand<<"--";
partsum=0; 
pper=0; 
for(int j=0;j<N;j++) 

if(tabu[k][j]==0&&route[k][s-1]!=-1) 
//partsum=partsum+tao[route[k][s-1]][j]*yita[route[k][s-1]][j];
partsum=partsum+pow(tao[route[k][s-1]][j],alfa)*pow(yita[route[k][s-1]][j],beta);//计算概率p的分母值 
cout<<j<<" "<<partsum<<"分";

}
for( j=0;j<N;j++) 

if(tabu[k][j]==0&&route[k][s-1]!=-1)
//pper=(tao[route[k][s-1]][j]*yita[route[k][s-1]][j])/partsum;
pper=pow(tao[route[k][s-1]][j],alfa)*pow(yita[route[k][s-1]][j],beta)/partsum;//计算概率p 
// cout<<"j值"<<j<<" "<<"概率"<<pper<<"随机数"<<drand;
if(pper>drand) 
{
tabu[k][j]=1;
route[k][s]=j;
}
if(pper>drand) //有可能随机产生的drand太大
break;
}
//cout<<endl;
if(j==v)//标志出蚂蚁k已走到终点
p[k]=1;
}

cout<<"概率"<<pper<<" "<<s;
cout<<endl;
s++; 
}

for(i=0;i<N;i++) 
for(int j=0;j<N;j++) 
detatao[i][j]=0; 


for(k=0;k<M;k++) 

if(EvalueSolution(route[k])!=0)//if
{
solution[k]=EvalueSolution(route[k]); 
if(solution[k]<BestSolution) 
{  BestSolution=solution[k]; 
for(s=0;s<N;s++) 
{
BestRoute[s]=route[k][s];//将最短路径节点存储到BestRoute数组中 
}
}
}//if


for(k=0;k<M;k++)//计算信息素增量 
{
for(s=0;s<N-1;s++)
if(route[k][s]!=-1)
{
detatao[route[k][s]][route[k][s+1]]+=Q/solution[k];
}


for(i=0;i<N;i++)//更新信息素 
for(int j=0;j<N;j++) 
{  tao[i][j]=rou*tao[i][j]+detatao[i][j]; 
if(tao[i][j]<5) 
tao[i][j]=5; 
if(tao[i][j]>15) 
tao[i][j]=15; 


for(k=0;k<M;k++)// 重新初始化tabu/route
for(int j=0;j<N;j++) 

tabu[k][j]=0;
tabu[k][route[k][0]]=1; 


for(k=0;k<M;k++)// 重新初始化tabu/route
for(int j=1;j<N;j++) 
route[k][j]=-1; 
nc++; 
}//whlie循环结束

cout<<"当NcMax="<<NcMax<<"时,用蚁群算法找到起终点间的最短路径为:";
for(i=0;i<N;i++)
if(BestRoute[i]!=-1)
{
cout<<BestRoute[i]<<" ";
}
cout<<";其最短路径长度为:"<<BestSolution<<endl;


} 程序为改进蚁群算法求解单源点最短路径 --------------------编程问答-------------------- 走错门了吧!这是.net板块 --------------------编程问答--------------------
引用 楼主 u010680550 的回复:
#include <iostream.h> 
#include <math.h> 
#include <time.h> 
#include <stdlib.h>
#define INF 100
#define maxsize 100//定义数组长度
#define N 30 //城市数量
#define M 30 //蚂蚁数量

typedef struct//图中弧结点定义
{ int adj;
}ArcCell;
typedef struct//图结构体定义
{ int vex[maxsize];
ArcCell edge[maxsize][maxsize];
int n,e;
}MGraph;
int loacte(MGraph g,int v)//顶点对应的数组编号
{ int i; i=v;
return i;
}
void CreateGraph(MGraph &g)//构建图
{ int i,j,k;
cout<<"用邻接矩阵表示法构造一个无向图"<<endl<<"输入顶点个数和边条数:";
cin>>g.n>>g.e;
int d[maxsize]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29};
for(i=0;i<g.n;++i)
{ g.vex[i]=d[i];
}
for(i=0;i<g.n;++i)
{ for(j=0;j<g.n;++j)
if(i==j)
g.edge[i][j].adj=0;
else
g.edge[i][j].adj=INF;
}
int a[maxsize]={0,1,2,3,4,4,5,5,6,7,8,9,10,10,11,12,13,14,14,15,15,15,16,17,18,18,19,20,21,22,23,25,27,28};
int b[maxsize]={4,5,4,6,8,10,7,10,7,14,11,14,12,15,19,19,14,16,18,16,17,21,20,19,24,25,22,23,22,27,26,26,28,29};
int c[maxsize]={76,45,14,20,18,25,10,36,25,41,32,42,26,29,23,19,35,13,12,27,27,17,10,11,20,18,6,5,13,42,11,9,12,11};
for(k=0;k<g.e;++k)
{ i=loacte(g,a[k]/*v1*/);j=loacte(g,b[k]/*v2*/);
g.edge[i][j].adj=g.edge[j][i].adj=c[k]/*w*/;
}
/* for(i=0;i<g.n;++i)//打印输出图的邻接矩阵表
{ for(j=0;j<g.n;++j)
cout<<g.edge[i][j].adj<<" ";
cout<<endl;
}*/
}

int NcMax,scope; 

int tabu[M][N],route[M][N],BestRoute[N];//决定路径和路径长度的

double distance[N][N]/*={{0,2,9,1},{2,0,1,99},{9,1,0,4},{1,99,4,0}}*/;
double solution[M];

double tao[N][N],yita[N][N],detatao[N][N];//决定选择路径概率p
double alfa=2,beta=1,rou=0.9,Q=100;//定义的变量分别为信息启发因子,期望启发式因子,全局信息素挥发参数,局部信息素挥发参数, 状态转移公式中的q0。 

double inittao=10,BestSolution=100000;

double EvalueSolution(int *a)//计算路径长度

double dist=0;
for(int i=0;i<N;i++)
{
if(a[i+1]!=-1)
dist+=distance[a[i]][a[i+1]];
}
return dist; 


void main() 
{

MGraph g;
CreateGraph(g);

int nc=0;
cout<<"---------用蚁群算法解决最短路径问题---------"<<endl;
int u,v;
cout<<"输入起始节点:"; cin>>u;
cout<<"输入终结节点:"; cin>>v;

cout<<"输入NcMax值:";
cin>>NcMax;//最大迭代次数

// cout<<"输入参数alfa,beta,rou,Q和随机数范围scope值:";
// cin>>alfa>>beta>>rou>>Q>>scope;

for(int i=0;i<N;i++) 
for(int j=0;j<N;j++)  
distance[i][j]=distance[j][i]=g.edge[j][i].adj;

    
for(i=0;i<N;i++)//启发因子计算
for(int j=0;j<N;j++) 
{  tao[i][j]=inittao; 
if(j!=i) 
yita[i][j]=1/distance[i][j]; 

for(int k=0;k<M;k++) //初始化
for(i=0;i<N;i++) 
{
route[k][i]=-1; 
tabu[k][i]=0;
}

for(k=0;k<M;k++) 
{
route[k][0]=u;//将蚂蚁都放到同一起点
tabu[k][route[k][0]]=1; 


srand(time(0));

while(nc<NcMax)//每只蚂蚁试图找出最短路径

int s=1; 
int p[M];//设置标志数组
double partsum; 
double pper; 
double drand,jrand; 
for( k=0;k<M;k++)
p[k]=0;
while(s<N)//step 

for(int k=0;k<M;k++) 

if(p[k]==0)//判断蚂蚁k是否走到终点,如走到则终止循环
{
/* while(1)
{
jrand=(rand())%999999; 
//drand=jrand/1000000; 
if((jrand/100000)!=0)
break;
}*/
jrand=rand()%999;
drand=jrand/10000;
// cout<<drand<<"--";
partsum=0; 
pper=0; 
for(int j=0;j<N;j++) 

if(tabu[k][j]==0&&route[k][s-1]!=-1) 
//partsum=partsum+tao[route[k][s-1]][j]*yita[route[k][s-1]][j];
partsum=partsum+pow(tao[route[k][s-1]][j],alfa)*pow(yita[route[k][s-1]][j],beta);//计算概率p的分母值 
cout<<j<<" "<<partsum<<"分";

}
for( j=0;j<N;j++) 

if(tabu[k][j]==0&&route[k][s-1]!=-1)
//pper=(tao[route[k][s-1]][j]*yita[route[k][s-1]][j])/partsum;
pper=pow(tao[route[k][s-1]][j],alfa)*pow(yita[route[k][s-1]][j],beta)/partsum;//计算概率p 
// cout<<"j值"<<j<<" "<<"概率"<<pper<<"随机数"<<drand;
if(pper>drand) 
{
tabu[k][j]=1;
route[k][s]=j;
}
if(pper>drand) //有可能随机产生的drand太大
break;
}
//cout<<endl;
if(j==v)//标志出蚂蚁k已走到终点
p[k]=1;
}

cout<<"概率"<<pper<<" "<<s;
cout<<endl;
s++; 
}

for(i=0;i<N;i++) 
for(int j=0;j<N;j++) 
detatao[i][j]=0; 


for(k=0;k<M;k++) 

if(EvalueSolution(route[k])!=0)//if
{
solution[k]=EvalueSolution(route[k]); 
if(solution[k]<BestSolution) 
{  BestSolution=solution[k]; 
for(s=0;s<N;s++) 
{
BestRoute[s]=route[k][s];//将最短路径节点存储到BestRoute数组中 
}
}
}//if


for(k=0;k<M;k++)//计算信息素增量 
{
for(s=0;s<N-1;s++)
if(route[k][s]!=-1)
{
detatao[route[k][s]][route[k][s+1]]+=Q/solution[k];
}


for(i=0;i<N;i++)//更新信息素 
for(int j=0;j<N;j++) 
{  tao[i][j]=rou*tao[i][j]+detatao[i][j]; 
if(tao[i][j]<5) 
tao[i][j]=5; 
if(tao[i][j]>15) 
tao[i][j]=15; 


for(k=0;k<M;k++)// 重新初始化tabu/route
for(int j=0;j<N;j++) 

tabu[k][j]=0;
tabu[k][route[k][0]]=1; 


for(k=0;k<M;k++)// 重新初始化tabu/route
for(int j=1;j<N;j++) 
route[k][j]=-1; 
nc++; 
}//whlie循环结束

cout<<"当NcMax="<<NcMax<<"时,用蚁群算法找到起终点间的最短路径为:";
for(i=0;i<N;i++)
if(BestRoute[i]!=-1)
{
cout<<BestRoute[i]<<" ";
}
cout<<";其最短路径长度为:"<<BestSolution<<endl;


}


C++...错了门吧...
参考一下蜂穴算法吧, --------------------编程问答-------------------- c++ 不懂啊。。。。。 --------------------编程问答-------------------- 你这不是C#啊 你发错地方了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,