public SwarmResult1 DoPSO() // Particle movement to achieve { // for particle swarm optimization for (int i = 0; i < SwarmDim; i++) { G[i] = PList[0].POSITION[i]; } numberofinteration = 15000; for (int j = 0; j < 200; j++) // iterations { System.Diagnostics.Debug.WriteLine("interation: " + j); // find best position in the swarm for (int i = 0; i < SwarmDim; i++) { P[i] = PList[0].POSITION[i]; } foreach (Particle2 pt in PList) { if (Math.Abs(FunctionToSolve3(pt.POSITION)) < Math.Abs(FunctionToSolve3(P))) { for (int i = 0; i < SwarmDim; i++) { P[i] = pt.POSITION[i]; } } } if (Math.Abs(FunctionToSolve3(P)) < Math.Abs(FunctionToSolve3(G))) { for (int i = 0; i < SwarmDim; i++) { G[i] = P[i]; } } //update foreach (Particle2 pt in PList) { pt.UpdateVelocity(P, G); pt.UpdatePosition(); } } SwarmResult1 sr = new SwarmResult1 { SwarmId = swarmNum, X = G, FunctionValue = FunctionToSolve3(G) }; return(sr); }
public void ComputeGMM_ND2() { SwarmSystem1 ss = new SwarmSystem1(50, inputMatrix, k, dim); ss.Initialize(); SwarmResult1 sr = ss.DoPSO(); //===========Parse=========== double[] x = sr.X; Debug.WriteLine("[{0}]", string.Join(", ", x)); #region Parsing_array_to_Parameters int index = 0; //parsing phi for (int i = 0; i < k; i++) { phi[i] = x[index]; index++; // Debug.WriteLine("[{0}]", string.Join(", ", phi)); } //parsing mu for (int i = 0; i < k; i++) { for (int j = 0; j < dim; j++) { mu[i][0, j] = x[index]; index++; } } //parsing sigma for (int i = 0; i < k; i++) { for (int j = 0; j < dim; j++) { for (int h = 0; h < dim; h++) { sigma[i][j, h] = x[index]; index++; } } } #endregion //=========================== ////compute gamma for (int i = 0; i < inputMatrix.Rows; i++) { for (int k1 = 0; k1 < k; k1++) { pdf[i, k1] = GaussianMV(inputMatrix, i, dim, mu[k1], sigma[k1]); } } double[] Gdenom = new double[inputMatrix.Rows]; for (int i = 0; i < inputMatrix.Rows; i++) // denominator for Gamma { double sum = 0; for (int k1 = 0; k1 < k; k1++) { sum = sum + phi[k1] * pdf[i, k1]; } Gdenom[i] = sum; } for (int i = 0; i < inputMatrix.Rows; i++) { for (int k1 = 0; k1 < k; k1++) { Gamma[i, k1] = (phi[k1] * pdf[i, k1]) / Gdenom[i]; } } Debug.WriteLine(" Ending gamma"); ///'ending compute gamma }