当前位置:   article > 正文

MATLAB实现蚁群算法(完整可直接使用!!)_蚁群算法matlab代码

蚁群算法matlab代码
  1. #include<iostream.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #include<math.h>
  5. #define citynumber 5
  6. #define Q 100
  7. #define p 0.5
  8. #define NM2 1000
  9. #define A 1
  10. #define B 5
  11. int ccdi=-1;//全局变量,用在myrand()中
  12. float myrand()//产生0-1随机数,100个,每调用一次,结果不同
  13. {srand(time(0));
  14. float my[100];
  15. ccdi++;
  16. if (ccdi==100)
  17. ccdi=0;
  18. for(int mi=0;mi<100;mi++)
  19. {float fav=rand()%10000;
  20. my[mi]=fav/10000;}
  21. return my[ccdi];
  22. }
  23. double fpkij(double T[citynumber][citynumber],double n[citynumber][citynumber],int tabu[citynumber][citynumber],int k,int s,int i,int j )
  24. //定义函数用于计算Pij
  25. {
  26. //double A=0.5,B=0.5;
  27. double sumup,pkij,sumdown;
  28. sumdown=0;
  29. for(int aTi=0;aTi<citynumber;aTi++)
  30. {
  31. for(int aTj=0;aTj<citynumber;aTj++)
  32. aT[aTi][aTj]=pow(T[aTi][aTj],A);
  33. }
  34. for(int bni=0;bni<citynumber;bni++)
  35. {
  36. for(int bnj=0;bnj<citynumber;bnj++)
  37. bn[bni][bnj]=pow(n[bni][bnj],B);
  38. }
  39. for (int can=0;can<citynumber;can++)//判断,除掉已经走过的城市
  40. {
  41. if(can==tabu[k][ci])
  42. {
  43. aT[i][can]=0;bn[i][can]=0;
  44. }
  45. }
  46. sumup=aT[i][j]*bn[i][j];
  47. for(int tj=0;tj<citynumber;tj++)
  48. sumdown=aT[i][tj]*bn[i][tj]+sumdown;
  49. pkij=sumup/sumdown;
  50. return pkij;
  51. }
  52. void main()
  53. { double city[citynumber][2]={{0,1},{0,2},{2,2},{2,4},{1,3}/*,{3,4},{4,7},{2,8},{3,9},{1,10},
  54. {1,0},{2,1},{3,0},{4,9},{5,2},{6,2},{7,1},{8,6},{9,0},{10,3}*/}; /*城市坐标*/
  55. double d[citynumber][citynumber]; //L[j][k]是城市j to k距离
  56. for(int j=0;j<citynumber;j++)
  57. {d[j][k]=sqrt((city[j][0]-city[k][0])*(city[j][0]-city[k][0])+(city[j][1]-city[k][1])*(city[j][1]-city[k][1]));
  58. // cout<<d[j][k]<<" ";
  59. }//cout<<"\n";
  60. } /*计算距离,从j城市到k城市*/
  61. /* for (int cj=0;cj<10;cj++)
  62. {float c=myrand();
  63. cout<<c<<" "<<"\n";}*///输出随机数
  64. double n[citynumber][citynumber];
  65. for(int ni=0;ni<citynumber;ni++)
  66. {
  67. for(int j=0;j<citynumber;j++)
  68. }//cout<<"\n";
  69. } /*初始化visibility nij*/
  70. double L[citynumber];
  71. int shortest[citynumber];
  72. double T[citynumber][citynumber];
  73. for(int ti=0;ti<citynumber;ti++)
  74. {
  75. for (int j=0;j<citynumber;j++)
  76. {
  77. //cout<<T[ti][j]<<" ";
  78. }//cout<<"\n";
  79. }/*初始化t*/
  80. double changT[citynumber][citynumber];
  81. //step2:
  82. for(int NC=0;NC<NM2;NC++)
  83. { for(int cti=0;cti<citynumber;cti++)
  84. {
  85. for (int j=0;j<citynumber;j++)
  86. {
  87. changT[cti][j]=0;//cout<<changT[cti][j]<<" ";
  88. }//cout<<"\n";
  89. } /*初始化changT*/
  90. int tabu[citynumber][citynumber];//tabu[k][s]表示第k只蚂蚁,第s次循环所在的城市
  91. for (int i=0;i<citynumber;i++)
  92. tabu[tai][i]=0;
  93. }
  94. for (int tabui1=0;tabui1<citynumber;tabui1++)
  95. tabu[tabui1][0]=tabui1;
  96. /*for (tai=0;tai<citynumber;tai++)
  97. {
  98. for (int i=0;i<citynumber;i++)
  99. cout<<tabu[tai][i]<<" ";cout<<"\n";
  100. }*/
  101. //初始化tabu
  102. for(int kk=0;kk<citynumber;kk++)
  103. L[kk]=0;
  104. //第三步开始
  105. for(int s=0;s<citynumber-1;s++)
  106. {
  107. for(int k=0;k<citynumber;)
  108. {
  109. int ci,can;
  110. float sumpk=0;
  111. float pkij;
  112. hq2: can++;
  113. if (can==citynumber) can=0;
  114. for (ci=0;ci<=s;ci++)
  115. {if(can==tabu[k][ci]) goto hq2;}
  116. pkij=fpkij(T,n,tabu,k,s,tabu[k][s],can);
  117. sumpk=sumpk+pkij;
  118. else goto hq2;
  119. tabu[k][s+1]=can;
  120. k++;
  121. }
  122. } //第三步完成
  123. /*for (tai=0;tai<citynumber;tai++)
  124. {
  125. for (int i=0;i<citynumber;i++)
  126. }*///输出一个循环后的tabu[][]
  127. //第四步开始
  128. for(int k4=0;k4<citynumber;k4++)
  129. {
  130. s44=s4+1;
  131. if (s44==citynumber) s44=0;
  132. L[k4]+=d[tabu[k4][s4]][tabu[k4][s44]];
  133. }//cout<<L[k4]<<" ";
  134. }//计算L[k]
  135. float shortest1=0; int short2=0;//最短距离
  136. for(ii=1;shorti<citber;shi++ )
  137. {
  138. shortest1=L[0];
  139. if(L[shorti]<=shortest1)
  140. {shortest1=L[shorti];short2=shorti;}
  141. }
  142. //cout<<L[sort2]<<"\n";cout<<short2<<"\n";
  143. for(int shoi=0;shoi<ctynumber;shoi++)
  144. {
  145. shortest[shoi]=tabu[short2][shoi];
  146. //cout<<shest[shoi]<<" ";
  147. }
  148. //cout<<"\n";
  149. for(int k41=0;k41<citynumber;k41++)
  150. {for(int s41=0,ss=0;s41<citynumber;s41++)
  151. {
  152. ss=s41+1;
  153. if (ss==citynumber) ss=0;
  154. changT[tabu[k41][s41]][tabu[k41][ss]]+=Q/L[k41];
  155. changT[tabu[k41][ss]][tabu[k41][s41]]=changT[tabu[k41][s41]][tabu[k41][ss]];
  156. }
  157. }
  158. /* for(int cti4=0;cti4<citynumber;cti4++)
  159. {
  160. for (int j=0;j<citynumber;j++)
  161. {cout<<changT[cti4][j]<<" ";}cout<<"\n";
  162. }*/
  163. //第四步完
  164. // 第五步开始
  165. for(int i5=0;i5<citynumber;i5++)
  166. {
  167. for(int j5=0;j5<citynumber;j5++)
  168. {
  169. // cout<<T[i5][j5]<<" ";
  170. }
  171. //cout<<"\n";
  172. }
  173. }
  174. for(int shoi1=0;shoi1<citynumber;shoi1++)
  175. {
  176. cout<<city[shortest[shoi1]][0]<<" "<<city[shortest[shoi1]][1]<<" ";
  177. }
  178. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/477013
推荐阅读
相关标签
  

闽ICP备14008679号