public double CalculateIndividualUtility(int i, Permutation Q)
        {
            Permutation P = Q.Inverse();

            double acc = 0;

            for (int j = 1; j <= P.Length; j++)
            {
                if (i != j)
                {
                    acc += symW[P[i], P[j]] * symR[i, j];
                }
            }

            return(acc);
        }
        private double CalculateMaximumUtility(int i, Permutation Q)
        {
            Permutation S = Q.Inverse();

            double[] localSeating = new double[S.Length];
            double[] bestBuddies  = new double[S.Length];
            for (int j = 1; j <= S.Length; j++)
            {
                localSeating[j - 1] = symW[S[i], j];
                bestBuddies[j - 1]  = symR[i, j];
            }

            Permutation.Sort(localSeating);
            Permutation.Sort(bestBuddies);

            double acc = 0;

            for (int j = 0; j < S.Length; j++)
            {
                acc += localSeating[j] * bestBuddies[j];
            }

            return(acc);
        }