/// <summary> /// 开始优化 /// </summary> /// <param name="ConfigFile">算法参数配置文件路径</param> /// <param name="X_Init">优化变量初值</param> /// <param name="X_MaxStep">优化变量最大步长</param> /// <param name="X_Lb">优化变量下限</param> /// <param name="X_Ub">优化变量上限</param> /// <returns>使适应度函数最小的变量值</returns> /// <returns>最优目标函数</returns> public double[] StartOpt(string ConfigFile, double[] X_Init, double[] X_MaxStep, double[] X_Lb, double[] X_Ub, out double Fun, out double Delta) { if (X_Init.Length != X_MaxStep.Length || X_Init.Length != X_Lb.Length || X_Init.Length != X_Ub.Length) { throw new Exception("Variable number are not set correctly!"); } this.G = new General(); List <string[]> Config = new List <string[]>(); try { Config = G.ReadCSV(ConfigFile); this.MaX_Iteration = int.Parse(Config[0][1]); // 最大迭代次数 this.Min_TolFun = double.Parse(Config[1][1]); // 结束条件 } catch (System.Exception ex) { throw new Exception("ConfigFile are not existed!"); } this.X_Dim = X_Init.Count(); this.X_Lb = new double[X_Dim]; this.X_Ub = new double[X_Dim]; this.X_Opt = new double[X_Dim]; for (int i = 0; i < X_Dim; i++) { this.X_Lb[i] = Math.Max(X_Init[i] - X_MaxStep[i], X_Lb[i]); this.X_Ub[i] = Math.Min(X_Init[i] + X_MaxStep[i], X_Ub[i]); } Opt(); // 优化 Fun = Best_Fun; Delta = Best_Delta; return(X_Opt); }
/// <summary> /// 开始优化 /// </summary> /// <param name="ConfigFile">算法参数配置文件路径</param> /// <param name="X_Init">优化变量初值</param> /// <param name="X_MaxStep">优化变量最大步长</param> /// <param name="X_Lb">优化变量下限</param> /// <param name="X_Ub">优化变量上限</param> /// <returns>使适应度函数最小的变量值</returns> /// <returns>最优目标函数</returns> public double[] StartOpt(string ConfigFile, double[] X_Init, double[] X_MaxStep, double[] X_Lb, double[] X_Ub, out double Fun, out double Delta) { if (X_Init.Length != X_MaxStep.Length || X_Init.Length != X_Lb.Length || X_Init.Length != X_Ub.Length) { throw new Exception("Variable number are not set correctly!"); } this.G = new General(); List <string[]> Config = new List <string[]>(); try { Config = G.ReadCSV(ConfigFile); this.Max_FEs = int.Parse(Config[0][1]); // 最大评价次数 this.Min_TolFun = double.Parse(Config[1][1]); // 结束条件 this.N_Pop = int.Parse(Config[2][1]); // 种群规模 this.Wmax = double.Parse(Config[3][1]); // 惯性权重Max this.Wmin = double.Parse(Config[4][1]); // 惯性权重Min this.C1 = double.Parse(Config[5][1]); // 加速因子1 this.C2 = double.Parse(Config[6][1]); // 加速因子2 } catch (System.Exception ex) { throw new Exception("ConfigFile are not existed!"); } this.X_Dim = X_Init.Length; this.X = new double[N_Pop, X_Dim]; this.V = new double[N_Pop, X_Dim]; this.X_Init = new double[X_Dim]; this.X_Lb = new double[X_Dim]; this.X_Ub = new double[X_Dim]; this.Vmax = new double[X_Dim]; this.Vmin = new double[X_Dim]; this.Fun = new double[N_Pop]; // 各个个体的适应度 this.Delta = new double[N_Pop]; // 各个个体的约束违反度 this.gBest = new double[X_Dim]; this.pBest = new double[N_Pop, X_Dim]; this.pBest_Fun = new double[N_Pop]; this.pBest_Delta = new double[N_Pop]; this.X_Opt = new double[X_Dim]; this.res = new double[X_Dim + 1]; this.rd = new Random(); for (int i = 0; i < X_Dim; i++) { this.X_Init[i] = X_Init[i]; this.X_Lb[i] = Math.Max(X_Init[i] - X_MaxStep[i], X_Lb[i]); this.X_Ub[i] = Math.Min(X_Init[i] + X_MaxStep[i], X_Ub[i]); this.Vmax[i] = (this.X_Ub[i] - this.X_Lb[i]) * 0.5; this.Vmin[i] = this.Vmax[i] * -1.0; for (int k = 0; k < N_Pop; k++) { this.V[k, i] = this.Vmin[i] + G.rnd_uni(rd) * (this.Vmax[i] - this.Vmin[i]); } } Opt(); // 优化 Fun = gBest_Fun; Delta = gBest_Delta; return(X_Opt); }
/// <summary> /// 开始优化 /// </summary> /// <param name="ConfigFile">算法参数配置文件路径</param> /// <param name="X_Init">优化变量初值</param> /// <param name="X_MaxStep">优化变量最大步长</param> /// <param name="X_Lb">优化变量下限</param> /// <param name="X_Ub">优化变量上限</param> /// <returns>使适应度函数最小的变量值</returns> /// <returns>最优目标函数</returns> public double[] StartOpt(string ConfigFile, double[] X_Init, double[] X_MaxStep, double[] X_Lb, double[] X_Ub, out double Fun, out double Delta) { if (X_Init.Length != X_MaxStep.Length || X_Init.Length != X_Lb.Length || X_Init.Length != X_Ub.Length) { throw new Exception("Variable number are not set correctly!"); } this.G = new General(); List <string[]> Config = new List <string[]>(); try { Config = G.ReadCSV(ConfigFile); this.Max_FEs = int.Parse(Config[0][1]); // 最大评价次数 this.Min_TolFun = double.Parse(Config[1][1]); // 结束条件 this.N_Pop = int.Parse(Config[2][1]); // 种群规模 this.c = double.Parse(Config[3][1]); this.p = double.Parse(Config[4][1]); this.mu_F = double.Parse(Config[5][1]); // 缩放比例因子 this.mu_CR = double.Parse(Config[6][1]); // 交叉概率因子 } catch (System.Exception ex) { throw new Exception("ConfigFile are not existed!"); } this.Archive = new List <double[]>(); // 变量存档 this.S_F = new List <double>(); // F存档 this.S_CR = new List <double>(); // CR存档 this.X_Dim = X_Init.Length; this.P_Pop = (int)Math.Ceiling(this.p * this.N_Pop); this.X = new double[N_Pop, X_Dim]; this.X_P = new double[P_Pop, X_Dim]; this.X_Init = new double[X_Dim]; this.X_Lb = new double[X_Dim]; this.X_Ub = new double[X_Dim]; this.Fun = new double[N_Pop]; // 各个个体的适应度 this.Delta = new double[N_Pop]; // 各个个体的约束违反度 this.XBest = new double[X_Dim]; this.v = new double[X_Dim]; this.t = new double[X_Dim]; this.X_Opt = new double[X_Dim]; for (int i = 0; i < X_Dim; i++) { this.X_Init[i] = X_Init[i]; this.X_Lb[i] = Math.Max(X_Init[i] - X_MaxStep[i], X_Lb[i]); this.X_Ub[i] = Math.Min(X_Init[i] + X_MaxStep[i], X_Ub[i]); } this.rd = new Random(); Opt(); // 优化 Fun = Best_Fun; Delta = Best_Delta; return(X_Opt); }
/// <summary> /// 开始优化 /// </summary> /// <param name="ConfigFile">算法参数配置文件路径</param> /// <param name="X_Init">优化变量初值</param> /// <param name="X_MaxStep">优化变量最大步长</param> /// <param name="X_Lb">优化变量下限</param> /// <param name="X_Ub">优化变量上限</param> /// <returns>使适应度函数最小的变量值</returns> /// <returns>最优目标函数</returns> public double[] StartOpt(string ConfigFile, double[] X_Init, double[] X_MaxStep, double[] X_Lb, double[] X_Ub, out double Fun, out double Delta) { if (X_Init.Length != X_MaxStep.Length || X_Init.Length != X_Lb.Length || X_Init.Length != X_Ub.Length) { throw new Exception("Variable number are not set correctly!"); } this.G = new General(); List <string[]> Config = new List <string[]>(); try { Config = G.ReadCSV(ConfigFile); this.Max_FEs = int.Parse(Config[0][1]); // 最大评价次数 this.Min_TolFun = double.Parse(Config[1][1]); // 结束条件 this.N_Pop = int.Parse(Config[2][1]); // 种群规模 } catch (System.Exception ex) { throw new Exception("ConfigFile are not existed!"); } this.X_Dim = X_Init.Length; this.X = new double[N_Pop, X_Dim]; this.X_Init = new double[X_Dim]; this.X_Lb = new double[X_Dim]; this.X_Ub = new double[X_Dim]; this.Fun = new double[N_Pop]; // 各个个体的适应度 this.Delta = new double[N_Pop]; // 各个个体的约束违反度 this.v = new double[X_Dim]; this.v1 = new double[X_Dim]; this.t1 = new double[X_Dim]; this.v2 = new double[X_Dim]; this.t2 = new double[X_Dim]; this.v3 = new double[X_Dim]; this.t3 = new double[X_Dim]; this.X_Opt = new double[X_Dim]; for (int i = 0; i < X_Dim; i++) { this.X_Init[i] = X_Init[i]; this.X_Lb[i] = Math.Max(X_Init[i] - X_MaxStep[i], X_Lb[i]); this.X_Ub[i] = Math.Min(X_Init[i] + X_MaxStep[i], X_Ub[i]); } this.rd = new Random(); Opt(); // 优化 Fun = Best_Fun; Delta = Best_Delta; return(X_Opt); }
/// <summary> /// 开始优化 /// </summary> /// <param name="ConfigFile">算法参数配置文件路径</param> /// <param name="X_Init">优化变量初值</param> /// <param name="X_MaxStep">优化变量最大步长</param> /// <param name="X_Lb">优化变量下限</param> /// <param name="X_Ub">优化变量上限</param> /// <returns>使适应度函数最小的变量值</returns> /// <returns>最优目标函数</returns> public double[] StartOpt(string ConfigFile, double[] X_Init, double[] X_MaxStep, double[] X_Lb, double[] X_Ub, out double Fun, out double Delta) { if (X_Init.Length != X_MaxStep.Length || X_Init.Length != X_Lb.Length || X_Init.Length != X_Ub.Length) { throw new Exception("Variable number are not set correctly!"); } this.G = new General(); List <string[]> Config = new List <string[]>(); try { Config = G.ReadCSV(ConfigFile); this.Max_FEs = int.Parse(Config[0][1]); // 最大评价次数 this.Min_TolFun = double.Parse(Config[1][1]); // 结束条件 this.Init_Step_Ratio = double.Parse(Config[2][1]); // 初始步长比 this.Min_Step_Ratio = double.Parse(Config[3][1]); // 最小步长比 this.Alpha = double.Parse(Config[4][1]); // 加速因子 this.Beta = double.Parse(Config[5][1]); // 收缩因子 } catch (System.Exception ex) { throw new Exception("ConfigFile are not existed!"); } this.X_Dim = X_Init.Length; this.X_Lb = new double[X_Dim]; this.X_Ub = new double[X_Dim]; this.X = new double[X_Dim]; // 变量 this.Y = new double[X_Dim]; // 探测变量 this.Y_tmp = new double[X_Dim]; // 探测变量 this.Last_X = new double[X_Dim]; // 模式变量 this.X_Opt = new double[X_Dim]; this.Step = new double[X_Dim]; // 步长 this.Min_Step = new double[X_Dim]; // 最小步长 for (int i = 0; i < X_Dim; i++) { this.X_Lb[i] = Math.Max(X_Init[i] - X_MaxStep[i], X_Lb[i]); this.X_Ub[i] = Math.Min(X_Init[i] + X_MaxStep[i], X_Ub[i]); this.X[i] = X_Init[i]; this.Step[i] = (this.X_Ub[i] - this.X_Lb[i]) / this.Init_Step_Ratio; this.Min_Step[i] = (this.X_Ub[i] - this.X_Lb[i]) / this.Min_Step_Ratio; } Opt(); // 优化 Fun = Best_Fun; Delta = Best_Delta; return(X_Opt); }
/// <summary> /// 开始优化 /// </summary> /// <param name="ConfigFile">算法参数配置文件路径</param> /// <param name="X_Init">优化变量初值</param> /// <param name="X_MaxStep">优化变量最大步长</param> /// <param name="X_Lb">优化变量下限</param> /// <param name="X_Ub">优化变量上限</param> /// <returns>使适应度函数最小的变量值</returns> /// <returns>最优目标函数</returns> public double[] StartOpt(string ConfigFile, double[] X_Init, double[] X_MaxStep, double[] X_Lb, double[] X_Ub, out double Fun, out double Delta) { if (X_Init.Length != X_MaxStep.Length || X_Init.Length != X_Lb.Length || X_Init.Length != X_Ub.Length) { throw new Exception("Variable number are not set correctly!"); } this.G = new General(); List <string[]> Config = new List <string[]>(); try { Config = G.ReadCSV(ConfigFile); this.Max_FEs = int.Parse(Config[0][1]); // 最大评价次数 this.Min_TolFun = double.Parse(Config[1][1]); // 结束条件 this.Step_Ratio = double.Parse(Config[2][1]); // 初始步长比 this.Epsilon = double.Parse(Config[3][1]); // 结束条件 this.Alpha = double.Parse(Config[4][1]); // 反射因子 this.Beta = double.Parse(Config[5][1]); // 收缩因子 this.Gamma = double.Parse(Config[6][1]); // 扩大因子 } catch (System.Exception ex) { throw new Exception("ConfigFile are not existed!"); } this.X_Dim = X_Init.Length; this.X = new double[X_Dim + 1, X_Dim]; // 变量 this.Delta = new double[X_Dim + 1]; // 约束违反度 this.X_Lb = new double[X_Dim]; this.X_Ub = new double[X_Dim]; this.X_Center = new double[X_Dim]; // 重心点 this.X_R = new double[X_Dim]; // 反射点 this.X_E = new double[X_Dim]; // 扩大点 this.X_C = new double[X_Dim]; // 收缩点 this.X_Opt = new double[X_Dim]; // 最优解 this.Step = new double[X_Dim]; // 步长 this.Fun = new double[X_Dim + 1]; // 目标值 for (int i = 0; i < X_Dim; i++) { this.X_Lb[i] = Math.Max(X_Init[i] - X_MaxStep[i], X_Lb[i]); this.X_Ub[i] = Math.Min(X_Init[i] + X_MaxStep[i], X_Ub[i]); this.Step[i] = (this.X_Ub[i] - this.X_Lb[i]) / this.Step_Ratio; this.X[0, i] = X_Init[i]; for (int j = 0; j < X_Dim; j++) { if (i == j) { this.X[j + 1, i] = X_Init[i] + Step[i]; this.X[j + 1, i] = G.BoundConstraint(this.X[j + 1, i], this.X_Lb[i], this.X_Ub[i]); } else { this.X[j + 1, i] = X_Init[i]; } } } Opt(); // 优化 Fun = Best_Fun; Delta = Best_Delta; return(X_Opt); }
/// <summary> /// 开始优化 /// </summary> /// <param name="ConfigFile">算法参数配置文件路径</param> /// <param name="X_Init">优化变量初值</param> /// <param name="X_MaxStep">优化变量最大步长</param> /// <param name="X_Lb">优化变量下限</param> /// <param name="X_Ub">优化变量上限</param> /// <returns>使适应度函数最小的变量值</returns> /// <returns>最优目标函数</returns> public double[] StartOpt(string ConfigFile, double[] X_Init, double[] X_MaxStep, double[] X_Lb, double[] X_Ub, out double Fun, out double Delta) { if (X_Init.Length != X_MaxStep.Length || X_Init.Length != X_Lb.Length || X_Init.Length != X_Ub.Length) { throw new Exception("Variable number are not set correctly!"); } this.G = new General(); List <string[]> Config = new List <string[]>(); try { Config = G.ReadCSV(ConfigFile); this.Max_FEs = int.Parse(Config[0][1]); // 最大评价次数 this.Min_TolFun = double.Parse(Config[1][1]); // 结束条件 } catch (System.Exception ex) { throw new Exception("ConfigFile are not existed!"); } var M = Matrix <double> .Build; // 生成矩阵 //var V = Vector<double>.Build; // 生成向量 this.X_Dim = X_Init.Length; this.X = new double[X_Dim]; this.X_Lb = new double[X_Dim]; this.X_Ub = new double[X_Dim]; double[] X_Diff = new double[X_Dim]; for (int i = 0; i < X_Dim; i++) { this.X_Lb[i] = Math.Max(X_Init[i] - X_MaxStep[i], X_Lb[i]); this.X_Ub[i] = Math.Min(X_Init[i] + X_MaxStep[i], X_Ub[i]); X_Diff[i] = this.X_Ub[i] - this.X_Lb[i]; } this.X_Opt = new double[X_Dim]; this.xmeanw = M.Dense(X_Dim, 1); this.xold = M.Dense(X_Dim, 1); this.zmeanw = M.Dense(X_Dim, 1); this.flginiphase = true; this.sigma = 0.25; // Initial step size this.Min_sigma = 1.0e-15; // Minimal step size this.Max_sigma = X_Diff.Max() / Math.Sqrt((double)X_Dim); for (int i = 0; i < X_Dim; i++) { this.xmeanw[i, 0] = X_Init[i]; } this.lambda = 4 + (int)Math.Floor(3.0 * Math.Log((double)X_Dim)); this.mu = (int)Math.Floor((double)lambda / 2.0); this.arweights = M.Dense(mu, 1); for (int i = 0; i < mu; i++) { this.arweights[i, 0] = Math.Log((lambda + 1.0) / 2.0) - Math.Log(i + 1.0); } this.cc = 4.0 / (X_Dim + 4.0); this.ccov = 2.0 / Math.Pow((X_Dim + Math.Pow(2.0, 0.5)), 2.0); this.cs = 4.0 / (X_Dim + 4.0); this.damp = (1.0 - Math.Min(0.7, X_Dim * lambda / Max_FEs)) / cs + 1.0; this.B = M.DenseIdentity(X_Dim); this.D = M.DenseIdentity(X_Dim); this.BD = M.Dense(X_Dim, X_Dim); this.C = M.Dense(X_Dim, X_Dim); this.CC = M.Dense(X_Dim, X_Dim); this.BD = B * D; this.C = BD * BD.Transpose(); this.pc = M.Dense(X_Dim, 1); this.ps = M.Dense(X_Dim, 1); this.cw = arweights.RowSums().Sum() / arweights.L2Norm(); this.chiN = Math.Pow(X_Dim, 0.5) * (1.0 - 1.0 / (4.0 * X_Dim) + 1.0 / (21.0 * Math.Pow(X_Dim, 2.0))); this.arz = M.Dense(X_Dim, lambda); this.arx = M.Dense(X_Dim, lambda); this.arz_mu = M.Dense(X_Dim, mu); this.arx_mu = M.Dense(X_Dim, mu); this.Fun = new double[lambda]; // 各个个体的适应度 this.Delta = new double[lambda]; // 各个个体的约束违反度 this.Index = new int[lambda]; // 各个个体的序号 this.rd = new Random(); Opt(); // 优化 Fun = Best_Fun; Delta = Best_Delta; return(X_Opt); }
/// <summary> /// 开始优化 /// </summary> /// <param name="ConfigFile">算法参数配置文件路径</param> /// <param name="X_Init">优化变量初值</param> /// <param name="X_MaxStep">优化变量最大步长</param> /// <param name="X_Lb">优化变量下限</param> /// <param name="X_Ub">优化变量上限</param> /// <returns>使适应度函数最小的变量值</returns> /// <returns>最优目标函数</returns> public double[,] StartOpt(string ConfigFile, double[] X_Init, double[] X_MaxStep, double[] X_Lb, double[] X_Ub, out double[,] Fun) { if (X_Init.Length != X_MaxStep.Length || X_Init.Length != X_Lb.Length || X_Init.Length != X_Ub.Length) { throw new Exception("Variable number are not set correctly!"); } this.G = new General(); List <string[]> Config = new List <string[]>(); try { Config = G.ReadCSV(ConfigFile); this.Max_FEs = int.Parse(Config[0][1]); // 最大评价次数 this.N_Pop = int.Parse(Config[1][1]); // 种群规模 } catch (System.Exception ex) { throw new Exception("ConfigFile are not existed!"); } this.Obj_Dim = fitness.GetObjectiveNumber(); //this.Obj_Dim = 3; this.Z = ReferencePoint(N_Pop, Obj_Dim, out N_Pop); // 生成参考点 this.X_Dim = X_Init.Length; this.ProM = 1.0 / X_Dim; this.Zmin = new double[Obj_Dim]; this.Zmax = new double[Obj_Dim]; this.X = new double[N_Pop, X_Dim]; this.X_Offspring = new double[N_Pop, X_Dim]; this.X_R = new double[N_Pop * 2, X_Dim]; this.X_Init = new double[X_Dim]; this.X_Lb = new double[X_Dim]; this.X_Ub = new double[X_Dim]; this.Fun = new double[N_Pop, Obj_Dim]; // 各个个体的适应度 this.Fun_Offspring = new double[N_Pop, Obj_Dim]; this.Fun_R = new double[N_Pop * 2, Obj_Dim]; this.Delta = new double[N_Pop]; // 各个个体的约束违反度 this.Delta_Offspring = new double[N_Pop]; this.Delta_R = new double[N_Pop * 2]; this.FrontValue = new int[N_Pop * 2]; for (int i = 0; i < X_Dim; i++) { this.X_Init[i] = X_Init[i]; this.X_Lb[i] = Math.Max(X_Init[i] - X_MaxStep[i], X_Lb[i]); this.X_Ub[i] = Math.Min(X_Init[i] + X_MaxStep[i], X_Ub[i]); } for (int i = 0; i < Obj_Dim; i++) { Zmin[i] = double.MaxValue; } this.rd = new Random(); //this.rd1 = new Random(); //this.rd2 = new Random(); //this.rd3 = new Random(); //this.rd4 = new Random(); //this.rd5 = new Random(); Opt(); // 优化 Fun = new double[N_Pop, Obj_Dim]; for (int i = 0; i < N_Pop; i++) { for (int j = 0; j < Obj_Dim; j++) { Fun[i, j] = this.Fun[i, j]; } } return(this.X); }