Я пытаюсь объявить ограничение в Pyomo, где один параметр будет списком вместо скаляра, а затем построить ограничение, предоставив набор правильного измерения, но кажется, что Pyomo выполняет декартово произведение каждого набора и выводит количество входов (которые затем рассматриваются как скаляры).
Ниже приведен пример того, чего я хочу достичь:
model.inputs = RangeSet(0,1)
model.x = model.inputs*model.inputs
model.p = Var()
def constraint_rule(model,x,i):
return x[i] > model.p
model.constraint = Constraint(model.x,model.inputs,rule=constraint_rule)
Чтобы быть более точным в отношении того, чего я хочу достичь. Мое ограничение имеет вид:
f(x_0,x_1,i) > p
И я хотел бы ввести x как вектор вместо того, чтобы вводить отдельно x_0 и x_1 (или больше, если у меня больше x_i). Поэтому я хочу ввести список списков для первого параметра и итератор в качестве второго параметра, который может указать, какой элемент списка я хочу.
Конечно, я могу разложить список x длины n с n скалярами x [i] , но, поскольку я хочу постоянно изменять размер входов, я хотел изменить только model.x и надеюсь, что он будет автоматически масштабироваться .
Ниже приведена полная математическая задача (у меня недостаточно репутации, чтобы поставить изображение, извините за это):
<code>
Tr(M<sup>i</sup><sub>x<sub>i</sub></sub>N<sub>x</sub>) > p</p>
<p>Tr(N<sub>x</sub>) = 1</p>
<p>M<sup>i</sup><sub>0</sub> + M<sup>i</sup><sub>1</sub> = Id</p>
<p>M<sup>i</sup><sub>0</sub>, M<sup>i</sup><sub>1</sub> and N<sub>x</sub> SDP
Здесь M
s и N
s - матрицы 2x2. У нас есть 4 N
для цепочек битов длиной 2 и 2 матрицы M
на значение i
(тогда x i равно 0 или 1).
Также x
указывает битовую строку (здесь у нас есть только x_0 и x_1), а i
указывает, какой бит (например, для i = 0, мы хотим, чтобы значение x_0 ie было первым битом x). Но i
может быть больше, чем число битов в x (например, мы можем установить это для i = 2, мы хотим, чтобы значение x_0 xor x_1 ie четность битов). Поэтому я хотел закодировать ограничение 1sr таким образом, чтобы оно получало строку битов x
и значение i
, которое могло бы указать, какую информацию я хочу получить об этой цепочке битов.
Надеюсь, это понятнее.