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