class NRooks: def __init__(self, N = 1): def rowConstraint(state, values, size = N): pairs = values.items() validStates = list(range(state.state//size*size, state.state//size*size+size)) validPairs = list(filter(lambda pair: pair[1] and pair[0].state in validStates, pairs)) statesToConsider = list(map(lambda x: x[1], validPairs)) return sum(statesToConsider) <= 1 def columnConstraint(state, values, size = N): pairs = values.items() validStates = list(range(state.state % size, size**2,size)) validPairs = list(filter(lambda pair: pair[1] and pair[0].state in validStates, pairs)) statesToConsider = map(lambda x: x[1], validPairs) return sum(statesToConsider) <= 1 self._number = N goal = lambda values, size=N: sum(map(lambda v: v[1], values.items())) == size self._CSP = CSP(goal, ChessState(0, set([True,False]),N)) for i in range(N*N): self._CSP.addVariable(ChessState(i, set([True,False]),N)) self._CSP.addConstraint(rowConstraint) self._CSP.addConstraint(columnConstraint) def solve(self): return self._CSP.solve()
def toCSP(self) -> CSP: """ Transforms the map into a CSP :return: the CSP """ csp = CSP() for p in self._region: v = Variable( 'region ' + str('%.3f' % p.x()) + '-' + str('%.3f' % p.y()), self._color) csp.addVariable(v) for l in self._borders: csp.addBinaryConstraint( csp.getVariable('region ' + str('%.3f' % l[0].x()) + '-' + str('%.3f' % l[0].y())), Constraint(different), csp.getVariable('region ' + str('%.3f' % l[1].x()) + '-' + str('%.3f' % l[1].y()))) return csp
class NBishops: def __init__(self, N=1): def leftDiagonalConstraint(state, values, size=N): pairs = values.items() validStates = list( range( state.state - min(state.state // size, state.state % size) * (size + 1), size**2, size + 1)) validPairs = list( filter(lambda pair: pair[1] and pair[0].state in validStates, pairs)) statesToConsider = map(lambda x: x[1], validPairs) return sum(statesToConsider) <= 1 def rightDiagonalConstraint(state, values, size=N): pairs = values.items() validStates = list( range( state.state - min(state.state // size, (N - 1) - state.state % size) * (size - 1), size**2, (size - 1))) validPairs = list( filter(lambda pair: pair[1] and pair[0].state in validStates, pairs)) statesToConsider = map(lambda x: x[1], validPairs) return sum(statesToConsider) <= 1 self._number = N goal = lambda values, size=N: sum(map(lambda v: v[1], values.items()) ) == size self._CSP = CSP(goal, ChessState(0, set([True, False]), N)) for i in range(N * N): self._CSP.addVariable(ChessState(i, set([True, False]), N)) self._CSP.addConstraint(leftDiagonalConstraint) self._CSP.addConstraint(rightDiagonalConstraint) def solve(self): return self._CSP.solve()