Example #1
0
        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();
        }
Example #2
0
 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;
 }