微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xpress Mosel 中集合中的索引变量

如何解决Xpress Mosel 中集合中的索引变量

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

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

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

{{1},{2},{3},{1,2},{2,3},2,3}}

(以防上面的代码令人困惑,我怀疑是这样)我试图编写的约束是:

cluster=[1,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() for all C1 in C

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

解决方法

您可以沿着这些路线使用一些 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,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,h)) 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。