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()); }
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); }