python+constraits+NPhard problem

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,返回给下一个阶段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值