/// /// ///SOLVE PROBLEM /// /// public override byte[] Solve(byte[] partialData, TimeSpan timeout) { if (partialData == null || partialData.Length == 0) { return(null); } //przerób bajty na PartialProblemInstance var converter = new ProblemToBytesConverter(); var partialInstance = (DVRPPartialProblemInstance)converter.FromBytesArray(partialData); var instance = (DVRPProblemInstance)converter.FromBytesArray(_problemData); //dla każdego samochodu (listy klientów mu przypisanej) sprawdz poprawność kombinacji //(w sensie żądań) if (!demandsValid(instance)) { return(converter.ToByteArray(solutionImpossible())); } var n = instance.Visits.Count; var s = instance.VehicleNumber; var i = partialInstance.MinimalSetCount; if (s * i > n) { return(converter.ToByteArray(solutionImpossible())); } partialInstance.PartialResult = double.MaxValue; solveInParallel(instance, ref partialInstance); return(converter.ToByteArray(partialInstance)); }
/// <summary> /// templatka do zwracania enuma z Impossible /// </summary> /// <returns></returns> private DVRPPartialProblemInstance solutionImpossible() { var converter = new ProblemToBytesConverter(); return(new DVRPPartialProblemInstance() { PartialResult = double.MaxValue, SolutionResult = SolutionResult.Impossible, VisitIds = null }); }
/// /// ///DIVIDE PROBLEM /// /// public override byte[][] DivideProblem(int threadCount) { if (_problemData == null || _problemData.Length == 0) { return(null); } var converter = new ProblemToBytesConverter(); var instance = (DVRPProblemInstance)converter.FromBytesArray(_problemData); var problems = divideProblem(instance); return(problems.Select(x => converter.ToByteArray(x)).ToArray()); }
/// /// ///MERGE SOLUTION /// /// public override byte[] MergeSolution(byte[][] solutions) { if (solutions == null || solutions.GetLength(0) == 0) { return(null); } var converter = new ProblemToBytesConverter(); var partialSolutions = solutions.Select (solution => (DVRPPartialProblemInstance)converter.FromBytesArray(solution)).ToList(); var imin = 0; var minCost = double.MaxValue; for (var i = 0; i < solutions.GetLength(0); i++) { if (partialSolutions[i].PartialResult >= minCost) { continue; } imin = i; minCost = partialSolutions[i].PartialResult; } return(solutions[imin]); }