예제 #1
0
        /// <summary>
        /// Inicjalizuje początkową iterację dla zadanych dostawców i odbiorców.
        /// Jeżeli podczas tworzenia instancji solvera nie zostały przekazane dane wejściowe,
        /// po wykonaniu Init należy dodać koszty.
        /// Po wykonaniu Init, brak możliwości definiowania dostawców i odbiorców.
        /// </summary>
        public void Init(JobType a_jobType)
        {
            IterationBase iteracjaStartowa = null;
            var           isUserDataSet    = !(m_userData is null);

            if (!isUserDataSet && (Dostawcy.Count < 1 || Odbiorcy.Count < 1))
            {
                throw new Exception("Przed zainicjowaniem solvera należy dodać conajmniej jednego dostawcę oraz odbiorcę.");
            }

            GridCell[][] grid = isUserDataSet
                     ? m_userData.UnitCostGrid
                     : Utility.CreateEmptyCellGrid(Dostawcy.Count, Odbiorcy.Count);

            if (a_jobType == JobType.TransportCosts)
            {
                var isBalaced = IsBalanced();
                if (!isBalaced)
                {
                    AddVirtualInputData();
                }

                if (!isBalaced && isUserDataSet)
                {
                    RecalculateDataGrid();
                    grid = m_userData.UnitCostGrid;
                }
                iteracjaStartowa = new IterationTransportCosts(grid, JobType.TransportCosts, ++m_iterator);
            }

            if (a_jobType == JobType.Profit)
            {
                var(vDostawca, vOdbiorca) = IterationProfit.CreateVirtualInputData(Dostawcy, Odbiorcy);
                Dostawcy.Add(vDostawca);
                Odbiorcy.Add(vOdbiorca);
                RecalculateDataGrid();
                grid             = m_userData.UnitCostGrid;
                iteracjaStartowa = new IterationProfit(grid, JobType.Profit, ++m_iterator);
            }

            m_startIteration = iteracjaStartowa;
            Iterations.Add(iteracjaStartowa);
            m_isInit = true;
        }
예제 #2
0
        /// <summary>
        /// Rozwiązuje zadanie w iteraciach.
        /// </summary>
        public void Resolve(JobType a_jobType)
        {
            CanByResolve();

            var           attempt  = 0;
            IterationBase iteracja = m_startIteration;
            int?          aktulaneWartoscOptymalna = null;

            OptimalSolutionFound = false;

            iteracja.CalculateGridInit(Dostawcy, Odbiorcy);
            aktulaneWartoscOptymalna = iteracja.IterationResultValue;

            while (!OptimalSolutionFound)
            {
                attempt++;
                var nextStepGrid = iteracja.CalculateNextIteration();

                if (iteracja.Error.IsError)
                {
                    ErrorMessage = iteracja.Error.Message;
                    return;
                }

                if (iteracja.IsOptimal)
                {
                    OptimalSolutionFound = true;
                    continue;
                }

                iteracja = a_jobType == JobType.TransportCosts
                              ? new IterationTransportCosts(nextStepGrid, JobType.TransportCosts, ++m_iterator) as IterationBase
                              : new IterationProfit(nextStepGrid, JobType.Profit, ++m_iterator) as IterationBase;

                iteracja.CalculateIterationResult();
                var zoptymalizowaneWartosc = iteracja.IterationResultValue;

                var express = a_jobType == JobType.TransportCosts
                                    ? aktulaneWartoscOptymalna > zoptymalizowaneWartosc
                                    : aktulaneWartoscOptymalna < zoptymalizowaneWartosc;

                if (express)
                {
                    aktulaneWartoscOptymalna = zoptymalizowaneWartosc;
                    Iterations.Add(iteracja);
                    iteracja.CalculateGrid(Dostawcy, Odbiorcy);

                    if (iteracja.Error.IsError)
                    {
                        ErrorMessage = iteracja.Error.Message;
                        return;
                    }

                    if (attempt >= AttemptsLimit)
                    {
                        ErrorMessage = "Nie udało się wyznaczyć optymalnego rozwiązania w iteracjach. Zweryfikuj wprowadzone dane";
                        return;
                    }
                    continue;
                }
                OptimalSolutionFound = true;
            }
        }