Линейное программирование в Линго

Я хочу заниматься линейным программированием на Lingo, у меня есть решение, но я хочу улучшить код.

Вот что я хочу сделать:

SETS:
 SEMANA/ 1..12/: D, X, I, Y, Z, R, n;
ENDSETS

X(1)>=D(1); 

X(2)+I(1)>=D(2);

X(3)+I(2)>=D(3);

X(4)+I(3)>=D(4);

X(5)+I(4)>=D(5);

X(6)+I(5)>=D(6);

X(7)+I(6)>=D(7);

X(8)+I(7)>=D(8);

X(9)+I(8)>=D(9);

X(10)+I(9)>=D(10);

X(11)+I(10)>=D(11);

X(12)+I(11)>=D(12);

Я пробовал эту опцию, но есть ошибка, которая говорит: Нижний индекс вне диапазона для атрибута I.

@FOR (SEMANA(j): 

X(j)+ I(j-1)>= D(j)) ; 

I(j-1) находится вне диапазона, поэтому я не могу решить проблему.

Спасибо

2 ответа

Вам нужен индексный фильтр

@FOR (SEMANA(j) | j#GT#1: 
  X(j)+ I(j-1)>= D(j)) ;

Это было бы эквивалентно I(0)=0, но только неявно. Если у вас I(0)>0, например, у вас положительный начальный запас, то вам нужно будет расширить набор индексов, включив в него "0", и наложить дополнительное ограничение I(0)=INITIAL_VALUE

Следовательно, ваш цикл @for должен быть

@FOR (SEMANA(j) | j#GT#0: 
  X(j)+ I(j-1)>= D(j)) ;

Обратите внимание, что ваш код будет пытаться попасть в I(0), когда j=1. Я (0) не определил, и поэтому проблема вне диапазона.

Другие вопросы по тегам