Beispiel #1
0
        /// <summary>
        /// Finds minimum for function using Coordinate Descent Optimization algorithm.
        /// </summary>
        /// <param name="vector">Starting point.</param>
        /// <param name="e">Precision.</param>
        /// <param name="function">Function used in algorithm.</param>
        /// <param name="h">Shift used for getting unimodal interval.</param>
        /// <returns>Minimum of function.</returns>

        public static Matrica FindMinimum(Matrica vector, Matrica e, Function function, int h)
        {
            Matrica x = new Matrica();

            x.Equals(vector);
            Matrica xs = new Matrica();

            function.SetParametersSize(x.NoOfRows);

            do
            {
                xs = new Matrica();
                xs.Equals(x);
                for (int i = 0; i < vector.NoOfRows; i++)
                {
                    Matrica ei = new Matrica();
                    ei.NoOfColumns = 1;
                    ei.NoOfRows    = vector.NoOfRows;
                    for (int j = 0; j < vector.NoOfRows; j++)
                    {
                        List <double> row = new List <double>();
                        if (i == j)
                        {
                            row.Insert(0, 1);
                        }
                        else
                        {
                            row.Insert(0, 0);
                        }
                        ei.LoadedMatrix.Add(j, row);
                    }

                    for (int j = 0; j < x.NoOfRows; j++)
                    {
                        double value = x.LoadedMatrix[j][0];
                        if (i == j)
                        {
                            Expression expression = lambda => value + lambda;
                            function.SetParameters(j, expression);
                        }
                        else
                        {
                            Expression expression = lambda => value;
                            function.SetParameters(j, expression);
                        }
                    }

                    UnimodalInterval interval       = UnimodalInterval.FindUnimodalInterval(function, 0, h);
                    UnimodalInterval lambdaInterval = GoldenSection.FindMinimum(function, interval.Minimum, interval.Maximum, e.LoadedMatrix[i][0]);
                    double           lambdaMin      = (lambdaInterval.Minimum + lambdaInterval.Maximum) / 2;
                    ei.MultiplyByScalar(lambdaMin);
                    x.AddValue(ei);
                }
            } while (x.SubtractMatrices(xs).IsLessThanOrEqual(e));
            function.DeleteParameters();

            return(x);
        }
Beispiel #2
0
        /// <summary>
        /// Executes Golden Section Optimization algorithm for given function.
        /// </summary>
        /// <param name="f">Function used in algorithm.</param>

        public static void GoldenSectionOptimization(Function f)
        {
            Console.WriteLine("ZLATNI REZ:");
            Console.WriteLine("============================================");
            Console.WriteLine("Unesite 1 ako želite predati početnu točku za koju će se izračunati unimodalni interval ili 2 ako unosite unimodalni interval iz datoteke sami.");
            string line   = Console.ReadLine();
            int    choice = Int32.Parse(line);

            if (choice == 1)
            {
                Console.WriteLine("Upišite putanju do datoteke s početnom točkom:");
                string path1         = Console.ReadLine();
                double startingPoint = ReadValueFromFile(path1);
                Console.WriteLine("Upišite putanju do datoteke s preciznosti e:");
                string path2 = Console.ReadLine();
                double e     = ReadValueFromFile(path2);
                Console.WriteLine("Upišite putanju do datoteke s pomakom pretraživanja h:");
                string           path3    = Console.ReadLine();
                double           h        = ReadValueFromFile(path3);
                UnimodalInterval interval = UnimodalInterval.FindUnimodalInterval(f, startingPoint, h);
                UnimodalInterval result   = GoldenSection.FindMinimum(f, interval.Minimum, interval.Maximum, e);
                Console.WriteLine("\nRješenje:");
                Console.WriteLine("============");
                Console.WriteLine("[" + result.Minimum + ", " + result.Maximum + "]");
            }
            else if (choice == 2)
            {
                Console.WriteLine("Upišite putanju do datoteke s unimodalnim intervalom:");
                string           path1    = Console.ReadLine();
                UnimodalInterval interval = GetUnimodalIntervalFromFile(path1);
                Console.WriteLine("Upišite putanju do datoteke s preciznosti e:");
                string           path2  = Console.ReadLine();
                double           e      = ReadValueFromFile(path2);
                UnimodalInterval result = GoldenSection.FindMinimum(f, interval.Minimum, interval.Maximum, e);
                Console.WriteLine("\nRješenje:");
                Console.WriteLine("============");
                Console.WriteLine("[" + result.Minimum + ", " + result.Maximum + "]");
            }
            else
            {
                throw new ArgumentException("Niste odabrali ni 1 ni 2!");
            }
        }