Я новичок в программировании в ограничениях и инструментах ИЛИ. Коротко о проблеме. Есть 8 позиций, для каждой позиции мне нужно решить, какой ход типа A (move_A) и какой ход типа B (move_B) следует выбрать так, чтобы значение, полученное в результате комбинации двух ходов (в каждой позиции), было максимизирован. (Хотя это только часть большой проблемы). И я хочу использовать подход AddElement
для выполнения дополнительной настройки.
Пожалуйста, посмотрите на попытку ниже
from ortools.sat.python import cp_model
model = cp_model.CpModel()
# value achieved from combination of different moves of type A
# (moves_A (rows)) and different moves of type B (moves_B (columns))
# for e.g. 2nd move of type A and 3rd move of type B will give value = 2
value = [
[ -1, 5, 3, 2, 2],
[ 2, 4, 2, -1, 1],
[ 4, 4, 0, -1, 2],
[ 5, 1, -1, 2, 2],
[ 0, 0, 0, 0, 0],
[ 2, 1, 1, 2, 0]
]
# 6 moves of type A
num_moves_A = len(value)
# 5 moves of type B
num_moves_B = len(value[0])
num_positions = 8
type_move_A_position = [model.NewIntVar(0, num_moves_A - 1, f"move_A[{i}]") for i in range(num_positions)]
type_move_B_position = [model.NewIntVar(0, num_moves_B - 1, f"move_B[{i}]") for i in range(num_positions)]
value_position = [model.NewIntVar(0, 10, f"value_position[{i}]") for i in range(num_positions)]
# I am getting an error when I run the below
objective_terms = []
for i in range(num_positions):
model.AddElement(type_move_B_position[i], value[type_move_A_position[i]], value_position[i])
objective_terms.append(value_position[i])
Ошибка выглядит следующим образом:
Traceback (most recent call last):
File "<ipython-input-65-3696379ce410>", line 3, in <module>
model.AddElement(type_move_B_position[i], value[type_move_A_position[i]], value_position[i])
TypeError: list indices must be integers or slices, not IntVar
В MiniZinc следующий код работал бы
var int: obj = sum(i in 1..num_positions ) (value [type_move_A_position[i], type_move_B_position[i]])
Я знаю, что в OR-Tools нам придется сначала создать некоторые промежуточные переменные для сохранения результатов, поэтому описанный выше подход minizinc не будет работать. Но я изо всех сил пытаюсь это сделать.
Я всегда могу создать 2 матрицы двоичных двоичных переменных, одну для num_moves_A * num_positions, а другую для num_moves_B * num_positions, добавить соответствующие ограничения и достичь цели
Но я хочу научиться делать то же самое с помощью AddElement
ограничения
Любая помощь в том, как переписать фрагмент AddElement
, приветствуется. Спасибо.
Большое спасибо Лоран за быстрый ответ. Я смог последовать вашему совету, и это решило мою проблему. Я опубликую решение ниже, если оно может помочь кому-то с аналогичным вопросом в будущем. С уважением.