PySCIPOpt  4.3.0
Python Interface for the SCIP Optimization Suite
gcp.py
Go to the documentation of this file.
1 
3 """
4 Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012
5 """
6 
7 from pyscipopt import Model, quicksum, multidict
8 
9 def gcp(V,E,K):
10  """gcp -- model for minimizing the number of colors in a graph
11  Parameters:
12  - V: set/list of nodes in the graph
13  - E: set/list of edges in the graph
14  - K: upper bound on the number of colors
15  Returns a model, ready to be solved.
16  """
17  model = Model("gcp")
18  x,y = {},{}
19  for k in range(K):
20  y[k] = model.addVar(vtype="B", name="y(%s)"%k)
21  for i in V:
22  x[i,k] = model.addVar(vtype="B", name="x(%s,%s)"%(i,k))
23 
24  for i in V:
25  model.addCons(quicksum(x[i,k] for k in range(K)) == 1, "AssignColor(%s)"%i)
26 
27  for (i,j) in E:
28  for k in range(K):
29  model.addCons(x[i,k] + x[j,k] <= y[k], "NotSameColor(%s,%s,%s)"%(i,j,k))
30 
31  model.setObjective(quicksum(y[k] for k in range(K)), "minimize")
32 
33  model.data = x
34  return model
35 
36 
37 def gcp_low(V,E,K):
38  """gcp_low -- model for minimizing the number of colors in a graph
39  (use colors with low indices)
40  Parameters:
41  - V: set/list of nodes in the graph
42  - E: set/list of edges in the graph
43  - K: upper bound to the number of colors
44  Returns a model, ready to be solved.
45  """
46  model = Model("gcp - low colors")
47  x,y = {},{}
48  for k in range(K):
49  y[k] = model.addVar(vtype="B", name="y(%s)"%k)
50  for i in V:
51  x[i,k] = model.addVar(vtype="B", name="x(%s,%s)"%(i,k))
52 
53 
54  for i in V:
55  model.addCons(quicksum(x[i,k] for k in range(K)) == 1, "AssignColor(%s)" % i)
56 
57  for (i,j) in E:
58  for k in range(K):
59  model.addCons(x[i,k] + x[j,k] <= y[k], "NotSameColor(%s,%s,%s)"%(i,j,k))
60 
61  for k in range(K-1):
62  model.addCons(y[k] >= y[k+1], "LowColor(%s)"%k)
63 
64  model.setObjective(quicksum(y[k] for k in range(K)), "minimize")
65 
66  model.data = x
67  return model
68 
69 
70 def gcp_sos(V,E,K):
71  """gcp_sos -- model for minimizing the number of colors in a graph
72  (use sos type 1 constraints)
73  Parameters:
74  - V: set/list of nodes in the graph
75  - E: set/list of edges in the graph
76  - K: upper bound to the number of colors
77  Returns a model, ready to be solved.
78  """
79  model = Model("gcp - sos constraints")
80 
81  x,y = {},{}
82  for k in range(K):
83  y[k] = model.addVar(vtype="B", name="y(%s)"%k)
84  for i in V:
85  x[i,k] = model.addVar(vtype="B", name="x(%s,%s)"%(i,k))
86 
87  for i in V:
88  model.addCons(quicksum(x[i,k] for k in range(K)) == 1, "AssignColor(%s)" % i)
89  model.addConsSOS1([x[i,k] for k in range(K)])
90 
91  for (i,j) in E:
92  for k in range(K):
93  model.addCons(x[i,k] + x[j,k] <= y[k], "NotSameColor(%s,%s,%s)"%(i,j,k))
94 
95  for k in range(K-1):
96  model.addCons(y[k] >= y[k+1], "LowColor(%s)"%k)
97 
98  model.setObjective(quicksum(y[k] for k in range(K)), "minimize")
99 
100  model.data = x
101  return model
102 
103 
104 import random
105 def make_data(n,prob):
106  """make_data: prepare data for a random graph
107  Parameters:
108  - n: number of vertices
109  - prob: probability of existence of an edge, for each pair of vertices
110  Returns a tuple with a list of vertices and a list edges.
111  """
112  V = range(1,n+1)
113  E = [(i,j) for i in V for j in V if i < j and random.random() < prob]
114  return V,E
115 
116 
117 if __name__ == "__main__":
118  random.seed(1)
119  V,E = make_data(20,.5)
120  K = 10 # upper bound to the number of colors
121  print("n,K=",len(V),K)
122 
123  model = gcp_low(V,E,K)
124  model.optimize()
125  print("Optimal value:", model.getObjVal())
126  x = model.data
127 
128  color = {}
129  for i in V:
130  for k in range(K):
131  if model.getVal(x[i,k]) > 0.5:
132  color[i] = k
133  print("colors:",color)
134 
135  import time,sys
136  models = [gcp,gcp_low,gcp_sos]
137  cpu = {}
138  N = 25 # number of observations
139  print("#size\t%s\t%s\t%s" % tuple(m.__name__ for m in models))
140  for size in range(250):
141  print(size,"\t",)
142  K = size
143  for prob in [0.1]:
144  for m in models:
145  name = m.__name__
146  if not (name,size-1,prob) in cpu or cpu[name,size-1,prob] < 100: #cpu.has_key((name,size-1,prob))
147  cpu[name,size,prob] = 0.
148  for t in range(N):
149  tinit = time.clock()
150  random.seed(t)
151  V,E = make_data(size,prob)
152  model = m(V,E,K)
153  model.hideOutput() # silent mode
154  model.optimize()
155  assert model.getObjVal() >= 0 and model.getObjVal() <= K
156  tend = time.clock()
157  cpu[name,size,prob] += tend - tinit
158  cpu[name,size,prob] /= N
159  else:
160  cpu[name,size,prob] = "-"
161  print(cpu[name,size,prob],"\t",)
162  print()
163  sys.stdout.flush()
pyscipopt.expr.quicksum
def quicksum(termlist)
Definition: expr.pxi:357
gcp.gcp_low
def gcp_low(V, E, K)
Definition: gcp.py:37
gcp.make_data
def make_data(n, prob)
Definition: gcp.py:105
kmedian.m
int m
Definition: kmedian.py:72
gcp.gcp_sos
def gcp_sos(V, E, K)
Definition: gcp.py:70
gcp.gcp
def gcp(V, E, K)
Definition: gcp.py:9