PySCIPOpt  4.3.0
Python Interface for the SCIP Optimization Suite
transp.py
Go to the documentation of this file.
1 
3 """
4 Model for solving a transportation problem:
5 minimize the total transportation cost for satisfying demand at
6 customers, from capacitated facilities.
7 
8 Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012
9 """
10 from pyscipopt import Model, quicksum, multidict
11 
12 def transp(I,J,c,d,M):
13  """transp -- model for solving the transportation problem
14  Parameters:
15  I - set of customers
16  J - set of facilities
17  c[i,j] - unit transportation cost on arc (i,j)
18  d[i] - demand at node i
19  M[j] - capacity
20  Returns a model, ready to be solved.
21  """
22 
23  model = Model("transportation")
24 
25  # Create variables
26  x = {}
27 
28  for i in I:
29  for j in J:
30  x[i,j] = model.addVar(vtype="C", name="x(%s,%s)" % (i, j))
31 
32  # Demand constraints
33  for i in I:
34  model.addCons(quicksum(x[i,j] for j in J if (i,j) in x) == d[i], name="Demand(%s)" % i)
35 
36  # Capacity constraints
37  for j in J:
38  model.addCons(quicksum(x[i,j] for i in I if (i,j) in x) <= M[j], name="Capacity(%s)" % j)
39 
40  # Objective
41  model.setObjective(quicksum(c[i,j]*x[i,j] for (i,j) in x), "minimize")
42 
43  model.optimize()
44 
45  model.data = x
46  return model
47 
48 
49 def make_inst1():
50  """creates example data set 1"""
51  I,d = multidict({1:80, 2:270, 3:250 , 4:160, 5:180}) # demand
52  J,M = multidict({1:500, 2:500, 3:500}) # capacity
53  c = {(1,1):4, (1,2):6, (1,3):9, # cost
54  (2,1):5, (2,2):4, (2,3):7,
55  (3,1):6, (3,2):3, (3,3):4,
56  (4,1):8, (4,2):5, (4,3):3,
57  (5,1):10, (5,2):8, (5,3):4,
58  }
59  return I,J,c,d,M
60 
61 
62 def make_inst2():
63  """creates example data set 2"""
64  I,d = multidict({1:45, 2:20, 3:30 , 4:30}) # demand
65  J,M = multidict({1:35, 2:50, 3:40}) # capacity
66  c = {(1,1):8, (1,2):9, (1,3):14 , # {(customer,factory) : cost<float>}
67  (2,1):6, (2,2):12, (2,3):9 ,
68  (3,1):10, (3,2):13, (3,3):16 ,
69  (4,1):9, (4,2):7, (4,3):5 ,
70  }
71  return I,J,c,d,M
72 
73 
74 if __name__ == "__main__":
75  I,J,c,d,M = make_inst1();
76  # I,J,c,d,M = make_inst2();
77  model = transp(I,J,c,d,M)
78  model.optimize()
79 
80  print("Optimal value:", model.getObjVal())
81 
82  EPS = 1.e-6
83  x = model.data
84 
85  for (i,j) in x:
86  if model.getVal(x[i,j]) > EPS:
87  print("sending quantity %10s from factory %3s to customer %3s" % (model.getVal(x[i,j]),j,i))
pyscipopt.expr.quicksum
def quicksum(termlist)
Definition: expr.pxi:357
transp.make_inst1
def make_inst1()
Definition: transp.py:49
transp.transp
def transp(I, J, c, d, M)
Definition: transp.py:12
transp
Definition: transp.py:1
transp.make_inst2
def make_inst2()
Definition: transp.py:62
pyscipopt.Multidict.multidict
def multidict(D)
Definition: Multidict.py:3