GAMS 中的优化

Optimisation in GAMS

我的 GAMS-code 和 Ruby 中 GAMS-code 的实现有问题。我知道 GAMS 不是最受欢迎的程序,但也许有人可以帮助我。 我有一个模型,我尝试将 children 最佳地分配给幼儿园。这是代码的基本示例:

Sets
          i       Child
          j       Kindergarten
          l       Links
          LI(l,i), LJ(l,j);

Parameters
          a(j)    accessibility
          C(j)    Capacity of Kindergartens
          ch      Capacity for handicapped children
          d(i,j)  distance
          da(i)   distance average
          h(i)    handicapped children
          p(i,j)  preferences
          s(i,j)  siblings;


Binary Variables
          x(i,j)  1 if child i is allocated to kindergarten j;

Free Variables
          ZFW     Zielfunktionswert;

*----- Iclude -----
$include ...



da(i) = sum(j, d(i,j)) / card(j);

*----- Deklaration -----
Equations
         ZF              objective function
         Zuordnung       every child is assigned to one kindergarten
         Kapa            the capacity of the kindergarten must be maintained
         Behin           handicapped children are only assigned to suitable kindergartens;


ZF..               ZFW =E= sum((i,j), x(i,j) * (p(i,j)/s(i,j)) *     (d(i,j)/da(i)));

Zuordnung(i)..     sum(j, x(i,j)) =E= 1;

Kapa(j)..          sum(i, x(i,j) * (1 - h(i))) + sum(i, x(i,j) * h(i) * ch) =L= C(j);

Behin(i,j)..       x(i,j) * h(i) =L= a(j);



Model KiGaOpt /all/;

Solve KiGaOpt using MIP minimizing ZFW;

display x.l;

我还有一个包含文件,我在其中定义了参数。我的问题是,我想在 Ruby 中实现它,并且我想使用链接 (l) instaed of 循环来表示 i 和 j 之间的关系。 我知道,我必须根据 l 替换所有 i 和 j。但每次我尝试这样做时,我都会收到一条错误消息。我已经将它写成这种形式,每次当参数依赖于 i 和 j 时,我都会用 l 替换它。但是其余的我有问题。

Sets
          i       Child
          j       Kindergarten
          l       Links
          LI(l,i), LJ(l,j);

Parameters
          a(j)    accessibility
          C(j)    Capacity of Kindergartens
          ch      Capacity for handicapped children
          d(l)  distance
          da(i)   distance average
          h(i)    handicapped children
          p(l)  preferences
          s(l)  siblings;


Binary Variables
          x(l)  1 if child i is allocated to kindergarten j;

Free Variables
          ZFW     Zielfunktionswert;

*----- Iclude -----
$include ...



da(i) = sum(l$LI(l,i), d(l)) / card(j);

*----- Deklaration -----
Equations
         ZF              objective function
         Zuordnung       every child is assigned to one kindergarten
         Kapa            the capacity of the kindergarten must be maintained
         Behin           handicapped children are only assigned to suitable kindergartens;


ZF..               ZFW =E= sum(l, x(l) * (p(l)/s(l)) * (d(l)/da(i)));

Zuordnung(i)..     sum(l$LI(l,i), x(l)) =E= 1;

Kapa(j)..          sum(l$LJ(l,j), x(l) * (1 - h(i))) + sum(l$LJ(l,j), x(l) * h(i) * ch) =L= C(j);

Behin(i,j)..       x(l) * h(i) =L= a(j);



Model KiGaOpt /all/;

Solve KiGaOpt using MIP minimizing ZFW;

display x.l;

我的包含文件如下所示:

Sets
         i       /i1*i5/
         j       /j1*j2/
         l       /l1*l10/;




LI(l,i) = no;
LJ(l,j) = no;

LI( 'l1', 'i1') = yes;
LJ( 'l1', 'j1') = yes;

LI( 'l2', 'i1') = yes;
LJ( 'l2', 'j2') = yes;

LI( 'l3', 'i2') = yes;
LJ( 'l3', 'j1') = yes;

LI( 'l4', 'i2') = yes;
LJ( 'l4', 'j2') = yes;

LI( 'l5', 'i3') = yes;
LJ( 'l5', 'j1') = yes;

LI( 'l6', 'i3') = yes;
LJ( 'l6', 'j2') = yes;

LI( 'l7', 'i4') = yes;
LJ( 'l7', 'j1') = yes;

LI( 'l8', 'i4') = yes;
LJ( 'l8', 'j2') = yes;

LI( 'l9', 'i5') = yes;
LJ( 'l9', 'j1') = yes;

LI( 'l10', 'i5') = yes;
LJ( 'l10', 'j2') = yes;



Parameters


         a(j)
                /j1      1
                 j2      0/

         h(i)
                /i1      1
                 i2      0
                 i3      0
                 i4      0
                 i5      1/

         C(j)
                /j1      100
                 j2      100/

         ch      /2/;

Table p(i,j)
         j1      j2
i1       10      1
i2       10      1
i3       10      1
i4       10      1
i5       10      1       ;

Table d(i,j)
         j1      j2
i1       1       4
i2       2       1
i3       1       1
i4       1       2
i5       2       10.2    ;

Table s(i,j)
         j1      j2
i1       5       1
i2       1       1
i3       1       1
i4       1       1
i5       1       1       ;

谁能帮我重新安排我的模型和我的包含数据?

谢谢!

如果我 运行 你的模型,我得到的第一个错误是关于 naming/declaration 你的主模型和包含文件之间的冲突。例如,在你的主模型中你有

Parameters
          ...
          d(l)  distance
          ...
          p(l)  preferences
          s(l)  siblings;

然后在包含文件中我看到

Table p(i,j)
... ;

Table d(i,j)
... ;

Table s(i,j)
... ;

不同的参数列表不能有相同的符号名称(错误消息中也提到:“**** 184 Domain list redefined”),因此这是您首先要解决的问题。之后可以查看如何进行。

祝你好运, 卢茨

这是我的新包含文件。我试图将它包含在上面的模型代码中。

Sets
     i       /i1*i5/
     j       /j1*j2/
     l       /l1*l10/;



LI(l,i) = no;
LJ(l,j) = no;

LI( 'l1', 'i1') = yes;
LJ( 'l1', 'j1') = yes;

LI( 'l2', 'i1') = yes;
LJ( 'l2', 'j2') = yes;

LI( 'l3', 'i2') = yes;
LJ( 'l3', 'j1') = yes;

LI( 'l4', 'i2') = yes;
LJ( 'l4', 'j2') = yes;

LI( 'l5', 'i3') = yes;
LJ( 'l5', 'j1') = yes;

LI( 'l6', 'i3') = yes;
LJ( 'l6', 'j2') = yes;

LI( 'l7', 'i4') = yes;
LJ( 'l7', 'j1') = yes;

LI( 'l8', 'i4') = yes;
LJ( 'l8', 'j2') = yes;

LI( 'l9', 'i5') = yes;
LJ( 'l9', 'j1') = yes;

LI( 'l10', 'i5') = yes;
LJ( 'l10', 'j2') = yes;



Parameters


     a(j)
            /j1      1
             j2      0/

     h(i)
            /i1      1
             i2      0
             i3      0
             i4      0
             i5      1/

     C(j)
            /j1      100
             j2      100/

     ch      /2/

      p(l)   /l1     10
              l2     10
              l3     10
              l4     10
              l5     10
              l6     1
              l7     1
              l8     1
              l9     1
              l10    1/

      d(l)   /l1     1
              l2     2
              l3     1
              l4     1
              l5     2
              l6     4
              l7     1
              l8     1
              l9     2
              l10    10.2/

      s(l)   /l1     5
              l2     1
              l3     1
              l4     1
              l5     1
              l6     1
              l7     1
              l8     1
              l9     1
              l10    1/;

我不完全明白,你为什么选择 LI/LJ 方法,但你实际上应该在你的方程中使用这些映射来控制 i 和 j(这些通常是不受控制的)。因此,按以下方式更改方程式可以消除所有编译错误并求解模型:

ZF..               ZFW =E= sum(LI(l,i), x(l) * (p(l)/s(l)) * (d(l)/da(i)));

Zuordnung(i)..     sum(l$LI(l,i), x(l)) =E= 1;

Kapa(j)..          sum(LI(l,i)$LJ(l,j), x(l) * (1 - h(i))) + sum(LI(l,i)$LJ(l,j), x(l) * h(i) * ch) =L= C(j);

Behin(l)..         x(l) *sum(LI(l,i),h(i)) =L= sum(LJ(l,j),a(j));

此致, 卢茨

这是我的模型:

 Sets
      i       Child
      j       Kindergarten
      l       Links
      LI(l,i), LJ(l,j);

 Parameters
      a(j)  accessibility
      C(j)  Capacity of Kindergartens
      ch    Capacity for handicapped children
      d(l)  distance
      da(i) distance average
      h(i)  handicapped children
      p(l)  preferences
      s(l)  siblings;


 Binary Variables
      x(l)  1 if child i is allocated to kindergarten j;

 Free Variables
      ZFW     objective function value;

 *----- Iclude -----
 $include  



 da(i) = sum(l$LI(l,i), d(l)) / card(j);

 *----- Deklaration -----
 Equations
     ZF              objective function
     Zuordnung       every child is assigned to one kindergarten
     Kapa            the capacity of the kindergarten must be maintained
     Behin           handicapped children are only assigned to suitable kindergartens
     Inklus          equal distribution of handicapped children;


 ZF..               ZFW =E= sum(LI(l,i), x(l) * (p(l)/s(l)) * (d(l)/da(i)));

 Zuordnung(i)..     sum(l$LI(l,i), x(l)) =E= 1;

 Kapa(j)..          sum(LI(l,i)$LJ(l,j), x(l) * (1 - h(i))) + sum(LI(l,i)$LJ(l,j), x(l) * h(i) * ch) =L= C(j);

 Behin(l)..         x(l) *sum(LI(l,i),h(i)) =L= sum(LJ(l,j),a(j))

 Inklus(j)..        sum(i, x(i,j)) =L= (card(h)/card(a) +1) * (1+TI) ;



 Model KiGaOpt /all/;

 Solve KiGaOpt using MIP minimizing ZFW;

 display x.l;

这是我的包含文件:

 *Instanzen

 Sets
     i       /i1*i5/
     j       /j1*j2/
     l       /l1*l10/;



 LI(l,i) = no;
 LJ(l,j) = no;

 LI( 'l1', 'i1') = yes;
 LJ( 'l1', 'j1') = yes;

 LI( 'l2', 'i1') = yes;
 LJ( 'l2', 'j2') = yes;

 LI( 'l3', 'i2') = yes;
 LJ( 'l3', 'j1') = yes;

 LI( 'l4', 'i2') = yes;
 LJ( 'l4', 'j2') = yes;

 LI( 'l5', 'i3') = yes;
 LJ( 'l5', 'j1') = yes;

 LI( 'l6', 'i3') = yes;
 LJ( 'l6', 'j2') = yes;

 LI( 'l7', 'i4') = yes;
 LJ( 'l7', 'j1') = yes;

 LI( 'l8', 'i4') = yes;
 LJ( 'l8', 'j2') = yes;

 LI( 'l9', 'i5') = yes;
 LJ( 'l9', 'j1') = yes;

 LI( 'l10', 'i5') = yes;
 LJ( 'l10', 'j2') = yes;



 Parameters


      a(j)
            /j1      1
             j2      0/

      h(i)
            /i1      1
             i2      0
             i3      0
             i4      0
             i5      1/

      C(j)
            /j1      100
             j2      100/

      ch      /2/

      p(l)   /l1     10
              l2     10
              l3     10
              l4     10
              l5     10
              l6     1
              l7     1
              l8     1
              l9     1
              l10    1/

      d(l)   /l1     1
              l2     2
              l3     1
              l4     1
              l5     2
              l6     4
              l7     1
              l8     1
              l9     2
              l10    10.2/

      s(l)   /l1     5
              l2     1
              l3     1
              l4     1
              l5     1
              l6     1
              l7     1
              l8     1
              l9     1
              l10    1/

      TI     /0.5/;

非常感谢您的帮助!

此致