#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 .