//protected Random _random = new Random(0);

        /// <summary>
        /// Liefert die nächste zu belegende Variable zurück.
        /// </summary>
        /// <remarks>Die Auswahl findet dabei
        /// über die MRV-Heuristic statt(Minimum Remaining Values).
        /// Haben mehrere Variablen die gleiche Anzahl verbleibender Werte, dann
        /// wird die GradHeuristic genutzt, d.h. es wird die Variable genommen, die in
        /// den meisten Randbedingungen vorkommt.
        /// </remarks>
        /// <param name="configuration">Die Konfiguration, die noch nicht belegte Variablen enthält.</param>
        /// <param name="constraintList">Die Liste mit den Randbedingungen.</param>
        /// <returns>
        /// Gibt die als nächstes zu belegende Variable zurück.
        /// </returns>
        public Variable GetHeuristicVariable(ConstraintConfiguration configuration, ConstraintList constraintList)
        {
            Variable        result          = null;
            int             minDomainValues = 0;
            List <Variable> mrvVariables    = new List <Variable>();

            //// Zufall
            //SortedList<double, Variable> sortedList = new SortedList<double, Variable>(configuration.Variables.GetLength(0));
            //foreach (Variable var in configuration.Variables)
            //{
            //    sortedList.Add(_random.NextDouble(), var);
            //}

            //// search the variables with the minimum remaining values
            //foreach(Variable var in sortedList.Values)
            foreach (Variable var in configuration.Variables)
            {
                if (!var.HasAsignedValue)
                {
                    if (result == null)
                    {
                        result          = var;
                        minDomainValues = var.Domain.Count;
                        mrvVariables.Add(var);
                    }
                    else if (minDomainValues > var.Domain.Count)
                    {
                        mrvVariables.Clear();
                        result          = var;
                        minDomainValues = var.Domain.Count;
                        mrvVariables.Add(var);
                    }
                    else if (minDomainValues == var.Domain.Count)
                    {
                        mrvVariables.Add(var);
                    }
                }
            }

            // are there more then one variables we should use the variable with the most constraints
            if (mrvVariables.Count != 1)
            {
                int countConstraints    = 0;
                int varCountConstraints = 0;

                foreach (Variable var in mrvVariables)
                {
                    varCountConstraints = constraintList.GetConstraints(var.Name).Count;
                    if (varCountConstraints > countConstraints)
                    {
                        result           = var;
                        countConstraints = varCountConstraints;
                    }
                }
            }
            return(result);
        }
Beispiel #2
0
        /// <summary>
        /// Generates an object from its XML representation.
        /// </summary>
        /// <param name="reader">The <see cref="T:System.Xml.XmlReader"/> stream from which the object is deserialized.</param>
        public void ReadXml(XmlReader reader)
        {
            // die Variablenoperatoren werden im Problem gemerkt
            // Das Dictionary kann später wieder geleert werden, wenn die Variablenoperatoren in den Constraints sind
            VariablesOperator.VarOperatorList.Clear();
            reader.Read();
            _xmlVersion = reader.ReadElementContentAsString();
            XmlSerializer xmlSerializer;

            if (reader.Name == "ConstraintConfiguration")
            {
                xmlSerializer = new XmlSerializer(typeof(ConstraintConfiguration));
                _begin        = CreateNode(null, xmlSerializer.Deserialize(reader) as ConstraintConfiguration);
                //_begin.Data = xmlSerializer.Deserialize(reader) as ConstraintConfiguration;
            }
            xmlSerializer   = new XmlSerializer(typeof(ConstraintList));
            _constraintList = xmlSerializer.Deserialize(reader) as ConstraintList;
            reader.Read();
            VariablesOperator.VarOperatorList.Clear();
        }