Оптимизация в GAMS

У меня проблема с моим GAMS-кодом и реализацией GAMS-кода в Ruby. Я знаю, что GAMS не самая популярная программа, но, возможно, кто-то может мне помочь. У меня есть модель, где я стараюсь оптимально распределить детей в детские сады. Это базовый пример кода:

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) вместо циклов для связи между i и j. Я знаю, что я должен заменить все я и j в зависимости от l. Но каждый раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке. Я записал это в эту форму, где я заменял каждый раз, когда параметр зависит от 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       ;

Может ли кто-нибудь помочь мне переставить мою модель и мои включаемые данные?

Спасибо!

4 ответа

Решение

Я не совсем понимаю, почему вы выбрали подход 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       /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/;

Это моя модель:

 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/;

Большое спасибо за Вашу помощь!

С наилучшими пожеланиями

Если я запускаю вашу модель, первые ошибки, которые я получаю, касаются конфликтов имен / объявлений между вашей основной моделью и включаемым файлом. Например, у вас основная модель у вас есть

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

И тогда во включаемом файле я вижу

Table p(i,j)
... ;

Table d(i,j)
... ;

Table s(i,j)
... ;

Вы не можете иметь одно и то же имя символа с разными списками аргументов (что также упоминается в сообщении об ошибке: "**** 184 Перечень доменов переопределен"), поэтому это первое, что вам нужно решить. После этого можно проверить, как поступить.

Удачи лутц

Другие вопросы по тегам