GAMS: Почему значение параметра pp(ss,ii) получается равным нулю?

Я написал следующий код в GAMS, и он может быть не самым лучшим в мире, но я не понимаю, почему он продолжает возвращать значение параметра pp(ss,ii) как все нули, когда это должна быть матрица ровно по 2 штуки в каждом ряду.

Не могли бы вы мне помочь?

set

ii set of bays /1*10/
ss set of solutions /1*45/

Parameters

H Number of bays /10/
C Number of cranes /2/
r Safety Margin /1/
p(ii)
pp(ss,ii)
;

p(ii) = 0;

Scalar i; i=1;
Scalar j; j=i;
Scalar k; k=C;
Scalar qq;
Scalar q;
Scalar kk;
Scalar m;
Scalar n;
Scalar stop /0/;
Scalar stop1 /0/;
Scalar stop2 /0/;
Scalar F /1/;
Scalar k1 /0/;
Scalar k2 /0/;

while ((i <= H-(C-1)*r-1*(C-1)),

                 while((j<=H and stop=0),

                         if (sum(ii, p(ii)) = C,
                              stop = 1;
                            );
                   loop(ii$(ord(ii)=j),
                       p(ii) = 1;
                       );
                       j = j+r+1;
                   );
        if (sum(ii, p(ii)) = C,
         loop((ss,ii)$(ord(ss)=F),
              pp(ss,ii) = p(ii);
             );
           );

        F = F+1;
        qq=0;
        for (q = 1 to H-(C-1)*r-1*(C-1)-1,
             loop (ii$((ord(ii) = q) and (stop1 = 0)),
                    if ((p(ii) = 1) ,
                        qq=1;
                        stop1 = 1;
                       );
                   );
            );

*        if (qq=0,
*                if (p(ii)$(ord(ii)= H-(C-1)*r-1*(C-1))=1 and p(ii)$(ord(ii)=H) = 1,
*                     abort "finished";
*                   );
*
*            );

        k1 = 0;
        k2 = 0;
        if(qq=0,
                loop(ii$(ord(ii)= H-(C-1)*r-1*(C-1)),
                     if (p(ii) = 1,
                         k1 = 1;
                         );
                     );
                loop(ii$(ord(ii)=H),
                     if (p(ii) = 1,
                         k2 = 1;
                         );
                     );
                 abort$(k1 + k2 = 2) "Finished";

           );


        if (j-r-1 = H,
          loop(ii$(ord(ii)=H-(C-k)*r-(C-k)) ,
            if(k = C,
               k = k-1;
            elseif (p(ii)= 1),
                    k = k-1;


               );
              );
             if(k=1,
              loop(ii,
                p(ii)=0;
                   );
                i = i+1;
                j = i;
                k = C;
                else
                     loop(ii$(ord(ii)=H),
                         p(ii) = 0;
                         );
                         m=1;
                         n=0;
                         while((n<k),


                          loop(ii$(ord(ii)=m),
                                if(p(ii) = 1,
                                   n = n+1;
                                   );
                                 m = m+1;
                              );
                             );
                         loop(ii$(ord(ii) = m-1),
                              p(ii) = 0;
                              );
                         loop(ii$(ord(ii) = m),
                              p(ii) = 1;
                             );
                         j = m+r+1;
               );


            else
               loop(ii$(ord(ii) = j-r-1),
                 p(ii)=0;
                   );
               loop(ii$(ord(ii) = j-r),
                 p(ii)= 1;
                   );
                 j=j+1;
            );



        );

Display pp;

person Nabil Kenan    schedule 28.11.2015    source источник


Ответы (1)


О том, как искать ошибки в довольно сложном коде:

  1. сначала посмотрите, где вы присваиваете значения своей переменной. Вы установили pp = p; один раз.

  2. посмотрите вверх, если p прав. Дисплей говорит, что p тоже равен нулю.

  3. во время процесса предварительного решения вы можете добавить дополнительные операторы «отображения» в середине вашего кода, чтобы получить значения в этих точках.

  4. Это дает вам намек на то, что в p есть некоторые значения, но когда вы помещаете оператор display после if (sum(ii, p(ii)) = C,, вы не получите никаких вызовов display -> sum(p) ‹> C ?

  5. Присмотритесь к букве p перед if, и вы увидите, что внутри есть три значения, которых больше, чем два.

  6. На последнем шаге просто увидеть ошибку в вашем коде. Это ваша позиция по stop = 1; критериям. Его помещают в начало цикла while. Цикл продолжится в текущей итерации и создаст третье значение.

Решение: измените критерии на if (sum(ii, p(ii)) = C-1, или поместите критерии в конец цикла while.

person Paul G.    schedule 09.12.2015