Gurobi tupledict.prod медленно - PullRequest
       47

Gurobi tupledict.prod медленно

0 голосов
/ 31 декабря 2018

В экспериментах на моей локальной машине я обнаружил, что tupledict.prod API Python gurobi не обеспечивает преимущества в эффективности по сравнению с циклами Python, что меня удивляет.Я сравниваю следующие два фрагмента кода и ожидаю, что фрагмент кода 1 будет намного быстрее, чем 2. Однако опытным путем я обнаружил, что они, по сути, имеют одинаковую скорость.Большую часть времени для обоих фрагментов составляет добавление переменных к цели (оба занимают ~ 100 с).Стоит ли ожидать, что фрагмент 1 будет более эффективным, чем фрагмент 2?Есть ли что-то, что я мог бы сделать более эффективно в любом фрагменте?

настройка:

self.n_rev = 1373
self.n_pap = 2623
self.weights = weights                 # numpy 2d array
self.loads = loads                        # numpy 1d array
self.coverages = coverages        # numpy 1d array

фрагмент 1:

# Primal vars.
start = time.time()
self.lp_vars = self.m.addVars(self.n_rev, self.n_pap, vtype=GRB.BINARY, name='x')
self.m.update()
print('Time to add vars %s' % (time.time() - start))

# Objective.
start = time.time()
coeff = list(self.weights.flatten())
print('flatten %s' % (time.time() - start))

start = time.time()
coeff = dict(zip(self.lp_vars.keys(), coeff))
print('zip %s' % (time.time() - start))

start = time.time()
obj = self.lp_vars.prod(coeff)
print('prod %s' % (time.time() - start))

start = time.time()
self.m.setObjective(obj, GRB.MAXIMIZE)
print('Time to set objective %s' % (time.time() - start))

# Constraints.
start = time.time()
self.m.addConstrs((self.lp_vars.sum(r, '*') <= l
                   for r, l in enumerate(self.loads)))
self.m.addConstrs((self.lp_vars.sum('*', p) == c
                   for p, c in enumerate(self.coverages)))
self.m.update()
print('Time to add constraints %s' % (time.time() - start))

фрагмент 2:

# primal variables
start = time.time()
self.lp_vars = []
for i in range(self.n_rev):
    self.lp_vars.append([])
    for j in range(self.n_pap):
        self.lp_vars[i].append(self.m.addVar(vtype=GRB.BINARY,
                                             name=self.var_name(i, j)))
self.m.update()


# Set the objective.
start = time.time()
obj = LinExpr()
for i in range(self.n_rev):
    for j in range(self.n_pap):
        obj += self.weights[i][j] * self.lp_vars[i][j]
self.m.setObjective(obj, GRB.MAXIMIZE)
print('Objective %s' % (time.time() - start))


start = time.time()
# constraints.
for r, l in enumerate(self.loads):
    self.m.addConstr(sum(self.lp_vars[r]) <= l, "r" + str(r))
for p, cov in enumerate(self.coverages):

    self.m.addConstr(sum([self.lp_vars[i][p]
                          for i in range(self.n_rev)]) == cov,
                     "p" + str(p))
self.m.update()
print('Constraints %s' % (time.time() - start))
...