Следующий ответ относится только к ECLiPSe (в нем используются циклы, нотации массивов и срезов массивов, которые не являются частью стандартного пролога).
Я предполагаю, что даны N
и K
(и предположительно C
), а ваши матрицы объявлены как
dim(C, [N,N]),
dim(X, [N,N,K]),
dim(Y, [N,K]),
Затем вы можете установить ограничения в цикле:
ограничение: ∑ (k = 1..K) Yik = 1 (для всех i в 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]])
, когда 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).