static void DisplayActivation(double[] weights, int dim, int numData, string filename)
        {
            InputOutputHandler myInput = new InputOutputHandler(dim, numData, filename);

            double[][][]  data = myInput.GetInputs();
            ANNPerceptron res  = new ANNPerceptron();

            for (int i = 0; i < data.Length; i++)
            {
                double activation = res.Result(data[i][0], weights);
                //Console.WriteLine("Activation= " + activation.ToString() + " || actual sol= " + data[i][1][0].ToString() + " || single error= " + (activation - data[i][1][0]).ToString());
            }
        }
        static double Error(double[] weights, int dim, int numData, string filename)
        {
            InputOutputHandler myInput = new InputOutputHandler(dim, numData, filename);

            double[][][]  data  = myInput.GetInputs();
            ANNPerceptron res   = new ANNPerceptron();
            double        sumSq = 0;

            for (int i = 0; i < data.Length; i++)
            {
                double activation = res.Result(data[i][0], weights);
                //Console.WriteLine(" - activation= " + activation.ToString() + " - actual sol= " + data[i][1][0].ToString());

                sumSq += Math.Pow(activation - data[i][1][0], 2);
            }
            double err = Math.Sqrt((1.0 / data.Length) * sumSq);

            return(err);
        }
        static void Main(string[] args)
        {
            Console.Write("Input number of fireflies (between 15 and 40): ");
            int numFireflies = Convert.ToInt16(Console.ReadLine()); // typically 15-40

            if (numFireflies < 15 || numFireflies > 40)
            {
                numFireflies = 40;
            }

            Console.Write("Input the dimensionality (typically 4): ");
            int dim = Convert.ToInt16(Console.ReadLine());

            if (dim < 3 || dim > 5)
            {
                dim = 4;
            }

            Console.Write("Input the maximum no of epochs (typically 1000): ");
            int maxEpochs = Convert.ToInt16(Console.ReadLine());

            if (maxEpochs < 500 || maxEpochs > 2000)
            {
                maxEpochs = 1000;
            }

            Console.Write("Input value for the variable in the value of alpha: ");
            FireflyProgram.aVar = Convert.ToInt16(Console.ReadLine());
            if (FireflyProgram.aVar < 0.0 || FireflyProgram.aVar > 2.0)
            {
                FireflyProgram.aVar = 0.98;
            }

            int seed = 0;

            Console.Write("Input no of training/testing records to use (typically between 10 and 50): ");
            int numData = Convert.ToInt16(Console.ReadLine());

            if (numData < 5 || numData > 100)
            {
                numData = 50;
            }

            Console.Write("input the name of your training/testing file (eg. alk.csv): ");
            string filename = Console.ReadLine();

            if (filename == "")
            {
                filename = "alk.csv";
            }

            Console.Clear();

            Console.WriteLine("\nSetting numFireflies        = " + numFireflies);
            Console.WriteLine("Setting problem dim         = " + dim);
            Console.WriteLine("Setting maxEpochs           = " + maxEpochs);
            Console.WriteLine("Setting initialization seed = " + seed);
            Console.WriteLine("Setting no training/testing data = " + numData);
            Console.WriteLine("Setting no training/testing file name = " + filename);

            Console.WriteLine("\nStarting firefly algorithm\n");
            double[] bestWeights = Solve(numFireflies, dim, seed, maxEpochs, numData, filename);
            Console.WriteLine("\nFinished\n");

            Console.WriteLine("Best solution found: ");
            Console.Write("weights = ");
            ShowVector(bestWeights, 4, true);

            double error = Error(bestWeights, dim, numData, filename);

            Console.Write("Error at best weight = ");
            Console.WriteLine(error.ToString("F4"));
            //DisplayActivation(bestWeights, dim, numData, filename);
            InputOutputHandler myInput = new InputOutputHandler(dim, numData, filename);

            myInput.WriteOutputs(bestWeights);

            Console.WriteLine("\nEnd of algorithm\n");
            Console.ReadLine();
        }