我想将此汇总实现为目标和约束(1-6)有人可以帮助我如何实现它们吗?
OBJ: 最小值 ∑(i=1..N)∑(j=1..N) Cij * ∑(k=1..K)Xijk
约束: ∑(k=1..K) Yik=1(对于 N 中的所有 i)
我想将此汇总实现为目标和约束(1-6)有人可以帮助我如何实现它们吗?
OBJ: 最小值 ∑(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]),
然后,您可以在循环中设置约束:
约束: ∑(k=1..K) Yik=1(对于 N 中的所有 i)
( for(I,1,N), param(Y) do
sum(Y[I,*]) $= 1
),
请注意,这里的符号是这个数组维度大小的sum(Y[I,*])
简写。sum([Y[I,1],Y[I,2],...,Y[I,K]])
K
为了您的目标,由于嵌套总和,仍然需要一个辅助循环/列表:
OBJ: 最小值 ∑(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),
...
然后,您必须将此目标表达式传递给求解器——细节取决于您使用的求解器(例如 eplex、ic)。