/// <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; }
/// <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; } }