GAMS:为什么参数pp(ss,ii)的值为零?

时间:2015-11-28 14:35:30

标签: gams-math

我在GAMS中编写了以下代码,它可能不是世界上最好的代码,但我不明白为什么它会将参数pp(ss,ii)的值保持为全为0时的值应该是每行中恰好2个1的矩阵。

你能帮我吗?

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;

1 个答案:

答案 0 :(得分:0)

关于如何在相当复杂的代码中捕获错误:

  1. 首先查找您为变量赋值的位置。您一次设置pp = p;

  2. 查看p是否正确。显示表示p也为零。

  3. 在预解决过程中,您可以添加aditional&#34; display&#34;代码中间的语句 - 在这一点上获取值。

  4. 这为您提供了p中有一些值的提示 - 但是当您在if (sum(ii, p(ii)) = C,之后放置显示语句时,您将不会显示任何显示调用 - &gt; sum(p)&lt;&gt; C?

  5. 仔细查看if之前的p,您会发现其中有三个值超过两个。

  6. 在最后一步,您可以轻松查看代码中的错误。它是您stop = 1;条件的位置。它位于while循环的开头。循环仍将在当前迭代中继续并创建第三个值。

  7. 解决方案: 将条件更改为if (sum(ii, p(ii)) = C-1,或将条件放在while循环的末尾。