Pyomo: использование списка для параметризации ограничения - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь объявить ограничение в 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, которое могло бы указать, какую информацию я хочу получить об этой цепочке битов.

Надеюсь, это понятнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...