public SparseMatrix Solve() { N = Costs.RowCount; ModifyInitialCosts(); var tasks = new Queue<SalesmanTask>(); tasks.Enqueue(new SalesmanTask()); do { var currTask = tasks.Dequeue(); var ap = PrepareAssignmentProblem(currTask); var resultPath = ap.Solve(); if (ap.TotalCost >= Record) continue; var chains = GetChains(resultPath); if (chains.Count == 0) throw new ArithmeticException("Problem has no chains!"); if (chains.Count == 1) { AnswerFound = true; Record = ap.TotalCost; RecordChain = chains.First(); continue; } var shortestChain = chains.First(); foreach (var chain in chains.Skip(1)) { if (chain.Count < shortestChain.Count) { shortestChain = chain; } } for (int i = 0; i < shortestChain.Count - 1; i++) { var newTask = new SalesmanTask(currTask.InfiniteRoads); newTask.AddInfiniteRoad(shortestChain[i], shortestChain[i + 1]); tasks.Enqueue(newTask); } } while (tasks.Count != 0); if (!AnswerFound) throw new ArithmeticException("Problem has no chains!"); return BuildResult(); }
private AssingmentProblem PrepareAssignmentProblem(SalesmanTask task) { DenseMatrix newCosts = (DenseMatrix)Costs.Clone(); foreach (var infRoad in task.InfiniteRoads) { newCosts[infRoad.Item1, infRoad.Item2] = Double.PositiveInfinity; } var ap = new AssingmentProblem(newCosts); return ap; }