from constraint import *
problem = Problem()
problem.addVariable('a',[1,2,3])
problem.addVariable('b',[6,4,5])
table= [[[] for x in range(2)] for y in range(10)]
def fun(*args): #加入的ab参数,其实不影响输出
return True
problem.addConstraint(fun,('a','b'))
z = problem.getSolutions()
print(z)
添加纵向约束:
from constraint import * import numpy as np import re print("1{%s,}"%3) scheduleDays =7 officerDomain = np.linspace(0,2**scheduleDays-1) #排除明显是解空间的schedule,解决了区间问题 consectiveWorkingDayLimit =3 badPossibilities =[] for possibility in officerDomain: if re.search("1{%s,}"%consectiveWorkingDayLimit,bin(possibility)): badPossibilities.append(possibility) for badPossibility in badPossibilities: officerDomain.remove(badPossibility) #上面就解决了区间的问题--创建问题,加入变量 solver = MinConflictsSolver() problem = Problem(solver) officers =[] officers.append({'name':'Ryan','rank':'3'}) officers.append({'name':'Mone','rank':'1'}) officers.append({'name':'Eric','rank':'3'}) for officer in officers: problem.addVariable(officer,officerDomain) def expandBin(str, bitLength): temp = str length = len(str) if bitLength < length-2: print("ERR: expandbin was given a bitlength shorter than str length %s %s" % (temp,bitLength)) # remove the 0b str = str[2:] # add as many zeros to the beginning as needed while(len(str)<bitLength): str = "0"+str #print "expandBin: %s -> %s" % (temp, str) return str def getDayInt( i, possibility): return int(expandBin(bin(possibility), scheduleDays)[i]) fulfillmentThreshold = 2 #how many officers need to be working each day? for i in range(0,scheduleDays): def makeConstraint(day): def rankConstraint(*args): return sum(map(getDayInt,[day]*len(args), args)) >= fulfillmentThreshold return rankConstraint fulfillmentConstraint = makeConstraint(i) problem.addConstraint(fulfillmentConstraint, officers)
#约束条件,是对变量的约束,后面的officers是变量集合,表示变量。而前面的约束函数就是这些变量的约束,比如约束变量a,b,c,约束条件是a+b+c>5。最后#这个要求约束函数返回的是一个boolean值,就是true和false。当程序运行时,变量会任意变化,然后检测是否满足这个约束,得到的是true和false,返回给下一个阶段。