我试图在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,则输入更多)。因此,我想为第一个参数输入一个列表列表,并为第二个参数输入一个迭代器,以指定我想要的列表元素。
我当然可以分解n个标量为 x [i] 的长度为n的列表 x ,但是因为我想不断更改输入的大小,所以我想只更改 model.x 并希望它会自动缩放。
下面是完整的数学问题(我没有足够的声誉来放置图片,对此感到抱歉):
Tr(MixiNx) > p
Tr(Nx) = 1
Mi0 + Mi1 = Id
Mi0, Mi1 and Nx SDP
这里M
和N
是2x2矩阵。
对于每个N
的值,我们有4个M
用于长度为2的位串和2个矩阵i
(然后x i 为0或1)。
也x
指定位串(这里只有x_0和x_1),i
指定哪一位(例如,对于i = 0,我们想要值x_0,即x的第一位) 。但是i
可能大于x中的位数(例如,我们可以将其设置为i = 2,我们希望值x_0 xor x_1即位的奇偶性)。因此,我想对1sr约束进行编码,以便它接收一个位串x
和一个值i
,该值可以指定我想要有关该位串的哪些信息。
我希望情况会更清楚