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);
                        }
                    }
                }
            }
        }