コード例 #1
0
 def intiliazeRandomly(self, csp):
     self._assignment = Assignment()
     domainLength = len(csp.getListOfDomains())
     for va in csp.getVariables():
         self._assignment.addVariableToAssignment(
             va,
             csp.getListOfDomains()[random.randint(0, domainLength - 1)])
コード例 #2
0
    def doInference(self, inferenceInfo, csp, variable, value):
        self.assignment = Assignment()
        self.assignment.addVariableToAssignment(variable, value)

        self.varToC = variable
        self.valToC = value

        queue = csp.getConstraints(variable)
        pairs = []

        for q in queue:
            if len(q.getScope()) == 2:
                obj = [q.getScope()[1], q.getScope()[0], q]
                pairs.append(obj)

        while len(pairs) > 0:
            constraint = pairs[0][2]
            if self.revise(csp, pairs[0][0], pairs[0][1], constraint):
                if len(csp.getDomainValues(pairs[0][0])) == 0:
                    return None

                for con in csp.getNeighboursOfVariableExcept(
                        pairs[0][0], pairs[0][1]):
                    if con.getScope(
                    )[0]._name == variable._name or con.getScope(
                    )[1]._name == variable._name:
                        continue
                    if con.getScope()[0]._name == pairs[0][0]._name:
                        pairs.append(
                            [con.getScope()[1],
                             con.getScope()[0], con])
                    else:
                        pairs.append(
                            [con.getScope()[0],
                             con.getScope()[1], con])
            del pairs[0]
        return []
コード例 #3
0
    def doInference(self, inferenceInfo, csp, variable, value):
        assignment = Assignment()
        assignment.addVariableToAssignment(variable, value)
        for con in csp.getConstraints(variable):
            otherVariables = csp.getNeighbour(variable, con)
            for ov in otherVariables:
                someValues = []
                changed = False
                domVals = inferenceInfo.getDomainsOfAffectedVariables(ov)
                if domVals is None:
                    domVals = csp.getDomainValues(ov)

                for domVal in domVals:
                    assignment.addVariableToAssignment(ov, domVal)
                    if not con.isConsistentWith(assignment):
                        changed = True
                    else:
                        someValues.append(domVal)

                if changed:
                    inferenceInfo.addToAffectedVariables(ov, someValues)

                assignment.removeVariableFromAssignment(ov)
        return []
コード例 #4
0
class ArcConsistencyInference(object):
    '''
    classdocs
    '''
    def __init__(self):
        pass

    def doInference(self, inferenceInfo, csp, variable, value):
        self.assignment = Assignment()
        self.assignment.addVariableToAssignment(variable, value)

        self.varToC = variable
        self.valToC = value

        queue = csp.getConstraints(variable)
        pairs = []

        for q in queue:
            if len(q.getScope()) == 2:
                obj = [q.getScope()[1], q.getScope()[0], q]
                pairs.append(obj)

        while len(pairs) > 0:
            constraint = pairs[0][2]
            if self.revise(csp, pairs[0][0], pairs[0][1], constraint):
                if len(csp.getDomainValues(pairs[0][0])) == 0:
                    return None

                for con in csp.getNeighboursOfVariableExcept(
                        pairs[0][0], pairs[0][1]):
                    if con.getScope(
                    )[0]._name == variable._name or con.getScope(
                    )[1]._name == variable._name:
                        continue
                    if con.getScope()[0]._name == pairs[0][0]._name:
                        pairs.append(
                            [con.getScope()[1],
                             con.getScope()[0], con])
                    else:
                        pairs.append(
                            [con.getScope()[0],
                             con.getScope()[1], con])
            del pairs[0]
        return []

    def revise(self, csp, var1, var2, constraint):
        revised = False
        dv2Values = []

        assignment = Assignment()
        assignment.addVariableToAssignment(self.varToC, self.valToC)

        if assignment.hasAssignmentFor(var2):
            dv2Values.append(self.assignment.getAssignmentOfVariable(var2))
        else:
            dv2Values = csp.getDomainValues(var2)

        for dv1 in csp.getDomainValues(var1):
            for dv2 in dv2Values:
                if not assignment.hasAssignmentFor(var1):
                    assignment.addVariableToAssignment(var1, dv1)
                assignment.addVariableToAssignment(var1, dv1)
                if not assignment.isConsistent([constraint]):
                    csp.removeValueFromDomain(var1, dv1)
                    revised = True
        return revised
コード例 #5
0
    def revise(self, csp, var1, var2, constraint):
        revised = False
        dv2Values = []

        assignment = Assignment()
        assignment.addVariableToAssignment(self.varToC, self.valToC)

        if assignment.hasAssignmentFor(var2):
            dv2Values.append(self.assignment.getAssignmentOfVariable(var2))
        else:
            dv2Values = csp.getDomainValues(var2)

        for dv1 in csp.getDomainValues(var1):
            for dv2 in dv2Values:
                if not assignment.hasAssignmentFor(var1):
                    assignment.addVariableToAssignment(var1, dv1)
                assignment.addVariableToAssignment(var1, dv1)
                if not assignment.isConsistent([constraint]):
                    csp.removeValueFromDomain(var1, dv1)
                    revised = True
        return revised
コード例 #6
0
class LocalSearch(SearchStrategy):
    '''
    classdocs
    '''
    def __init__(self,
                 inferenceProcdeure,
                 listeners=[],
                 variableOrdering=False,
                 valueOrdering=False,
                 maxSteps=100000):
        '''
        Constructor
        '''
        SearchStrategy.__init__(self, listeners)
        self._inferenceProcedure = inferenceProcdeure
        self._variableOrdering = variableOrdering
        self._valueOrdering = valueOrdering
        self._maxSteps = maxSteps

    def intiliazeRandomly(self, csp):
        self._assignment = Assignment()
        domainLength = len(csp.getListOfDomains())
        for va in csp.getVariables():
            self._assignment.addVariableToAssignment(
                va,
                csp.getListOfDomains()[random.randint(0, domainLength - 1)])

    def solve(self, csp):
        self.intiliazeRandomly(csp)

        for _ in range(self._maxSteps):
            if self._assignment.isSolution(csp):
                return self._assignment
            cands = self.getConflictedVariable(csp)
            var = cands[random.randint(0, len(cands) - 1)]
            val = self.getMinConflictValueFor(var, csp)
            #             print(str(var)+"_"+str(val)+"__"+str(len(cands)))
            self.fireListeners(csp, self._assignment)
            self._assignment.addVariableToAssignment(var, val)

        return False

    def getConflictedVariable(self, csp):
        resultVariables = []

        for con in csp.getListOfConstraints():
            if not self._assignment.isConsistent([con]):
                for var in con.getScope():
                    if var not in resultVariables:
                        resultVariables.append(var)

        return resultVariables

    def getMinConflictValueFor(self, var, csp):

        constraints = csp.getConstraints(var)
        assignment = self._assignment.returnCopy()
        minConflict = 100000000000
        candidates = []

        for val in csp.getDomainValues(var):
            assignment.addVariableToAssignment(var, val)
            count = 0
            for con in constraints:
                if not assignment.isConsistent([con]):
                    count += 1
            if count <= minConflict:
                if count < minConflict:
                    candidates = []
                    minConflict = count
                candidates.append(val)

        return candidates[random.randint(0, len(candidates) - 1)]

    def fireListeners(self, csp, assignment):
        for listener in self._listeners:
            listener.fireChange(csp, assignment)
コード例 #7
0
 def solve(self, csp):
     return self.recursiveBacktrackingSearch(csp, Assignment())