如何在ECLIPSE CLP或Prolog中实现此MP问题?

时间:2019-04-20 22:43:59

标签: prolog eclipse-clp

我想将此总结作为目标和约束来实现(1-6) 谁能帮我实现这些方法?

OBJ:Min ∑(i = 1..N)∑(j = 1..N)Cij * ∑(k = 1..K)Xijk

约束:               ∑(k = 1..K)Yik = 1(对于N中的所有i)

1 个答案:

答案 0 :(得分:1)

以下答案特定于ECLiPSe(它使用循环,数组和数组切片符号,这不是标准Prolog的一部分)。

我假设给出了NK(大概是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: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),
...

然后,您必须将此目标表达式传递给求解器-具体信息取决于您使用的求解器(例如eplex,ic)。