PySCIPOpt  4.3.0
Python Interface for the SCIP Optimization Suite
bpp.py
Go to the documentation of this file.
1 
3 """
4 The instance of the bin packing problem is represented by the two
5 lists of n items of sizes and quantity s=(s_i).
6 The bin size is B.
7 
8 We use Martello and Toth (1990) formulation, and suggest
9 extensions with tie-breaking and SOS constraints.
10 
11 Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012
12 """
13 
14 from pyscipopt import Model, quicksum
15 
16 def FFD(s,B):
17  """First Fit Decreasing heuristics for the Bin Packing Problem.
18  Parameters:
19  - s: list with item widths
20  - B: bin capacity
21  Returns a list of lists with bin compositions.
22  """
23  remain = [B] # keep list of empty space per bin
24  sol = [[]] # a list ot items (i.e., sizes) on each used bin
25  for item in sorted(s,reverse=True):
26  for (j,free) in enumerate(remain):
27  if free >= item:
28  remain[j] -= item
29  sol[j].append(item)
30  break
31  else: #does not fit in any bin
32  sol.append([item])
33  remain.append(B-item)
34  return sol
35 
36 
37 def bpp(s,B):
38  """bpp: Martello and Toth's model to solve the bin packing problem.
39  Parameters:
40  - s: list with item widths
41  - B: bin capacity
42  Returns a model, ready to be solved.
43  """
44  n = len(s)
45  U = len(FFD(s,B)) # upper bound of the number of bins
46  model = Model("bpp")
47  # setParam("MIPFocus",1)
48  x,y = {},{}
49  for i in range(n):
50  for j in range(U):
51  x[i,j] = model.addVar(vtype="B", name="x(%s,%s)"%(i,j))
52  for j in range(U):
53  y[j] = model.addVar(vtype="B", name="y(%s)"%j)
54 
55  # assignment constraints
56  for i in range(n):
57  model.addCons(quicksum(x[i,j] for j in range(U)) == 1, "Assign(%s)"%i)
58 
59  # bin capacity constraints
60  for j in range(U):
61  model.addCons(quicksum(s[i]*x[i,j] for i in range(n)) <= B*y[j], "Capac(%s)"%j)
62 
63  # tighten assignment constraints
64  for j in range(U):
65  for i in range(n):
66  model.addCons(x[i,j] <= y[j], "Strong(%s,%s)"%(i,j))
67 
68  # tie breaking constraints
69  for j in range(U-1):
70  model.addCons(y[j] >= y[j+1],"TieBrk(%s)"%j)
71 
72  # SOS constraints
73  for i in range(n):
74  model.addConsSOS1([x[i,j] for j in range(U)])
75 
76  model.setObjective(quicksum(y[j] for j in range(U)), "minimize")
77  model.data = x,y
78 
79  return model
80 
81 
82 def solveBinPacking(s,B):
83  """solveBinPacking: use an IP model to solve the in Packing Problem.
84 
85  Parameters:
86  - s: list with item widths
87  - B: bin capacity
88 
89  Returns a solution: list of lists, each of which with the items in a roll.
90  """
91  n = len(s)
92  U = len(FFD(s,B)) # upper bound of the number of bins
93  model = bpp(s,B)
94  x,y = model.data
95 
96  model.optimize()
97 
98  bins = [[] for i in range(U)]
99  for (i,j) in x:
100  if model.getVal(x[i,j]) > .5:
101  bins[j].append(s[i])
102  for i in range(bins.count([])):
103  bins.remove([])
104  for b in bins:
105  b.sort()
106  bins.sort()
107  return bins
108 
109 
110 import random
111 def DiscreteUniform(n=10,LB=1,UB=99,B=100):
112  """DiscreteUniform: create random, uniform instance for the bin packing problem."""
113  B = 100
114  s = [0]*n
115  for i in range(n):
116  s[i] = random.randint(LB,UB)
117  return s,B
118 
119 
120 if __name__ == "__main__":
121  random.seed(256)
123  print("items:", s)
124  print("bin size:", B)
125 
126  ffd = FFD(s,B)
127  print("\n\n\n FFD heuristic:")
128  print("Solution:")
129  print(ffd)
130  print(len(ffd), "bins")
131 
132  print("\n\n\n IP formulation:")
133  bins = solveBinPacking(s,B)
134  print("Solution:")
135  print(bins)
136  print(len(bins), "bins")
pyscipopt.expr.quicksum
def quicksum(termlist)
Definition: expr.pxi:357
bpp.bpp
def bpp(s, B)
Definition: bpp.py:37
bpp.FFD
def FFD(s, B)
Definition: bpp.py:16
bpp
Definition: bpp.py:1
bpp.solveBinPacking
def solveBinPacking(s, B)
Definition: bpp.py:82
bpp.DiscreteUniform
def DiscreteUniform(n=10, LB=1, UB=99, B=100)
Definition: bpp.py:111