У меня есть эти наборы:

R = [1,2,3,4]
C = [10,11,12,13,14,15,16,17,18,19,20,21]
Cr = {1: C[0:3], 2 : C[3:6],3: C[6:9], 4: C[9:12] }

Я хочу написать код для добавления следующей переменной, показанной на картинке z variable

Мое испытание как следующее

z = m.addVars(R,Cr[r] for r in R,Cr[r] for r in R,vtype=GRB.BINARY)

Когда я попытался напечатать z, я получил эту ошибку: выражение генератора должно быть заключено в скобки

0
Sabreen 21 Июл 2020 в 12:18

2 ответа

Лучший ответ

Первыми аргументами gurobipy.Model.addVars () являются либо несколько итераций (например, R или C), либо выражение генератора; выражение генератора должно быть заключено в скобки. Итак, ваш код должен быть:

z = m.addVars(((i,j) for r in R for i in Cr[r] for j in Cr[r]),
              vtype=GRB.BINARY, name='z')

Кроме того, вы можете использовать пакет Python itertools следующим образом:

import itertools as it
z = m.addVars(it.chain.from_iterable(map(lambda x: it.product(x, repeat=2), Cr.values())),
              vtype=GRB.BINARY, name='z')

Я предпочитаю первый синтаксис, но я подозреваю, что itertools может быть быстрее для больших наборов данных.

2
Greg Glockner 21 Июл 2020 в 15:20

Вы можете использовать update() в кортеже Гуроби, чтобы итеративно добавлять блоки переменных:

z = gp.tupledict()

for r in R:
    z.update(m.addVars(Cr[r], Cr[r], vtype=GRB.BINARY))

Это приведет к этим переменным:

{(10, 10): <gurobi.Var C0>,
 (10, 11): <gurobi.Var C1>,
 (10, 12): <gurobi.Var C2>,
 (11, 10): <gurobi.Var C3>,
 (11, 11): <gurobi.Var C4>,
 (11, 12): <gurobi.Var C5>,
 (12, 10): <gurobi.Var C6>,
 (12, 11): <gurobi.Var C7>,
 (12, 12): <gurobi.Var C8>,
 (13, 13): <gurobi.Var C9>,
 (13, 14): <gurobi.Var C10>,
 (13, 15): <gurobi.Var C11>,
 (14, 13): <gurobi.Var C12>,
 (14, 14): <gurobi.Var C13>,
 (14, 15): <gurobi.Var C14>,
 (15, 13): <gurobi.Var C15>,
 (15, 14): <gurobi.Var C16>,
 (15, 15): <gurobi.Var C17>,
 (16, 16): <gurobi.Var C18>,
 (16, 17): <gurobi.Var C19>,
 (16, 18): <gurobi.Var C20>,
 (17, 16): <gurobi.Var C21>,
 (17, 17): <gurobi.Var C22>,
 (17, 18): <gurobi.Var C23>,
 (18, 16): <gurobi.Var C24>,
 (18, 17): <gurobi.Var C25>,
 (18, 18): <gurobi.Var C26>,
 (19, 19): <gurobi.Var C27>,
 (19, 20): <gurobi.Var C28>,
 (19, 21): <gurobi.Var C29>,
 (20, 19): <gurobi.Var C30>,
 (20, 20): <gurobi.Var C31>,
 (20, 21): <gurobi.Var C32>,
 (21, 19): <gurobi.Var C33>,
 (21, 20): <gurobi.Var C34>,
 (21, 21): <gurobi.Var C35>}
1
mattmilten 21 Июл 2020 в 13:05