2017-04-12 54 views
1

我有以下型號:Gurobi:我如何求和一個變量的一部分?

from gurobipy import * 

n_units = 1 
n_periods = 3 
n_ageclasses = 4 

units = range(1,n_units+1) 
periods = range(1,n_periods+1) 
periods_plus1 = periods[:] 
periods_plus1.append(max(periods_plus1)+1) 
ageclasses = range(1,n_ageclasses+1) 
nothickets = ageclasses[1:] 


model = Model('MPPM') 

HARVEST = model.addVars(units, periods, nothickets, vtype=GRB.INTEGER, name="HARVEST") 
FOREST = model.addVars(units, periods_plus1, ageclasses, vtype=GRB.INTEGER, name="FOREST") 


model.addConstrs((quicksum(HARVEST[(k+1), (t+1), nothicket] for k in range(n_units) for t in range(n_periods) for nothicket in nothickets) == FOREST[unit, period+1, 1] for unit in units for period in periods if period < max(periods_plus1)), name="A_Thicket") 

我有制定約束問題。我希望每個單位和每個時期總結變量HARVEST的nothickets部分。具體而言,我需要x k = 1,t = 1,2 + x k = 1,t = 1,3 + x k = 1,t = 1,4 等等。這應該導致約束矩陣的每行只有三個。但通過上面的表述,我得到了9個。 我試圖用的款項外循環,但這會導致另一個問題:

for k in range(n_units): 
    for t in range(n_periods): 
     model.addConstrs((quicksum(HARVEST[(k+1), (t+1), nothicket] for nothicket in nothickets) == FOREST[unit,period+1, 1] for unit in units for period in periods if period < max(periods_plus1)), name="A_Thicket") 

有了這個配方我得到這個矩陣: constraint matrix

但我想要的是:

row_idx | col_idx | coeff 
0 | 0 | 1 
0 | 1 | 1 
0 | 2 | 1 
0 | 13 | -1 
1 | 3 | 1 
1 | 4 | 1 
1 | 5 | 1 
1 | 17 | -1 
2 | 6 | 1 
2 | 7 | 1 
2 | 8 | 1 
2 | 21 | -1 

任何人都可以幫我重新制定這個約束嗎?

回答

0

這爲我工作:

model.addConstrs((HARVEST.sum(unit, period, '*') == ... 
相關問題