public void Optimize(int numTrials) { System.Diagnostics.Stopwatch AStopwatch = new System.Diagnostics.Stopwatch(); AStopwatch.Start(); double utility = 0; symR = Matrix.SymmetricPart(R); symW = Matrix.SymmetricPart(W); int numHappy = 0; List <Permutation> TestedPerms = new List <Permutation>(numTrials); for (int n = 1; n <= numTrials; n++) { Permutation testSeatingPlan; Permutation initialP; do { initialP = Permutation.RandomPermutation(W.Columns); }while (TestedPerms.ContainsElement(initialP)); double testUtility = Permutation.MaximiseUtilityFunction(initialP, U, out testSeatingPlan); int testNumHappy = countHappyPeople(testSeatingPlan); if (testNumHappy > numHappy || n == 1) { utility = testUtility; this.optimalSeatingPlan = testSeatingPlan; numHappy = testNumHappy; System.Diagnostics.Debug.WriteLine("*** Trial #{0} ***", n); System.Diagnostics.Debug.WriteLine(string.Format("New max: {0} Num Happy: {1}", utility, numHappy)); } else if (testNumHappy == numHappy) { if (testUtility > utility) { utility = testUtility; this.optimalSeatingPlan = testSeatingPlan; numHappy = testNumHappy; System.Diagnostics.Debug.WriteLine("*** Trial #{0} ***", n); System.Diagnostics.Debug.WriteLine(string.Format("New max: {0} Num Happy: {1}", utility, numHappy)); } } //bw.ReportProgress((int)((double)n / (double)numTrials * 100.0)); } AStopwatch.Stop(); System.Diagnostics.Debug.WriteLine("Max Utility: {0}", utility); System.Diagnostics.Debug.WriteLine("Num Happy: {0}", numHappy); System.Diagnostics.Debug.WriteLine("Time to test: {0}", AStopwatch.ElapsedMilliseconds); }
public static Matrix RandomPermutationMatrix(int N) { ////Step 1: generate a random vector with distinct integer entries //Random rand = new Random(); //Matrix v = new Matrix(1, N); //while (true) //{ // for (int j = 1; j <= N; j++) // { // v[1, j] = rand.Next(); // } // bool matches = false; // for (int i = 1; i <= N - 1; i++) // for (int j = i + 1; j <= N; j++) // { // if (v[1, i] == v[1, j]) // { // matches = true; // j = N + 1; // i = N; // } // } // if (!matches) // break; //} ////Step 2: Calculate the order of the random numbers //Matrix order = new Matrix(1, N); //for (int n = 1; n <= N; n++) //{ // order[1, n] = N; // var x = v[1, n]; // for (int m = 1; m <= N; m++) // { // if (x > v[1, m]) // order[1, n]--; // } //} Permutation Perm = Permutation.RandomPermutation(N); //Step 3: Generate a permutation matrix from the order Matrix P = new Matrix(N, N); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if (Perm[i] == j) { P[i, j] = 1; } else { P[i, j] = 0; } } } return(P); }