public void Calculate_cykl()
        {
            var odbiorcy = new List <InputData>()
            {
                new InputData(0, InputType.Odbiorca, 10, 30),
                new InputData(1, InputType.Odbiorca, 28, 25),
                new InputData(2, InputType.Odbiorca, 27, 30),
                new InputData(3, InputType.Odbiorca, 50, null, true)
            };

            var dostawcy = new List <InputData>()
            {
                new InputData(0, InputType.Dostawca, 20, 10),
                new InputData(1, InputType.Dostawca, 30, 12),
                new InputData(2, InputType.Odbiorca, 65, null, true)
            };

            var datagrid = Utility.CreateEmptyCellGrid(dostawcy.Count, odbiorcy.Count);

            datagrid[0][0].KosztyJednostkowe = 8;
            datagrid[0][1].KosztyJednostkowe = 14;
            datagrid[0][2].KosztyJednostkowe = 17;

            datagrid[1][0].KosztyJednostkowe = 12;
            datagrid[1][1].KosztyJednostkowe = 9;
            datagrid[1][2].KosztyJednostkowe = 19;

            datagrid[0][3].IsVirtual = true;
            datagrid[1][3].IsVirtual = true;
            datagrid[2][3].IsVirtual = true;

            datagrid[2][0].IsVirtual = true;
            datagrid[2][1].IsVirtual = true;
            datagrid[2][2].IsVirtual = true;

            var iteracja = new IterationProfit(datagrid, JobType.Profit, 1);

            iteracja.CalculateZysk(dostawcy, odbiorcy);
            iteracja.CalculatePrzydzial(dostawcy, odbiorcy);
            iteracja.CalculateWspolczynnikiAlfaAndBeta();
            iteracja.CalculateDeltyNiebazowe();

            var cycleDetector = new CycleDetector(iteracja.DataGrid, CycleBaseType.Maximizing).Detect();
            var points = cycleDetector.WyznaczonyCykl.ToPointsList();
            var expectedPoints = new string[] { "13", "12", "22", "23" }.ToList();

            Assert.IsTrue(expectedPoints.Contains(points[0].Id));
            Assert.IsTrue(expectedPoints.Contains(points[1].Id));
            Assert.IsTrue(expectedPoints.Contains(points[2].Id));
            Assert.IsTrue(expectedPoints.Contains(points[3].Id));

            Assert.AreEqual(2, cycleDetector.FindPrzydzialDoOptymalizacji());
        }
Exemple #2
0
        public override GridCell[][] CalculateNextIteration()
        {
            var cycleDetector = new CycleDetector(DataGrid, CycleBaseType.Maximizing).Detect();

            if (cycleDetector.Error.IsError)
            {
                Error = cycleDetector.Error;
                return(null);
            }

            IsOptimal = cycleDetector.IsOptimal;
            if (cycleDetector.IsOptimal)
            {
                IsCorrect = true;
                return(null);
            }

            var cycle = cycleDetector.WyznaczonyCykl;

            Cycle = cycle;
            var przydzial = cycleDetector.FindPrzydzialDoOptymalizacji();

            var nextIterationGrid = Utility.CreateEmptyCellGrid(DataGrid.Length, DataGrid[0].Length);
            var cyclePoints       = cycle.ToPointsList();

            var poz_el      = cycle.Start.Id;
            var punktyCyklu = cyclePoints.ToList();

            punktyCyklu.Remove(punktyCyklu.Single(e => e.Id == poz_el));
            var p1_negatywny = punktyCyklu.Single(x => x.Y == int.Parse(poz_el[0].ToString()));

            punktyCyklu.Remove(p1_negatywny);
            var p2_negatywny = punktyCyklu.Single(x => x.X == int.Parse(poz_el[1].ToString()));

            punktyCyklu.Remove(p2_negatywny);
            var p2_pozytywny = punktyCyklu.First();

            for (int j = 0; j < DataGrid.Length; j++)
            {
                for (int i = 0; i < DataGrid[j].Length; i++)
                {
                    nextIterationGrid[j][i].KosztyJednostkowe = DataGrid[j][i].KosztyJednostkowe;
                    nextIterationGrid[j][i].Zysk      = DataGrid[j][i].Zysk;
                    nextIterationGrid[j][i].IsVirtual = DataGrid[j][i].IsVirtual;

                    var wsp = cyclePoints.SingleOrDefault(e => e.Id == DataGrid[j][i].Id);
                    if (wsp is null)
                    {
                        nextIterationGrid[j][i].Przydzial = DataGrid[j][i].Przydzial;
                    }
                    else
                    {
                        var isEx = true;
                        if (p1_negatywny.Id == wsp.Id || p2_negatywny.Id == wsp.Id)
                        {
                            if (DataGrid[j][i].Przydzial is null)
                            {
                                DataGrid[j][i].Przydzial = 0;
                                isEx = false;
                            }

                            nextIterationGrid[j][i].Przydzial = DataGrid[j][i].Przydzial - przydzial;
                        }
                        else
                        {
                            if (DataGrid[j][i].Przydzial is null)
                            {
                                DataGrid[j][i].Przydzial = 0;
                                isEx = false;
                            }

                            nextIterationGrid[j][i].Przydzial = DataGrid[j][i].Przydzial + przydzial;
                        }

                        if (nextIterationGrid[j][i].Przydzial == 0 && isEx)
                        {
                            nextIterationGrid[j][i].Przydzial = null;
                        }
                    }
                }
            }
            IsCorrect = true;
            return(nextIterationGrid);
        }