如何在 ECLIPSE CLP 或 Prolog 中实现 This MP 问题?
How to implement This MP problem in ECLIPSE CLP or Prolog?
我想将此求和实现为 Objective 和约束 (1-6)
谁能帮助我实现它们?
OBJ: Min ∑(i=1..N)∑(j=1..N) Cij * ∑(k=1..K)Xijk
约束:
∑(k=1..K) Yik=1(对于N中的所有i)
以下答案特定于 ECLiPSe(它使用循环、数组和数组切片表示法,它们不是标准 Prolog 的一部分)。
我假设给出了 N
和 K
(并且大概是 C
),并且您的矩阵被声明为
dim(C, [N,N]),
dim(X, [N,N,K]),
dim(Y, [N,K]),
然后您可以在循环中设置约束:
constraint : ∑(k=1..K) Yik=1 (for all i in N)
( for(I,1,N), param(Y) do
sum(Y[I,*]) $= 1
),
注意这里的符号sum(Y[I,*])
是sum([Y[I,1],Y[I,2],...,Y[I,K]])
的shorthand,而K
是这个数组维度的大小。
对于你的objective,因为嵌套求和,还是需要一个辅助loop/list:
OBJ: Min ∑(i=1..N)∑(j=1..N) Cij * ∑(k=1..K)Xijk
( multifor([I,J],1,N), foreach(Term,Terms), param(C,X) do
Term = (C[I,J] * sum(X[I,J,*]))
),
Objective = sum(Terms),
...
然后您必须将此 objective 表达式传递给求解器——详细信息取决于您使用的求解器(例如 eplex、ic)。
我想将此求和实现为 Objective 和约束 (1-6) 谁能帮助我实现它们?
OBJ: Min ∑(i=1..N)∑(j=1..N) Cij * ∑(k=1..K)Xijk
约束: ∑(k=1..K) Yik=1(对于N中的所有i)
以下答案特定于 ECLiPSe(它使用循环、数组和数组切片表示法,它们不是标准 Prolog 的一部分)。
我假设给出了 N
和 K
(并且大概是 C
),并且您的矩阵被声明为
dim(C, [N,N]),
dim(X, [N,N,K]),
dim(Y, [N,K]),
然后您可以在循环中设置约束:
constraint : ∑(k=1..K) Yik=1 (for all i in N)
( for(I,1,N), param(Y) do
sum(Y[I,*]) $= 1
),
注意这里的符号sum(Y[I,*])
是sum([Y[I,1],Y[I,2],...,Y[I,K]])
的shorthand,而K
是这个数组维度的大小。
对于你的objective,因为嵌套求和,还是需要一个辅助loop/list:
OBJ: Min ∑(i=1..N)∑(j=1..N) Cij * ∑(k=1..K)Xijk
( multifor([I,J],1,N), foreach(Term,Terms), param(C,X) do
Term = (C[I,J] * sum(X[I,J,*]))
),
Objective = sum(Terms),
...
然后您必须将此 objective 表达式传递给求解器——详细信息取决于您使用的求解器(例如 eplex、ic)。