public ArrayList toARMA()
        {
            //_x为差分后的值
            //double[] _x ={ 0.0810295519542421, 0.262345679012346, -0.0621725462801258, -0.0446927374301676, -0.00896686159844059, 0.164044059795437, 0.154106116931396, 0.393265007320644, 0.134089953762085, 0.179577464788732, 0.213511390416339, 0.0666752977731745, 0.204029615244569, 0.252620967741935, 0.332528569129245, 0.374078995047711, 0.189038326300985, 0.0767012900602521, 0.0540373523757208, 0.0628297830760211, 0.116637553246912, 0.105085490023877, 0.115879401976854, 0.163357963144307, 0.119146005509642, 0.108581196581197, 0.116095108863258, 0.129094651911413 };
            //double[] _x ={ 0.0810295519542421, 0.262345679012346, -0.0621725462801258, -0.0446927374301676, -0.00896686159844059, 0.164044059795437, 0.154106116931396, 0.393265007320644, 0.134089953762085, 0.179577464788732, 0.213511390416339, 0.0666752977731745, 0.204029615244569, 0.252620967741935, 0.332528569129245, 0.374078995047711, 0.189038326300985, 0.0767012900602521, 0.0540373523757208, 0.0628297830760211, 0.116637553246912, 0.105085490023877, 0.115879401976854, 0.163357963144307, 0.119146005509642, 0.108581196581197, 0.116095108863258 };

            clsga gg = new clsga(_x, _ar_n, _ar_ub, _ar_lb, _ga_n, _ga_num, _ga_pr, _ga_pm);

            //使用GA运行得到ar部分的参数
            ArrayList resar = gg.runGA();
            double[] ar = (double[])resar[0];
            double maxV1 = (double)resar[1];

            //使用ar部分的参数取得预测值 _s为_x与其预测值之间的误差
            double[] _e = gg.getE(ar);

            //为便于计算,将_e补并个数,与_x相等
            double[] _ee = new double[_x.Length];

            clsga ge = new clsga(_e, _ma_n, _ma_ub, _ma_lb, _ga_n, _ga_num, _ga_pr, _ga_pm);

            ArrayList resma = gg.runGA();
            double[] ma = (double[])resma[0];
            double maxV2 = (double)resma[1];

            //double[] ma = ge.runGA();
            int startI = _ar_n + _ma_n;
            //计算最终预测的x,2+3分别为ar和ma部分的参数个数
            double[] predicX = new double[_x.Length + 1];
            for (int i = 0; i < _x.Length; i++)
            {
                predicX[i] = 0;
                _ee[i] = 0;
            }
            for (int i = startI; i < _x.Length; i++)
            {
                _ee[i] = _e[i - startI];
            }


            //根据参数计算预测值
            double sum = 0;
            for (int i = startI; i < _x.Length + 1; i++)
            {
                sum = 0;
                //ar的计算
                for (int j = 0; j < ar.Length; j++)
                {
                    sum += ar[j] * _x[i - j - 1] + ma[j] * _ee[i - j - 1];
                }
                //ma的计算
                for (int j = 0; j < ma.Length; j++)
                {
                    sum += ma[j] * _ee[i - j - 1];
                }

                predicX[i] = sum;
            }


            double[] oridata = new double[predicX.Length + _count];//用来存储原长度预测数据和扩展月份的预测数据
            //赋值原长度预测数据
            for (int i = 0; i < _data.Length; i++)
            {
                oridata[i] = predicX[i];
            }

            for (int i = predicX.Length; i < predicX.Length + _count; i++)
            {

                //根据参数计算预测值

                sum = 0;
                //ar的计算
                for (int j = 0; j < ar.Length; j++)
                {
                    sum += ar[j] * oridata[i - j - 1];// +ma[j] * _ee[i - j - 1];
                }
                //ma的计算,只有一次可用
                if (i == predicX.Length)
                {
                    for (int j = 0; j < ma.Length; j++)
                    {
                        sum += ma[j] * _ee[i - j - 2];
                    }
                }

                oridata[i] = sum;

            }



            //ok
            //将差分转换为现实值
            double[] finaldata = new double[predicX.Length + _count];

            for (int i = 0; i < _data.Length; i++)
            {
                finaldata[i] = _data[i];
            }

            for (int i = startI; i < finaldata.Length; i++)
            {
                finaldata[i] = (1 + oridata[i]) * finaldata[i - 1];
            }

            //根据ar和ma部分的系数计算

            //double[] preout = new double[_count];
            //double[] oridata = new double[_data.Length + _count];//用来存储原始数据加上预测数据
            ////赋值原始数据
            //for (int i = 0; i < _data.Length; i++)
            //{
            //    oridata[i] = _data[i];
            //}
            //for (int i = _data.Length; i < _count; i++)
            //{

            //    //根据参数计算预测值
            //    double sum = 0;
            //    for (int i = 0; i < preout.Length + 1; i++)
            //    {
            //        sum = 0;
            //        //ar的计算
            //        for (int j = 0; j < ar.Length; j++)
            //        {
            //            sum += ar[j] * oridata[i - j - 1];// +ma[j] * _ee[i - j - 1];
            //        }
            //        //ma的计算
            //        if (i == _data.Length)
            //        {
            //            for (int j = 0; j < ma.Length; j++)
            //            {
            //                sum += ma[j] * _ee[i - j - 1];
            //            }
            //        }


            //        oridata[i] = sum;
            //    }

            //}

            ArrayList lastRes = new ArrayList();
            lastRes.Add(maxV1);
            lastRes.Add(maxV2);
            lastRes.Add(finaldata);


            return lastRes;

            //for (int i = 0; i < predicX.Length; i++)
            //{
            //    Console.WriteLine(predicX[i].ToString());
            //}


            ////最终得到的参数
            //Console.WriteLine("out :" + ar.Length);
            //Console.WriteLine(ar[0].ToString());
            //Console.WriteLine(ar[1].ToString());

            //Console.WriteLine("out :" + ma.Length);
            //Console.WriteLine(ma[0].ToString());
            //Console.WriteLine(ma[1].ToString());


            // Console.WriteLine(dt[2].ToString () );

            //Console.WriteLine(dt[2].ToString());

            //double _lb = -10;
            //double _ub = 10;


            //Console.ReadLine();
        }
Exemple #2
0
        public ArrayList toARMA()
        {
            //_x为差分后的值
            //double[] _x ={ 0.0810295519542421, 0.262345679012346, -0.0621725462801258, -0.0446927374301676, -0.00896686159844059, 0.164044059795437, 0.154106116931396, 0.393265007320644, 0.134089953762085, 0.179577464788732, 0.213511390416339, 0.0666752977731745, 0.204029615244569, 0.252620967741935, 0.332528569129245, 0.374078995047711, 0.189038326300985, 0.0767012900602521, 0.0540373523757208, 0.0628297830760211, 0.116637553246912, 0.105085490023877, 0.115879401976854, 0.163357963144307, 0.119146005509642, 0.108581196581197, 0.116095108863258, 0.129094651911413 };
            //double[] _x ={ 0.0810295519542421, 0.262345679012346, -0.0621725462801258, -0.0446927374301676, -0.00896686159844059, 0.164044059795437, 0.154106116931396, 0.393265007320644, 0.134089953762085, 0.179577464788732, 0.213511390416339, 0.0666752977731745, 0.204029615244569, 0.252620967741935, 0.332528569129245, 0.374078995047711, 0.189038326300985, 0.0767012900602521, 0.0540373523757208, 0.0628297830760211, 0.116637553246912, 0.105085490023877, 0.115879401976854, 0.163357963144307, 0.119146005509642, 0.108581196581197, 0.116095108863258 };

            clsga gg = new clsga(_x, _ar_n, _ar_ub, _ar_lb, _ga_n, _ga_num, _ga_pr, _ga_pm);

            //使用GA运行得到ar部分的参数
            ArrayList resar = gg.runGA();

            double[] ar    = (double[])resar[0];
            double   maxV1 = (double)resar[1];

            //使用ar部分的参数取得预测值 _s为_x与其预测值之间的误差
            double[] _e = gg.getE(ar);

            //为便于计算,将_e补并个数,与_x相等
            double[] _ee = new double[_x.Length];

            clsga ge = new clsga(_e, _ma_n, _ma_ub, _ma_lb, _ga_n, _ga_num, _ga_pr, _ga_pm);

            ArrayList resma = gg.runGA();

            double[] ma    = (double[])resma[0];
            double   maxV2 = (double)resma[1];

            //double[] ma = ge.runGA();
            int startI = _ar_n + _ma_n;

            //计算最终预测的x,2+3分别为ar和ma部分的参数个数
            double[] predicX = new double[_x.Length + 1];
            for (int i = 0; i < _x.Length; i++)
            {
                predicX[i] = 0;
                _ee[i]     = 0;
            }
            for (int i = startI; i < _x.Length; i++)
            {
                _ee[i] = _e[i - startI];
            }


            //根据参数计算预测值
            double sum = 0;

            for (int i = startI; i < _x.Length + 1; i++)
            {
                sum = 0;
                //ar的计算
                for (int j = 0; j < ar.Length; j++)
                {
                    sum += ar[j] * _x[i - j - 1] + ma[j] * _ee[i - j - 1];
                }
                //ma的计算
                for (int j = 0; j < ma.Length; j++)
                {
                    sum += ma[j] * _ee[i - j - 1];
                }

                predicX[i] = sum;
            }


            double[] oridata = new double[predicX.Length + _count];//用来存储原长度预测数据和扩展月份的预测数据
            //赋值原长度预测数据
            for (int i = 0; i < _data.Length; i++)
            {
                oridata[i] = predicX[i];
            }

            for (int i = predicX.Length; i < predicX.Length + _count; i++)
            {
                //根据参数计算预测值

                sum = 0;
                //ar的计算
                for (int j = 0; j < ar.Length; j++)
                {
                    sum += ar[j] * oridata[i - j - 1];// +ma[j] * _ee[i - j - 1];
                }
                //ma的计算,只有一次可用
                if (i == predicX.Length)
                {
                    for (int j = 0; j < ma.Length; j++)
                    {
                        sum += ma[j] * _ee[i - j - 2];
                    }
                }

                oridata[i] = sum;
            }



            //ok
            //将差分转换为现实值
            double[] finaldata = new double[predicX.Length + _count];

            for (int i = 0; i < _data.Length; i++)
            {
                finaldata[i] = _data[i];
            }

            for (int i = startI; i < finaldata.Length; i++)
            {
                finaldata[i] = (1 + oridata[i]) * finaldata[i - 1];
            }

            //根据ar和ma部分的系数计算

            //double[] preout = new double[_count];
            //double[] oridata = new double[_data.Length + _count];//用来存储原始数据加上预测数据
            ////赋值原始数据
            //for (int i = 0; i < _data.Length; i++)
            //{
            //    oridata[i] = _data[i];
            //}
            //for (int i = _data.Length; i < _count; i++)
            //{

            //    //根据参数计算预测值
            //    double sum = 0;
            //    for (int i = 0; i < preout.Length + 1; i++)
            //    {
            //        sum = 0;
            //        //ar的计算
            //        for (int j = 0; j < ar.Length; j++)
            //        {
            //            sum += ar[j] * oridata[i - j - 1];// +ma[j] * _ee[i - j - 1];
            //        }
            //        //ma的计算
            //        if (i == _data.Length)
            //        {
            //            for (int j = 0; j < ma.Length; j++)
            //            {
            //                sum += ma[j] * _ee[i - j - 1];
            //            }
            //        }


            //        oridata[i] = sum;
            //    }

            //}

            ArrayList lastRes = new ArrayList();

            lastRes.Add(maxV1);
            lastRes.Add(maxV2);
            lastRes.Add(finaldata);


            return(lastRes);

            //for (int i = 0; i < predicX.Length; i++)
            //{
            //    Console.WriteLine(predicX[i].ToString());
            //}


            ////最终得到的参数
            //Console.WriteLine("out :" + ar.Length);
            //Console.WriteLine(ar[0].ToString());
            //Console.WriteLine(ar[1].ToString());

            //Console.WriteLine("out :" + ma.Length);
            //Console.WriteLine(ma[0].ToString());
            //Console.WriteLine(ma[1].ToString());


            // Console.WriteLine(dt[2].ToString () );

            //Console.WriteLine(dt[2].ToString());

            //double _lb = -10;
            //double _ub = 10;


            //Console.ReadLine();
        }