Python (gurobipy) эквивалент функции GAMS ord (i)

#python #gurobi #gams-math

#python #gurobi #gams-математика

Вопрос:

Я создаю модель планирования работы в Python, используя gurobipy, потому что бесплатная версия GAMS не может справиться с размерами этой конкретной проблемы, но я в ней новичок.

Часть моей целевой функции заключается в следующем:

 (sum((i,ii,c)$(ord(ii)>ord(i)),w(i,ii,c)*u(i,ii))*R)
 

ord() дает индекс элемента в наборе, поэтому суммирование w * u выполняется только для тех ii элементов, индексы которых больше i единиц.

Мне было интересно, есть ли элегантный способ написать этот фрагмент кода на python, до сих пор я видел, что я могу использовать функцию enumerate для зацикливания одномерного параметра и сохранения индекса, например:

 bs = [7, 6, 5, 4, 1]
cs = [2, 8, 3, 9, 0]

for i, b in enumerate(bs):
    for j, c in enumerate(cs):
        if i > j:
            print(b, " * ", c, " = ", b * c)
 

Но я понятия не имею, как это сделать с многомерными параметрами и переменными?

Ответ №1:

Самый элегантный способ сделать это — определить переменные решения w и u над набором кортежей, где эти кортежи включают только допустимые комбинации where ord(i)<ord(ii) . Тогда вам нужно только перебрать индексаторы u или w.

С Gurobi я бы сделал что-то вроде следующего:

 u = m.addVars(((i,ii) for m,i in enumerate(bs)
                      for n,ii in enumerate(cs) if m<n),
              name='u')
 

Комментарии:

1. Спасибо за ваш ответ! Я не знал, что вы можете ставить такие условия при объявлении переменной. Учитывая тот факт, что w это переменная и u таблица параметров, достаточно ли этого, чтобы при умножении учитывались только индексы ii> i как w, так и u, или мне нужно объявить параметр аналогичным образом?

2. Таким образом вы можете объявлять как переменные решения, так и данные; данные должны быть tupledict .