public static GiftMatrix DoTravelingSalesman(GiftMatrix thawedMatrix)
        {
            int[,] bestSolutionSoFar = null;
            int bestCostSoFar    = MaxWeight - 1;
            var partialSolutions = new Stack <int[, ]>();

            var empty = new int[thawedMatrix.NumberOfParticipants, thawedMatrix.NumberOfParticipants];

            for (int i = 1; i < thawedMatrix.NumberOfParticipants; i++)
            {
                var starter = Clone(empty);
                starter[0, i] = 1;
                partialSolutions.Push(starter);
            }

            while (partialSolutions.Count > 0)
            {
                var next = partialSolutions.Pop();
                var cost = Cost(next, thawedMatrix);
                if (cost < bestCostSoFar)
                {
                    if (IsTotalSolution(next))
                    {
                        bestCostSoFar     = cost;
                        bestSolutionSoFar = next;
                    }
                    else
                    {
                        GenerateNextPartialSolutions(next, partialSolutions);
                    }
                }
            }

            return(new GiftMatrix(thawedMatrix.Participants, bestSolutionSoFar));
        }
Exemple #2
0
        public Family(string[] participants)
        {
            int numParticipants = participants.Length;
            var costs           = new int[numParticipants, numParticipants];

            for (int i = 0; i < numParticipants; i++)
            {
                costs[i, i] = HamiltonianCircuitFinder.MaxWeight;
            }

            _thawedMatrix = new GiftMatrix(participants, costs);
        }
        private static int Cost(int[,] next, GiftMatrix thawedMatrix)
        {
            int partialCost = 0;

            for (int i = 0; i < thawedMatrix.NumberOfParticipants; i++)
            {
                for (int j = 0; j < thawedMatrix.NumberOfParticipants; j++)
                {
                    partialCost += next[i, j] * thawedMatrix.GetWeight(i, j);
                }
            }

            return(partialCost);
        }