genconstr.py


# !/usr/bin/env python3.7 # 2023年版权,Gurobi优化狗万app足彩,LLC #在这个例子中,我们展示了使用通用约束建模#一些常见的表达式。我们使用作为一个例子一个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 (Clause1,……Clause8) #其中Obj1 = 1 - > Clause1 +……+ Clause8 > = 4 # #因此,客观价值将两个当且仅当我们可以满足所有#条款;当且仅当一个至少有四个条款可以满意,否则和# 0。进口gurobipy从gurobipy gp进口伽马线暴进口sys试题: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 =伽马线暴。二进制,name = " X ") NotLit =模型。addVars (NLITERALS vtype =伽马线暴。二进制,name = " NotX ") Cla = model.addVars (len(条款),vtype =伽马线暴。二进制、名称=“条款”)Obj0 = model.addVar (vtype =伽马线暴。二进制、名称=“Obj0”)其中Obj1 = model.addVar (vtype =伽马线暴。二进制,name = "其中Obj1 ") #链接Xi和notXi模型。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')