def gcp_fixed_k(V, E, K): """gcp_fixed_k -- model for minimizing number of bad edges in coloring a graph Parameters: - V: set/list of nodes in the graph - E: set/list of edges in the graph - K: number of colors to be used Returns a model, ready to be solved. """ model = Model("gcp - fixed k") x, z = {}, {} for i in V: for k in range(K): # vetex i in color k or not x[i, k] = model.addVar(vtype="B", name="x(%s,%s)" % (i, k)) for (i, j) in E: # bad edge(same color) or not z[i, j] = model.addVar(vtype="B", name="z(%s,%s)" % (i, j)) for i in V: model.addCons( quicksum(x[i, k] for k in range(K)) == 1, "AssignColor(%s)" % i) model.addConsSOS1([x[i, k] for k in range(K)]) for (i, j) in E: for k in range(K): model.addCons(x[i, k] + x[j, k] <= 1 + z[i, j], "BadEdge(%s,%s,%s)" % (i, j, k)) model.setObjective(quicksum(z[i, j] for (i, j) in E), "minimize") model.data = x return model
def gcp_sos(V, E, K): """gcp_sos -- model for minimizing the number of colors in a graph (use sos type 1 constraints) Parameters: - V: set/list of nodes in the graph - E: set/list of edges in the graph - K: upper bound to the number of colors Returns a model, ready to be solved. """ model = Model("gcp - sos constraints") x, y = {}, {} for k in range(K): y[k] = model.addVar(vtype="B", name="y(%s)" % k) for i in V: x[i, k] = model.addVar(vtype="B", name="x(%s,%s)" % (i, k)) for i in V: model.addCons( quicksum(x[i, k] for k in range(K)) == 1, "AssignColor(%s)" % i) model.addConsSOS1([x[i, k] for k in range(K)]) for (i, j) in E: for k in range(K): model.addCons(x[i, k] + x[j, k] <= y[k], "NotSameColor(%s,%s,%s)" % (i, j, k)) for k in range(K - 1): model.addCons(y[k] >= y[k + 1], "LowColor(%s)" % k) model.setObjective(quicksum(y[k] for k in range(K)), "minimize") model.data = x, y return model
def gcp_sos(V,E,K): """gcp_sos -- model for minimizing the number of colors in a graph (use sos type 1 constraints) Parameters: - V: set/list of nodes in the graph - E: set/list of edges in the graph - K: upper bound to the number of colors Returns a model, ready to be solved. """ model = Model("gcp - sos constraints") x,y = {},{} for k in range(K): y[k] = model.addVar(vtype="B", name="y(%s)"%k) for i in V: x[i,k] = model.addVar(vtype="B", name="x(%s,%s)"%(i,k)) for i in V: model.addCons(quicksum(x[i,k] for k in range(K)) == 1, "AssignColor(%s)" % i) model.addConsSOS1([x[i,k] for k in range(K)]) for (i,j) in E: for k in range(K): model.addCons(x[i,k] + x[j,k] <= y[k], "NotSameColor(%s,%s,%s)"%(i,j,k)) for k in range(K-1): model.addCons(y[k] >= y[k+1], "LowColor(%s)"%k) model.setObjective(quicksum(y[k] for k in range(K)), "minimize") model.data = x return model
def bpp(s, B): """bpp: Martello and Toth's model to solve the bin packing problem. Parameters: - s: list with item widths - B: bin capacity Returns a model, ready to be solved. """ n = len(s) U = len(FFD(s, B)) # upper bound of the number of bins model = Model("bpp") # setParam("MIPFocus",1) x, y = {}, {} for i in range(n): for j in range(U): x[i, j] = model.addVar(vtype="B", name="x(%s,%s)" % (i, j)) for j in range(U): y[j] = model.addVar(vtype="B", name="y(%s)" % j) # assignment constraints for i in range(n): model.addCons( quicksum(x[i, j] for j in range(U)) == 1, "Assign(%s)" % i) # bin capacity constraints for j in range(U): model.addCons( quicksum(s[i] * x[i, j] for i in range(n)) <= B * y[j], "Capac(%s)" % j) # tighten assignment constraints for j in range(U): for i in range(n): model.addCons(x[i, j] <= y[j], "Strong(%s,%s)" % (i, j)) # tie breaking constraints for j in range(U - 1): model.addCons(y[j] >= y[j + 1], "TieBrk(%s)" % j) # SOS constraints for i in range(n): model.addConsSOS1([x[i, j] for j in range(U)]) model.setObjective(quicksum(y[j] for j in range(U)), "minimize") model.data = x, y return model
def bpp(s,B): """bpp: Martello and Toth's model to solve the bin packing problem. Parameters: - s: list with item widths - B: bin capacity Returns a model, ready to be solved. """ n = len(s) U = len(FFD(s,B)) # upper bound of the number of bins model = Model("bpp") # setParam("MIPFocus",1) x,y = {},{} for i in range(n): for j in range(U): x[i,j] = model.addVar(vtype="B", name="x(%s,%s)"%(i,j)) for j in range(U): y[j] = model.addVar(vtype="B", name="y(%s)"%j) # assignment constraints for i in range(n): model.addCons(quicksum(x[i,j] for j in range(U)) == 1, "Assign(%s)"%i) # bin capacity constraints for j in range(U): model.addCons(quicksum(s[i]*x[i,j] for i in range(n)) <= B*y[j], "Capac(%s)"%j) # tighten assignment constraints for j in range(U): for i in range(n): model.addCons(x[i,j] <= y[j], "Strong(%s,%s)"%(i,j)) # tie breaking constraints for j in range(U-1): model.addCons(y[j] >= y[j+1],"TieBrk(%s)"%j) # SOS constraints for i in range(n): model.addConsSOS1([x[i,j] for j in range(U)]) model.setObjective(quicksum(y[j] for j in range(U)), "minimize") model.data = x,y return model