Оптимизация в 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 Перечень доменов переопределен"), поэтому это первое, что вам нужно решить. После этого можно проверить, как поступить.
Удачи лутц