Эффективный способ добавления переменных и ограничений через Gurobi Python без перечисления всех элементов

Я учусь строить модели оптимизации с помощью Python Gurobi, и у меня возникают некоторые проблемы с поиском питонического способа определения переменных решения и ограничений:

Если у меня есть эти наборы:

time={morning, afternoon, evening};
interval={early,late};
food={burger, banana, apple, orange};

и моя переменная решения - бинарное питание [время, интервал, еда]. Однако у меня есть только определенный набор возможных опций, как показано ниже, и я не могу перечислить все элементы моих наборов:

time      interval  food  number  value
morning   early   banana   2      500
morning   early   apple    3      600
afternoon early   burger   1      800
evening    late   orane    2      400

поэтому мои переменные могут быть следующими:

eat[morning,early,banana]
eat[morning,early,apple]
eat[afternoon,early,burger]
eat[evening,late,orange]

и я не могу сделать:

eat = m.addVars(time, interval, food, name = "Eat", vtype=GRB.BINARY)

Я могу сделать что-то вроде:

eat = {}
for row in input.to_dict('records'):
         key = (row['time'], row['interval'],row['food'])
         eat[key] =  m.addVar(name = "Eat", vtype=GRB.BINARY)

Но у меня все еще есть проблема с определением моей цели, которая заключается в умножении числа, стоимости и еды, и я ищу более последовательный и элегантный способ:

obj = quicksum(number[i,j,k]*value[i, j, k] * eat[i, j, k] for i in time 
for j in interval for k in food)

Выше перечислено все, что не так, и я попробовал что-то вроде этого:

obj = quicksum(number[key]*value[key] * eat[key] \
                 for key in eat)

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

m.addConstrs(quicksum(eat[i,j,k] for k in food)==1 for i in time for j in interval)

или что-то вроде

m.addConstrs(quicksum(eat[morning,j,banana] ==1) for j in interval)

Извините за длинные вопросы. Любая помощь от экспертов по оптимизации /питону была бы отличной.

4 голоса | спросил Nazanin Zinouri 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 22 Sep 2018 01:55:14 +0300 2018, 01:55:14

1 ответ


0
Это может помочь вам сделать использование tupledict структуры API Gurobi Python должен хранить переменные.У него есть несколько удобных методов, которые позволяют легко суммировать, умножать или нарезать переменные.Я приведу полный пример ниже.Надеюсь, это поможет!
ответил Ioannis 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 22 Sep 2018 14:20:24 +0300 2018, 14:20:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132