예제 #1
0
        /// <summary>
        /// Creates the assignment and prunes other variables
        /// </summary>
        /// <param name="var">Variable.</param>
        /// <param name="val">Value.</param>
        /// <returns>True if the assignment is legal</returns>
        public bool AssignValue(Variable var, OverFloorType val, bool inference = true)
        {
            //Create a new assignment
            Assignment assign = new Assignment(var, val);
            //Get current domain before MAC3 to store posible values to prune
            List <OverFloorType> domainBeformMAC = var.remDomain.ToList();
            //Get variable prunes
            var validAssignment = true;

            if (inference)
            {
                validAssignment = Search.MAC3(ref assign, new CSP(this));
            }
            if (validAssignment)
            {
                //Prune all values that are not a variable
                assign.domainPrune.Add(var.pos, domainBeformMAC.Where(r => r != val).ToList());
                //Go over variable domain prunes to remove from variables
                foreach (var varPrune in assign.domainPrune.Keys)
                {
                    List <OverFloorType> valuesToPrune = assign.domainPrune[varPrune];
                    Variable             varToPrune    = vars.First(v => v.pos == varPrune);
                    foreach (var vPrune in valuesToPrune)
                    {
                        varToPrune.removeDomainElement(vPrune);
                    }
                }
                //Save the assignment
                assignments.Add(assign);
            }
            return(validAssignment);
        }