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);
        }
Esempio n. 2
0
        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);
        }