Как добавить цикл ‘For’ с помощью Gurobi Python API

#python #gurobi

#python #gurobi

Вопрос:

Переменные определяются как список:

     var_week = [1,2,3,4,5]
    var_pool = ['ALBANY','ROCHESTER']
    var_zone = ['NEW YORK','FLORIDA']
    var_cg = ['PREMIUM','CONVERTIBLE','MIDSIZE']
    var_bu = ['AP','OAP']
    var_pi = [0,1,2,3,4,5]
  

Переменная спроса определяется на уровне спроса (w, p, bu, cg, pi), как показано ниже.

     demand = {(1, 'ALBANY', 'OAP', 'PREMIUM',1): -0.0863039944029772,
     (1, 'ALBANY', 'OAP', 'CONVERTIBLE',1): -0.0538715896861709,
     (1, 'ALBANY', 'OAP', 'REGULAR SUV',2): 0.0203727503604571,
     (2, 'ALBANY', 'OAP', 'SMALL SUV',3): 1.66739983969337}
  

#Переменные решения

     dec_move = m.addVars(var_week, var_cg, var_pool, var_bu, var_pool, var_bu, name="Dec_Move")
    dec_upgrade = m.addVars(var_week, var_pool, var_bu, var_cg, var_cg, name="Dec_Upgrade")
    dec_endfleet = m.addVars(var_week, var_pool, var_bu, var_cg, name="Dec_Endfleet")
    dec_accepted_demand = m.addVars(var_week, var_pool, var_bu, var_cg, var_pi, 
    name="Dec_Accepted_Demand")
    dec_delete = m.addVars(var_vin_group, var_week, var_pool, var_bu, var_cg, name="Dec_Delete")
    dec_addition_adds = m.addVars(var_week, var_pool, var_bu, var_cg, name="Dec_Addition_Adds")
  

Предполагается, что ограничение проверяет, является ли pi <> 0 и требует (w, p, bu, cg, pi)> 0, затем создает ограничение:

 for w in var_week:
   for p in var_pool:
       for bu in var_bu:
           for cg in var_cg:
              for pi in var_pi:
                  dec_accepted_demand(w,p,bu,cg,pi) <= demand(w,p,bu,cg,pi)     .
  

Я написал это как:

     m.addConstrs((dec_accepted_demand(w,p,bu,cg,pi) if pi <>0 and demand(w,p,bu,cg,pi)>0) <= 
    demand(w,p,bu,cg,pi) for w in var_week for p in var_pool for bu in var_bu for cg in var_cg for pi in 
    var_pi,"Accepted_demand")
  

Я получаю недопустимую синтаксическую ошибку. Как правильно сформулировать это ограничение?

Ответ №1:

В выражении генератора if-фильтр должен идти в конце. В буквальном смысле ваш код должен быть:

 m.addConstrs(
  ( dec_accepted_demand[w,p,bu,cg,pi] <= demand[w,p,bu,cg,pi]
    for w in var_week
    for p in var_pool
    for bu in var_bu 
    for cg in var_cg
    for pi in var_pi
    if pi != 0 and demand[w,p,bu,cg,pi]>0 ), "Accepted_demand")
  

Однако я предпочитаю выполнять итерацию только по значениям спроса, например:

 m.addConstrs(
  ( dec_accepted_demand[w,p,bu,cg,pi] <= demand[w,p,bu,cg,pi]
    for w,p,bu,cg,pi in demand
    if pi != 0 and demand[w,p,bu,cg,pi]>0 ), "Accepted_demand")
  

Я предполагаю, что ваши данные образца являются неполными; вам нужно будет убедиться, что реальные данные содержат правильные комбинации.