예제 #1
0
        public aima.core.search.csp.CSP GetCsp(object owner, IContextLookup globalVars)
        {
            var toReturn = new DynamicCSP();

            Init(owner, globalVars, toReturn);
            return(toReturn);
        }
예제 #2
0
        private void Init(object owner, IContextLookup globalVars, DynamicCSP objCSP)
        {
            var objVariables  = Variables.EvaluateTyped(owner, globalVars);
            var dicoVariables = (from object objVariable in objVariables select ReflectionHelper.GetFriendlyName(objVariable)).ToDictionary(varName => varName, varName => new Variable(varName));

            foreach (var objVariable in dicoVariables.Values)
            {
                objCSP.AddNewVariable(objVariable);
            }
            var objDomains  = Domains.EvaluateGeneric(owner, globalVars);
            var dicoDomains = new Dictionary <string, Domain>();

            foreach (KeyValuePair <string, IEnumerable> keyValuePair in objDomains)
            {
                var domainArray = new ArrayList();
                foreach (object domainItem in keyValuePair.Value)
                {
                    domainArray.Add(domainItem);
                }
                Domain domain = new Domain(domainArray.ToArray());
                dicoDomains.Add(keyValuePair.Key, domain);
            }


            if (dicoDomains.Count == 0)
            {
                throw new ApplicationException("No Domain defined for CSP problem");
            }
            if (dicoDomains.Count == 1)
            {
                var      domain  = dicoDomains.Values.First();
                Iterator terator = objCSP.getVariables().iterator();
                while (terator.hasNext())
                {
                    objCSP.setDomain((Variable)terator.next(), domain);
                }
            }
            else
            {
                var varDomains = VariableDomains.GetValue(owner, globalVars);


                foreach (KeyValuePair <string, Variable> varPair in dicoVariables)
                {
                    string targetDomain;
                    Domain objDomain;
                    if (varDomains.TryGetValue(varPair.Key, out targetDomain) &&
                        dicoDomains.TryGetValue(targetDomain, out objDomain))
                    {
                        objCSP.setDomain(varPair.Value, objDomain);
                    }
                    else
                    {
                        throw new ApplicationException("Incomplete Variables Domain affectation");
                    }
                }
            }

            var objConstraints = Constraints.EvaluateTyped(owner, globalVars);

            foreach (Constraint objConstraint in objConstraints)
            {
                objCSP.addConstraint(objConstraint);
            }
        }