0

我在 GAMS 中编写了以下代码,它可能不是世界上最好的,但我不明白为什么当它应该是每行正好有 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;
4

1 回答 1

0

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

  1. 首先查找您为变量分配值的位置。你定pp = p;了一次。

  2. 查找 p 是否正确。显示器说 p 也为零。

  3. 在预求解过程中,您可以在代码中间添加额外的“显示”语句 - 以获取此时的值。

  4. 这会提示您 p 中有一些值 - 但是当您在if (sum(ii, p(ii)) = C,不会收到任何显示调用之后放置 display 语句时 -> sum(p) <> C ?

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

  6. 在最后一步很容易看到代码中的错误。这是你stop = 1;标准的立场。它位于 while 循环的开头。循环仍将在当前迭代中继续并创建第三个值。

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

于 2015-12-09T19:52:59.910 回答