예제 #1
0
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
예제 #2
0
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
예제 #3
0
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
예제 #4
0
파일: bpp.py 프로젝트: zhenjames/PySCIPOpt
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
예제 #5
0
파일: bpp.py 프로젝트: fserra/PySCIPOpt
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