Example #1
0
        /// <summary>
        /// JADE
        /// </summary>
        private void Opt()
        {
            int r1, r2;
            int FEs = 0; // 当前评价次数

            // 上下限内初始化种群
            Initial();
            // 开始寻优
            // 种群停止进化,结束优化流程
            while (FEs < Max_FEs)
            {
                // 选择父代个体
                for (int i = 0; i < N_Pop; i++)
                {
                    // 随机选择另外两个解执行变异操作生成临时解,且i≠r1≠r2,随机个体索引
                    r1 = G.rndInt_uni(0, N_Pop - 1, rd);
                    r2 = G.rndInt_uni(0, N_Pop + Archive.Count() - 1, rd);
                    while (i == r1)
                    {
                        r1 = G.rndInt_uni(0, N_Pop - 1, rd);
                    }
                    while (r2 == r1 || r2 == i)
                    {
                        r2 = G.rndInt_uni(0, N_Pop + Archive.Count() - 1, rd);
                    }

                    // 计算F和CR
                    F = CauchyDistribution.Random(mu_F, 0.1); // 柯西分布
                    F = Math.Min(F, 1.0);
                    //F = 0.5;
                    while (F < 0.0)
                    {
                        F = CauchyDistribution.Random(mu_F, 0.1); // 柯西分布
                        F = Math.Min(F, 1.0);
                    }
                    CR = G.rnd_normal(mu_CR, 0.1, rd); // 正态分布
                    CR = Math.Min(1, Math.Max(0.0, CR));

                    // 从X_P中得到Xbest
                    GetXbest();

                    // 变异操作_目标个体
                    Mutation(i, r1, r2);

                    // 交叉操作_测试个体
                    Cross(i);

                    // 选择操作
                    Select(i);

                    // 更新mu_F,mu_CR,Archive
                    Update();
                }

                // 种群最优解
                GlobalOpt();
                if (FEs > 0)
                {
                    TolFun = Math.Abs((Last_Best_Fun - Best_Fun) / Last_Best_Fun); // 最优适应度相对变化
                }
                Last_Best_Fun = Best_Fun;
                FEs           = FEs + N_Pop;
                //if (TolFun < Min_TolFun)
                //{
                //    break;
                //}
                Console.WriteLine("JADE " + FEs + " " + Best_Fun.ToString("f2") + " " + Best_Delta.ToString("f2"));
            }
        }