1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <time.h> 5 #include <math.h> 6 7 #define PI (3.1415926f) 8 #define RND ((float)rand() / (RAND_MAX + 1)) 9 #define X_DIM 30 10 11 //float domx[X_DIM][2] = 12 //{ 13 // { -1.0f, 2.0f}, { -1.0f, 2.0f} 14 //}; 15 16 float domx[2] = { -100.0f, 100.0f}; 17 18 const int S = 100; // 细菌个数 19 float bacterium[S][X_DIM]; // 细菌 20 const int Nc = 50; // 趋化的次数 21 float bacterafitness[S][Nc]; // 适应度 22 const int Ns = 10; // 趋化操作中单向运动的最大步数4 23 const int Nre = 20; // 复制次数 24 const int Ned = 20; // 驱散次数 25 const float Ped = 0.25f; // 驱散概率 26 const float Ci = 1.0f; // 步长 27 28 float gbest; 29 float gx[X_DIM]; 30 31 32 33 const float d_at = 0.05f; // 吸引剂的数量 34 const float w_at = 0.05f; // 吸引剂的释放速度 35 const float h_re = 0.05f; // 排斥剂的数量 36 const float w_re = 0.05f; // 排斥剂的释放速度 37 38 39 40 41 42 float get_y1( float x[X_DIM] ) 43 { 44 return 4 - ( x[0] * sin( 4 * PI * x[0] ) - x[1] * sin( 4 * PI * x[1] + PI + 1 ) ); 45 } 46 47 float get_y( float x[X_DIM] ) 48 { 49 register int i; 50 register float sum; 51 52 sum = 0.0f; 53 for ( i = 0; i < X_DIM; i ++ ) 54 { 55 sum -= x[i] * x[i]; 56 } 57 return sum; 58 } 59 60 float fitness( float y ) 61 { 62 return y; 63 } 64 65 float get_jcc( int idx ) 66 { 67 register int i, j; 68 register float a, allsum, sum, sum1, sum2; 69 70 71 allsum = 0.0f; 72 for ( i = 0; i < S; i ++ ) 73 { 74 sum = 0.0f; 75 for ( j = 0; j < X_DIM; j ++ ) 76 { 77 a = bacterium[i][j] - bacterium[idx][j]; 78 sum += a * a; 79 } 80 81 sum1 = -w_at * sum; 82 sum1 = -d_at * exp( sum1 ); 83 84 sum2 = -w_re * sum; 85 sum2 = h_re * exp( sum2 ); 86 87 allsum += sum1 + sum2; 88 } 89 90 91 return allsum; 92 } 93 94 95 96 97 98 99 100 void init_single_bacterium( float x[X_DIM] ) 101 { 102 register int i; 103 104 for ( i = 0; i < X_DIM; i ++ ) 105 { 106 x[i] = domx[0] + RND * ( domx[1] - domx[0] ); 107 } 108 } 109 110 111 112 void init_bacterium() 113 { 114 register int i, j; 115 116 for ( i = 0; i < S; i ++ ) 117 { 118 for ( j = 0; j < X_DIM; j ++ ) 119 { 120 bacterium[i][j] = domx[0] + RND * ( domx[1] - domx[0] ); 121 } 122 } 123 } 124 125 void get_delta( float delta[X_DIM] ) 126 { 127 register int i; 128 register float tmp; 129 130 tmp = 0.0f; 131 for ( i = 0; i < X_DIM; i ++ ) 132 { 133 delta[i] = ( RND - 0.5f ) * 2; 134 135 tmp += delta[i] * delta[i]; 136 } 137 138 tmp = sqrt( tmp ); 139 140 for ( i = 0; i < X_DIM; i ++ ) 141 { 142 delta[i] /= tmp; 143 } 144 } 145 146 147 148 149 150 151 152 int main() 153 { 154 register int i, j, k, l, m, n; 155 float f, f1, y, flast, tmpfit; 156 float delta[X_DIM]; 157 float tmpbactera[X_DIM]; 158 float bfsum[S]; 159 int Sr; 160 161 162 srand( ( unsigned int )time( NULL ) ); 163 164 gbest = -10000000000.0f; 165 Sr = S / 2; 166 init_bacterium(); 167 168 169 for ( l = 0; l < Ned; l ++ ) 170 { 171 for ( k = 0; k < Nre; k ++ ) 172 { 173 for ( j = 0; j < Nc; j ++ ) 174 { 175 for ( i = 0; i < S; i ++ ) 176 { 177 y = get_y( bacterium[i] ); 178 179 if ( y > gbest ) 180 { 181 gbest = y; 182 memcpy( gx, bacterium[i], sizeof( gx ) ); 183 } 184 185 f = fitness( y ); 186 f += get_jcc( i ); 187 188 flast = f; 189 190 get_delta( delta ); 191 192 for ( n = 0; n < X_DIM; n ++ ) 193 { 194 tmpbactera[n] = Ci * delta[n] + bacterium[i][n]; 195 } 196 197 for ( m = 0; m < Ns; m ++ ) 198 { 199 f1 = fitness( get_y( tmpbactera ) ); 200 if ( f1 > flast ) 201 { 202 flast = f1; 203 for ( n = 0; n < X_DIM; n ++ ) 204 { 205 tmpbactera[n] += Ci * delta[n]; 206 } 207 } 208 else 209 { 210 break; 211 } 212 } 213 214 memcpy( bacterium[i], tmpbactera, sizeof( bacterium[0] ) ); 215 bacterafitness[i][j] = flast; 216 } 217 218 219 printf( "[%02d,%02d,%02d] gbest=%f (%f,%f) ", l, k, j, gbest, gx[0], gx[1] ); 220 } 221 222 223 for ( i = 0; i < S; i ++ ) 224 { 225 bfsum[i] = 0.0f; 226 for ( j = 0; j < Nc; j ++ ) 227 { 228 bfsum[i] += bacterafitness[i][j]; 229 } 230 } 231 232 for ( n = 0; n < Sr; n ++ ) 233 { 234 i = n; 235 tmpfit = bfsum[n]; 236 for ( j = n + 1; j < S; j ++ ) 237 { 238 if ( bfsum[j] > tmpfit ) 239 { 240 tmpfit = bfsum[j]; 241 i = j; 242 } 243 } 244 245 if ( i != n ) 246 { 247 memcpy( tmpbactera, bacterium[n], sizeof( tmpbactera ) ); 248 memcpy( bacterium[n], bacterium[i], sizeof( bacterium[0] ) ); 249 memcpy( bacterium[i], tmpbactera, sizeof( bacterium[0] ) ); 250 } 251 } 252 253 for ( i = 0; i < Sr; i ++ ) 254 { 255 memcpy( bacterium[Sr + i], bacterium[i], sizeof( bacterium[0] ) ); 256 } 257 } 258 259 for ( i = 0; i < S; i ++ ) 260 { 261 if ( RND < Ped ) 262 { 263 init_single_bacterium( bacterium[i] ); 264 } 265 } 266 } 267 268 return 0; 269 }