0

以下のコードを 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;
4

1 に答える 1

0

かなり複雑なコードでエラーをハントする方法について:

  1. 最初に、変数に値を割り当てる場所を調べます。一度設定pp = p;します。

  2. p が正しいか調べます。ディスプレイには、pもゼロであると表示されます。

  3. 解決前のプロセス中に、コードの途中に追加の「表示」ステートメントを追加して、この時点で値を取得できます。

  4. これにより、pにいくつかの値があるというヒントが得られますが、if (sum(ii, p(ii)) = C,表示呼び出しを取得しない後に表示ステートメントを配置すると、-> sum(p) <> C ?

  5. の前の pifをよく見ると、内部に 2 つ以上の値が 3 つあることがわかります。

  6. 最後のステップでは、コード内のエラーを簡単に確認できます。それはあなたのstop = 1;基準の位置です。while ループの先頭に配置されます。ループは現在の反復で継続し、3 番目の値を作成します。

解決策: 基準を変更するif (sum(ii, p(ii)) = C-1,か、while ループの最後に基準を配置します。

于 2015-12-09T19:52:59.910 に答える