1

所以我试图在 GAMS 中实现一个算法,方法是在每次迭代后用削减来增加一个主问题。主要问题是,

minimize w =-x - 10z
s.t. 
   -25x + 20z ≤ 30
   x + 2z ≤ 10
   2x - z ≤ 15
   -2x - 10z ≤ -15
   w >= -26
   w <= -22
where x and z are nonnegative integer variables. 

在第一次迭代之后,我想添加约束,

1 ≤ x ≤ 6 IFF z ≤ 2 

在第二次迭代之后,我想添加约束,

2.5 ≤ x ≤ 8 IFF z ≤ 1

这两个增加问题的约束限制了解空间产生(w=-22,x=2,z=2)作为最优解。

我尝试通过使用带有以下脚本的动态集在 GAMS 中实现它(在 GAMSworld 的帮助下)。然而,GAMS 给出的最终解决方案是 (x=6, z=2)。最佳答案应该是 (x=2, z=2),因为由于第二次迭代后的约束,除非 z <= 1,否则 x 不能大于 2.5。

Integer Variable
x, z;

Free Variable w;

Set      k       /1*5/;

Set cut1set(k);
cut1set(k) = no;

Set cut2set(k);
cut2set(k) = no;

Equations
     obj, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11;

obj..    w =e= - x - 10 *z;
c1..     -25 * x + 20 * z =l= 30;
c2..     x + 2 * z =l= 10;
c3..     2 * x - z =l= 15;
c4..     - 2 * x - 10 * z =l= - 15;
c5..     w =g= -26;
c6..     w =l= -22;
* z is nonnegative integer
* z is nonnegative integer
c7..     z =g= 0;
c8(cut1set)..    x =l= 6;
c9(cut1set)..    x =g= 1;
c10(cut2set)..   x =l= 8;
c11(cut2set)..   x =g= 2.5;

Model mymodel /all/;

loop(k,
         solve mymodel use mip min w;

         if(ord(k) = 1 and z.l <= 2,
                 cut1set(k) = yes;
         );
         if(ord(k) = 2 and z.l <= 1,
                 cut2set(k) = yes;
         );
);

谁能告诉我如何在迭代后使用带有 IFF 条件的增强约束的削减?我现在拥有它的方式是没有正确限制解决方案空间。我将非常感谢一些帮助。谢谢你!

4

2 回答 2

1

可能这更容易:

solve mymodel using mip minimizing w;
if (z.l <= 2,
    x.lo = 1;
    x.up = 6;
    solve mymodel using mip minimizing w;
    if (z.l <= 1,
       x.lo = 2.5;
       x.up = 8;
       solve mymodel using mip minimizing w;
    );
);
于 2018-08-22T22:19:00.960 回答
0

尝试这个

你只想要两个切割,一个只在第一次迭代中,一个在第二次迭代中。所以切割应该完全在相同的两个步骤中添加,一个条件语句,如 cut1set(k)$(k.val=1) = yes ; 做这个。

 Integer Variable x, z;

 Free Variable w;
 Set      k       /1*5/;
 Set cut1set(k);
 cut1set(k) = no;
Set cut2set(k);
 Cut2set(k) = no;

 Equations
 obj, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11;
 Obj..    w =e= - x - 10 *z;
  C1..     -25 * x + 20 * z =l= 30;
 c2..     x + 2 * z =l= 10;
 c3..     2 * x - z =l= 15;
 c4..     - 2 * x - 10 * z =l= - 15;
 c5..     w =g= -26;
c6..     w =l= -22;
 c7..     z =g= 0;
 c8(cut1set)..    x =l= 6;
 c9(cut1set)..    x =g= 1;
 c10(cut2set)..   x =l= 8;
 c11(cut2set)..   x =g= 2.5;

  Model mymodel /all/   ;

 loop(k,
     solve mymodel use mip min w;

     if(k.val = 1 and z.l <= 2,
             cut1set(k)$(k.val=1) = yes;
         );
     if(k.val= 2 and z.l <= 1,
             cut2set(k) $(k.val=2)= yes;
         );
 );
于 2018-08-18T08:11:09.263 回答