【问题标题】:How to implement slicing in docplex?如何在 docplex 中实现切片?
【发布时间】:2019-08-31 00:06:40
【问题描述】:

我正在将一些代码从 OPL 传输到 docplex,但我遇到了切片语法问题。我正在尝试创建一组约束,其中包含与另一个决策变量连接的所有值的总和。

我已经尝试过add_constraintsadd_constraint(在 for 循环中),但我遇到了无效的语法错误。我在 Google OR 中使用了这种格式,所以我希望它可以工作。

这是我的 OPL 代码:

forall(<var1,var3> in Index2)
        sum(<var1,var2,var3> in Index1) 
            dev_var[var1,var2,var3] == cec_var2[<var1,var3>];

我在 docplex 中尝试了以下内容:

for row2 in df1.itertuples():
    solver.add_constraint(solver.sum(dec_var[row.var1,row.var2,row.var3] 
       for row in df2.itertuples()) == dec_var2[row2.var1,row2.var3] 
           if row2.var1 = row.var1 and row2.var3 = row.var3)

我希望为每个 var1,var3 组合创建一个约束,其中包括在另一个索引/数据框中找到的 var1,var2,var3 的所有相关索引。如果包含“if”语句,我会收到“无效语法”错误,但如果没有它,我会得到包含另一个索引的完整笛卡尔连接的约束,而没有任何过滤。

【问题讨论】:

    标签: docplex


    【解决方案1】:

    在您的if 语句中,您是否尝试过使用==(等式运算符)而不是=(赋值运算符)?我不确定 python/pandas 是否喜欢条件表达式中的赋值。

    【讨论】:

    • 你说得对,我需要使用正确的 double == 才能使语法正常工作。它现在工作为:solver.add_constraints(solver.sum(dec_var[row.var1,row.var2,row.var3] for row in index.itertuples() if row.var1 == row2.var1 and row.var3 = = row2.var3) ==dec_var2[row2.var1,row2.var3] for row2 in index2.itertuples())
    • 但是它比我自己创建 forall 索引慢大约 8 倍,即对于 index.itertuples() 中的 row2: index2 = index.loc[(index['var1'] ==row2. var1) & (index['var3'] == row2.var3)] solver.add_constraint(solver.sum(dec_var[row.var1,row,var2,row,var3] for index2.itertuples()) == dec_var2[row2.var1,row2.var3])
    【解决方案2】:
    for var1 in index2:
        for var3 in index2:
            model.add_constraint(model.sum(model.sum(model.sum(dev_var[a,b,c] for a in index1) for b in index1) for c in index1) == cec_var2[var1,var3])
    

    有问题,希望对你有一点帮助

    【讨论】:

    • 这种方法行不通,因为我正在对索引进行切片,而不是对所有 a、b 和 c 进行完整的笛卡尔连接。
    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2013-04-12
    • 2020-03-22
    • 2015-02-12
    相关资源
    最近更新 更多