《蚁群算法的Matlab程序.doc》由会员分享,可在线阅读,更多相关《蚁群算法的Matlab程序.doc(5页珍藏版)》请在金锄头文库上搜索。
1、#include#include#include#include#define citynumber 5#define Q 100#define p 0.5#define NM2 1000#define A 1#define B 5int ccdi=-1;/全局变量,用在myrand()中float myrand()/产生0-1随机数,100个,每调用一次,结果不同srand(time(0);float my100;ccdi+;if (ccdi=100) ccdi=0;for(int mi=0;mi100;mi+)float fav=rand()%10000;mymi=fav/10000;re
2、turn myccdi;double fpkij(double Tcitynumbercitynumber,double ncitynumbercitynumber,int tabucitynumbercitynumber,int k,int s,int i,int j )/定义函数用于计算Pij /double A=0.5,B=0.5; double sumup,pkij,sumdown; sumdown=0;for(int aTi=0;aTicitynumber;aTi+) for(int aTj=0;aTjcitynumber;aTj+) aTaTiaTj=pow(TaTiaTj,A);
3、 for(int bni=0;bnicitynumber;bni+) for(int bnj=0;bnjcitynumber;bnj+) bnbnibnj=pow(nbnibnj,B); for (int can=0;cancitynumber;can+)/判断,除掉已经走过的城市if(can=tabukci) aTican=0;bnican=0; sumup=aTij*bnij; for(int tj=0;tjcitynumber;tj+) sumdown=aTitj*bnitj+sumdown;pkij=sumup/sumdown;return pkij;void main()double
4、 citycitynumber2=0,1,0,2,2,2,2,4,1,3/*,3,4,4,7,2,8,3,9,1,10,1,0,2,1,3,0,4,9,5,2,6,2,7,1,8,6,9,0,10,3*/; /*城市坐标*/ double dcitynumbercitynumber; /Ljk是城市j to k距离 for(int j=0;jcitynumber;j+) djk=sqrt(cityj0-cityk0)*(cityj0-cityk0)+(cityj1-cityk1)*(cityj1-cityk1);/ coutdjk ; /coutn; /*计算距离,从j城市到k城市*/ /*f
5、or (int cj=0;cj10;cj+) float c=myrand(); coutc n;*/输出随机数 double ncitynumbercitynumber;for(int ni=0;nicitynumber;ni+)for(int j=0;jcitynumber;j+)/coutn; /*初始化visibility nij*/double Lcitynumber;int shortestcitynumber;double Tcitynumbercitynumber;for(int ti=0;ticitynumber;ti+)for (int j=0;jcitynumber;j+
6、) /coutTtij ;/coutn;/*初始化t*/ double changTcitynumbercitynumber;/step2:for(int NC=0;NCNM2;NC+)for(int cti=0;cticitynumber;cti+) for (int j=0;jcitynumber;j+) changTctij=0;/coutchangTctij ;/coutn;/*初始化changT*/int tabucitynumbercitynumber;/tabuks表示第k只蚂蚁,第s次循环所在的城市for (int i=0;icitynumber;i+) tabutaii=0;
7、for (int tabui1=0;tabui1citynumber;tabui1+)tabutabui10=tabui1;/*for (tai=0;taicitynumber;tai+)for (int i=0;icitynumber;i+) couttabutaii ;coutn;*/初始化tabufor(int kk=0;kkcitynumber;kk+) Lkk=0; /第三步开始for(int s=0;scitynumber-1;s+)for(int k=0;kcitynumber;) int ci,can;float sumpk=0;float pkij;hq2: can+; if
8、 (can=citynumber) can=0; for (ci=0;ci=s;ci+) if(can=tabukci) goto hq2; pkij=fpkij(T,n,tabu,k,s,tabuks,can); sumpk=sumpk+pkij; else goto hq2; tabuks+1=can; k+;/第三步完成 /*for (tai=0;taicitynumber;tai+)for (int i=0;icitynumber;i+) */输出一个循环后的tabu/第四步开始 for(int k4=0;k4citynumber;k4+) s44=s4+1; if (s44=city
9、number) s44=0; Lk4+=dtabuk4s4tabuk4s44; /coutLk4 ; /计算Lkfloat shortest1=0; int short2=0;/最短距离for(ii=1;shorticitber;shi+ )shortest1=L0; if(Lshorti=shortest1)shortest1=Lshorti;short2=shorti;/coutLsort2n;coutshort2n; for(int shoi=0;shoictynumber;shoi+)shortestshoi=tabushort2shoi;/coutshestshoi ;/coutn;
10、 for(int k41=0;k41citynumber;k41+) for(int s41=0,ss=0;s41citynumber;s41+) ss=s41+1; if (ss=citynumber) ss=0; changTtabuk41s41tabuk41ss+=Q/Lk41; changTtabuk41sstabuk41s41=changTtabuk41s41tabuk41ss; /* for(int cti4=0;cti4citynumber;cti4+) for (int j=0;jcitynumber;j+)coutchangTcti4j ;coutn; */ /第四步完 / 第五步开始 for(int i5=0;i5citynumber;i5+) for(int j5=0;j5citynumber;j5+) / coutTi5j5 ; /coutn; for(int shoi1=0;shoi1citynumber;shoi1+)coutcityshortestshoi10 cityshortestshoi11 ;