Как я могу написать цикл, подобный этому уравнению, в GAMS?

Я обычно пишу некоторые коды в GAMS, которые включают цикл, исключающий некоторые индексы, как я могу написать цикл, например, с исключением?

u("p1","j1")*o1("p1","j2") - sum(t,v("p1","j1",t)*I1("p1","j2",t))=l=0;  
u("p1","j1")*o1("p1","j3") - sum(t,v("p1","j1",t)*I1("p1","j3",t))=l=0;

в этих уравнениях u, o вместе, а также v, I1 вместе имеют разные индексы j; как можно написать этот цикл?


person iman    schedule 14.12.2016    source источник
comment
Мне неясно, что вы хотите перебрать и какие должны быть исключения. Не могли бы вы написать пример того, что вы хотите, используя псевдокод?   -  person Martin Bonde    schedule 14.12.2016
comment
Уважаемый Мартин, примите следующие уравнения: u (p1, j1) * o1 (p1, j2) -sum (t, v (p1, j1, t) * I1 (p1, j2, t)) = l = 0; Я хочу повторить это уравнение для всех p, j в U, O1 таким образом, чтобы u (p, j)! = O1 (p, j), например, этот цикл не учитывает u (p1, j1) * o1 ( p1, j1), но учтем u (p, j) * o1 (o, j), кроме u (p, j) = o1 (p, j).   -  person iman    schedule 14.12.2016


Ответы (1)


Вы можете использовать цикл, но, вероятно, лучшим решением будет ограничить уравнения правильной комбинацией наборов. В любом случае это можно сделать с помощью псевдонима наборов и оператора SameAs.

Alias(p,pp);
Alias(j,jj);

E_myEquation(p,j,pp,jj)  $(not (SameAs(p,pp) and SameAs(j,jj)))..
    u(p,j)*o1(pp,jj) - sum(t, v(p,j,t)*I1(pp,jj,t)) =l= 0;

Это определяет уравнение для всех комбинаций (p, j) с самим собой, за исключением (p, j) == (p, j).

Надеюсь, я правильно понял запрос, но в противном случае вы, вероятно, сможете определить точную реализацию, которую хотите, используя функции Alias ​​и SameAs.

person Martin Bonde    schedule 14.12.2016