Как реализовать эту проблему MP в ECLIPSE CLP или Prolog? - PullRequest
0 голосов
/ 21 апреля 2019

Я хочу реализовать это суммирование как цель и ограничения (1-6). Может ли кто-нибудь мне помочь, как я могу их реализовать?

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

ограничение: ∑ (k = 1..K) Yik = 1 (для всех i в N)

1 Ответ

1 голос
/ 21 апреля 2019

Следующий ответ относится только к 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).

...