Как объявить динамические переменные внутри цикла FOR в OR-TOOLS - PullRequest
0 голосов
/ 21 июня 2019

Я начинаю работу с OR-TOOLS от Google и не могу понять, как динамически объявлять переменные.

Очень простой пример на веб-сайтах OR-TOOLS, приведенный ниже

x = solver.NumVar(0, 10, 'x')
y = solver.NumVar(0, 10, 'y')
solver.Add(x + 7 * y <= 17.5)
solver.Maximize(x + 10 * y)`

Поскольку я моделирую декомпозицию Бендерса, я пытаюсь объявить некоторые переменные внутри цикла.Таким образом, я мог бы динамически создавать его переменные.

Я пробовал что-то вроде:

for i in range(3):
    x[i] = solver.NumVar(0, 10, 'x[i]')
    y[i] = solver.IntVar(0, 10, 'y[i]')
    solver.Add(x[i] + 7 * y[i] <= 17.5)

Однако это явно не работает.

Может кто-нибудь помочь мне, пожалуйста?Спасибо!

1 Ответ

1 голос
/ 21 июня 2019

Этот подход, безусловно, работает и, вероятно, показан во многих примерах .

Без тестирования ваша идея может выглядеть следующим образом:

# prepare some data-structure to hold variables returned
x = [None] * 3
y = [None] * 3

for i in range(3):
    x[i] = solver.NumVar(0, 10, 'x[{}]'.format(i))
    y[i] = solver.IntVar(0, 10, 'y[{}]'.format(i))
    solver.Add(x[i] + 7 * y[i] <= 17.5)  # invariant is important!
                                         # we only access available indices

В этом нет ничего плохогоконцептуально.

Ваши переменные теперь будут готовы для использования / использования при доступе к вашим спискам.

...