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