【问题标题】:Indexing variables in sets in Xpress Mosel在 Xpress Mosel 中的集合中索引变量
【发布时间】:2021-04-19 19:21:49
【问题描述】:

我正在尝试解决我已经使用 Python 库解决的问题的线性松弛问题,以查看它在 Xpress Mosel 中的行为方式是否相同。

我使用的一个索引集不是典型的 c=1..n 而是一组集,这意味着我采用了 1..n 集并创建了所有可能的子集组合(例如例如集合 1..3 创建集合集合{{1},{2},{3},{1,2},{2,3},{1,2,3}})。

在我的一个约束条件下,其中一个索引必须在每个子集中运行。 Python中的相应代码如下(使用Gurobi库):

cluster=[1,2,3,4,5,6]
cluster1=[]
for L in range(1,len(cluster)+1):
    for subset in itertools.combinations(cluster, L):
        clusters1.append(list(subset))
ConstraintA=LinExpr()
ConstraintB=LinExpr()
for i in range(len(nodes)):
    for j in range(len(nodes)):
        if i<j and A[i][j]==1:
            for l in range(len(clusters1)):
                ConstraintA+=z[i,j]
                for h in clusters1[l]:
                    restricao2B+=(x[i][h]-x[j][h])
                model.addConstr(ConstraintA,GRB.GREATER_EQUAL,ConstraintB)
                ConstraintA=LinExpr()
                ConstraintB=LinExpr()

(如果上面的代码令人困惑,我怀疑是这样)我要编写的约束是:

z(i,j)&gt;= sum_{h in C1}(x(i,h)-x(j,h)) forall C1 in C

其中 C1 是每个子集。
有没有办法在摩泽尔做到这一点?

【问题讨论】:

    标签: indexing set integer-programming mosel


    【解决方案1】:

    您可以在这些行中使用一些 Mosel 代码(但是,与您使用的语言无关,请注意,随着原始元素中元素数量的增加,计算出的“所有子集的集合”的大小会迅速增长设置 C,所以这个约束公式不能很好地扩展):

      declarations
        C: set of integer
        CS: set of set of integer
        z,x: array(I:range,J:range) of mpvar
      end-declarations
    
      C:=1..6
      CS:=union(i in C) {{i}}
      forall(j in 1..C.size-1) 
        forall(s in CS | s.size=j, i in C | i > max(k in s) k ) CS+={s+{i}}
    
      forall(s in CS,i in I, j in J) z(i,j) >= sum(h in s) (x(i,h)-x(j,h)) 
    

    考虑到这一点,使用列表代替集合的以下版本更有效(即更快):

    uses "mmsystem"
    declarations
      C: set of integer
      L: list of integer
      CS: list of list of integer
      z,x: array(I:range,J:range) of mpvar
    end-declarations
    
    C:=1..6
    L:=list(C)
    qsort(SYS_UP, L)          !  Making sure L is ordered
    CS:=union(i in L) [[i]]
    forall(j in 1..L.size-1) 
      forall(s in CS | s.size=j, i in L | i > s.last ) CS+=[s+[i]]
    
    forall(s in CS,i in I, j in J) z(i,j) >= sum(h in s) (x(i,h)-x(j,h)) 
    

    【讨论】:

    • 非常感谢您的帮助!它说我没有足够的声誉来对你的答案投票,但如果可以的话,我会的,因为这正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 2023-04-04
    • 2021-10-16
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多