genconstr.py


genconstr.py


# !在这个例子中,我们展示了如何使用通用约束来建模#一些常见的表达式。狗万app足彩我们使用作为一个例子一个sat问题#想看看是否可以满足至少四(或者全部)条款的逻辑# # # L = (x0或~ x1和x2)和(x1和x2 ~或x3)和# (x2 ~ x3或x0)和(x3 ~ x0或x1)和# (~ x0或~ x1和x2)和(~ ~ x1和x2或x3)和# (x2 ~ ~ x3或x0)和(~ x3 ~ x0或x1) # #我们这样做引入两个变量为每个文字(本身和其#否定价值),一个变量对于每一个条款,然后两个#变量指示如果我们能满足四个,而另一个确定#的最低条款(如果这是一个,我们可以满足所有条款)#,把这两个变量的目的。例如,目标函数将是# #最大化Obj0 + Obj1 # # Obj0 = MIN(第1条,…# Obj1 = 1 -> claus1 +…因此,当且仅当我们能够满足所有的#子句时,目标值将是2;一个当且仅当至少满足四个子句,否则为0。从gurobipy import GRB import sys try: NLITERALS = 4 n = NLITERALS #示例数据:#例如{0 n + 1 2}意味着条款(x0或~ x1和x2)条款= [[0 n + 1 2], [1, n + 2, 3], [2 n + 3,0], [3 n + 0,1], [n + 0, n + 1,2], [n + 1, n + 2, 3], [n + 2, + 3, 0], [n + 3 n + 0, 1]] #创建一个新的模型模型= gp.Model (Genconstr) #初始化决策变量和目标点燃=模型。addVars (NLITERALS vtype =伽马线暴。BINARY, name="X") NotLit = model.addVars(NLITERALS, vtype=GRB.BINARY, name="NotX") Cla = model.addVars(len(Clauses), vtype=GRB.BINARY, name="Clause") Obj0 = model.addVar(vtype=GRB.BINARY, name="Obj0") Obj1 = model.addVar(vtype=GRB.BINARY, name="Obj1") # Link Xi and notXi model.addConstrs((Lit[i] + NotLit[i] == 1.0 for i in range(NLITERALS)), name="CNSTR_X") # Link clauses and literals for i, c in enumerate(Clauses): clause = [] for l in c: if l >= n: clause.append(NotLit[l-n]) else: clause.append(Lit[l]) model.addConstr(Cla[i] == gp.or_(clause), "CNSTR_Clause" + str(i)) # Link objs with clauses model.addConstr(Obj0 == gp.min_(Cla), name="CNSTR_Obj0") model.addConstr((Obj1 == 1) >> (Cla.sum() >= 4.0), name="CNSTR_Obj1") # Set optimization objective model.setObjective(Obj0 + Obj1, GRB.MAXIMIZE) # Save problem model.write("genconstr.mps") model.write("genconstr.lp") # Optimize model.optimize() # Status checking status = model.getAttr(GRB.Attr.Status) if status in (GRB.INF_OR_UNBD, GRB.INFEASIBLE, GRB.UNBOUNDED): print("The model cannot be solved because it is infeasible or " "unbounded") sys.exit(1) if status != GRB.OPTIMAL: print("Optimization was stopped with status ", status) sys.exit(1) # Print result objval = model.getAttr(GRB.Attr.ObjVal) if objval > 1.9: print("Logical expression is satisfiable") elif objval > 0.9: print("At least four clauses can be satisfied") else: print("Not even three clauses can be satisfied") except gp.GurobiError as e: print('Error code ' + str(e.errno) + ": " + str(e)) except AttributeError: print('Encountered an attribute error')