/// <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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
        /// <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);
        }
Beispiel #7
0
        /// <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);
        }