/// <summary>
        /// Add a pair of connected variables for goal functions of the form (x1-x2)^2.  These are
        /// minimally satisfied, along with the default (x-i)^2 goal function, while also satisfying
        /// all constraints.
        /// </summary>
        /// <param name="variable1">The first variable</param>
        /// <param name="variable2">The second variable</param>
        /// <param name="relationshipWeight">The weight of the relationship</param>
        public void AddNeighborPair(Variable variable1, Variable variable2, double relationshipWeight)
        {
            ValidateArg.IsNotNull(variable1, "variable1");
            ValidateArg.IsNotNull(variable2, "variable2");
            if ((relationshipWeight <= 0) || double.IsNaN(relationshipWeight) || double.IsInfinity(relationshipWeight))
            {
                throw new ArgumentOutOfRangeException("relationshipWeight"
#if DEBUG
                        , "Invalid Neighbor Weight"
#endif // DEBUG
                    );
            }
            if (variable1 == variable2)
            {
                throw new InvalidOperationException(
#if DEBUG
                        "Cannot make a Variable a neighbor of itself"
#endif // DEBUG
                    );
            }
            variable1.AddNeighbor(variable2, relationshipWeight);
            variable2.AddNeighbor(variable1, relationshipWeight);
            this.hasNeighbourPairs = true;
        } // end AddNeighborPair()