public Particle(int dim, double minX, double maxX) { position = new double[dim]; velocity = new double[dim]; bestPartPos = new double[dim]; for (int i = 0; i < dim; ++i) { position[i] = (maxX - minX) * MultiSwarmProgram.ran.NextDouble() + minX; } for (int i = 0; i < dim; ++i) { velocity[i] = (maxX - minX) * MultiSwarmProgram.ran.NextDouble() + minX; } cost = MultiSwarmProgram.Cost(position); bestPartCost = cost; Array.Copy(position, bestPartPos, dim); }
public void Solve(int maxLoop) { int ct = 0; double w = 0.729; // inertia double c1 = 1.49445; // particle / cogntive double c2 = 1.49445; // swarm / social double c3 = 0.3645; // multiswarm / global double death = 0.005;; // prob of particle death double immigrate = 0.005; // prob of particle immigration while (ct < maxLoop) { ++ct; for (int i = 0; i < swarms.Length; ++i) // each swarm { for (int j = 0; j < swarms[i].particles.Length; ++j) // each particle { double p = MultiSwarmProgram.ran.NextDouble(); if (p < death) { swarms[i].particles[j] = new Particle(dim, minX, maxX); } double q = MultiSwarmProgram.ran.NextDouble(); if (q < immigrate) { Immigration(i, j); // swap curr particle with a random particle in diff swarm } for (int k = 0; k < dim; ++k) // update velocity. each x position component { double r1 = MultiSwarmProgram.ran.NextDouble(); double r2 = MultiSwarmProgram.ran.NextDouble(); double r3 = MultiSwarmProgram.ran.NextDouble(); swarms[i].particles[j].velocity[k] = (w * swarms[i].particles[j].velocity[k]) + (c1 * r1 * (swarms[i].particles[j].bestPartPos[k] - swarms[i].particles[j].position[k])) + (c2 * r2 * (swarms[i].bestSwarmPos[k] - swarms[i].particles[j].position[k])) + (c3 * r3 * (bestMultiPos[k] - swarms[i].particles[j].position[k])); if (swarms[i].particles[j].velocity[k] < minX) { swarms[i].particles[j].velocity[k] = minX; } else if (swarms[i].particles[j].velocity[k] > maxX) { swarms[i].particles[j].velocity[k] = maxX; } } for (int k = 0; k < dim; ++k) // update position { swarms[i].particles[j].position[k] += swarms[i].particles[j].velocity[k]; } // update cost swarms[i].particles[j].cost = MultiSwarmProgram.Cost(swarms[i].particles[j].position); // check if new best cost if (swarms[i].particles[j].cost < swarms[i].particles[j].bestPartCost) { swarms[i].particles[j].bestPartCost = swarms[i].particles[j].cost; Array.Copy(swarms[i].particles[j].position, swarms[i].particles[j].bestPartPos, dim); } if (swarms[i].particles[j].cost < swarms[i].bestSwarmCost) { swarms[i].bestSwarmCost = swarms[i].particles[j].cost; Array.Copy(swarms[i].particles[j].position, swarms[i].bestSwarmPos, dim); } if (swarms[i].particles[j].cost < bestMultiCost) { bestMultiCost = swarms[i].particles[j].cost; Array.Copy(swarms[i].particles[j].position, bestMultiPos, dim); } } } } }