コード例 #1
0
        private bool IsBalanced()
        {
            var popyt = Odbiorcy.Sum(o => o.Value);
            var podaz = Dostawcy.Sum(o => o.Value);

            return(popyt == podaz);
        }
コード例 #2
0
        public void AddOdbiorca(int a_value)
        {
            if (m_isInit)
            {
                throw new Exception("Nrak możliwości dodania odbiorcy. Solver został już zainicjowany");
            }


            var supp = new InputData(Odbiorcy.Count, InputType.Odbiorca, a_value);

            Odbiorcy.Add(supp);
        }
コード例 #3
0
        private void AddVirtualInputData()
        {
            var popyt = Odbiorcy.Sum(o => o.Value);
            var podaz = Dostawcy.Sum(o => o.Value);

            if (popyt > podaz)
            {
                Dostawcy.Add(new InputData(Dostawcy.Count, InputType.Dostawca, popyt - podaz, true));
            }
            else
            {
                Odbiorcy.Add(new InputData(Odbiorcy.Count, InputType.Odbiorca, podaz - popyt, true));
            }
        }
コード例 #4
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;
        }
コード例 #5
0
        private void RecalculateDataGrid()
        {
            var virtualGrid = Utility.CreateEmptyCellGrid(Dostawcy.Count, Odbiorcy.Count);

            for (int y = 0; y < m_userData.UnitCostGrid.Length; y++)
            {
                for (int x = 0; x < m_userData.UnitCostGrid[y].Length; x++)
                {
                    var cell    = m_userData.UnitCostGrid[y][x];
                    var newCell = new GridCell(x, y);
                    newCell.KosztyJednostkowe = cell.KosztyJednostkowe;
                    virtualGrid[y][x]         = newCell;
                }
            }

            var virtualOdbiorcaIndex = Odbiorcy.SingleOrDefault(e => e.IsVirtual)?.Id;
            var virtualDostawcaIndex = Dostawcy.SingleOrDefault(e => e.IsVirtual)?.Id;

            for (int y = 0; y < virtualGrid.Length; y++)
            {
                for (int x = 0; x < virtualGrid[0].Length; x++)
                {
                    if (virtualOdbiorcaIndex == x)
                    {
                        virtualGrid[y][x].IsVirtual = true;
                    }

                    if (virtualDostawcaIndex == y)
                    {
                        virtualGrid[y][x].IsVirtual = true;
                    }
                }
            }

            m_userData.UnitCostGrid = virtualGrid;
        }